使用lambda和不使用lambda定义scheme函数有什么区别?

3

考虑两个Scheme函数

; Define function
(define (square n) (* n n ))
(square 12)
144

; Another way to define same function
(define square (lambda (n) (* n n)))
(square 12)
144

这两种方式似乎都可以产生相同的结果。

这两种函数声明方式之间是否有功能上的区别?在某些情况下,是否应该优先选择其中一种方式?

2个回答

4

这两种定义方式没有区别 - 前者只是后者的一种语法糖。

你更喜欢哪个是风格问题,但我的印象是前者通常是定义函数的首选方式,因为它更简洁,可能也更易读。

入门文本通常使用后者来明确指出命名函数只是一个持有lambda表达式的变量 - 当使用第一种变量时这一点并不那么清晰。


1
确实!当我第一次看到这个声明时,我理解它是一个函数声明。我没有想到它是一个包含 lambda 的变量声明。谢谢。 - James Raitsev

1

sepp2k 的说法是完全正确的,你定义的这两个过程是相同的。在像这样简单的过程定义中,任何一种方式都是正确的,只是取决于个人喜好。

有一种情况下使用显式的 lambda 语句是有意义的,那就是如果你需要在过程中跟踪某种状态。例如,我们可以像这样创建一个计数器:

(define counter
    (let ((count 0))
      (lambda ()
          (set! count (+ count 1))
          count)))

(counter) ;=> 1
(counter) ;=> 2
(counter) ;=> 3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接