使用和不使用lambda来定义方案函数是有区别的

时间:2013-01-13 17:15:26

标签: lambda scheme

考虑2个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 个答案:

答案 0 :(得分:4)

这两个定义之间没有区别 - 前者是后者的语法糖。

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

介绍性文本经常使用后者来明确命名函数只是一个持有lambda的变量 - 这在使用第一个变体时并不是那么清楚。

答案 1 :(得分:1)

sepp2k绝对正确,因为您定义的两个过程是相同的。在这样简单的程序中,这样的定义是正确的,这取决于偏好。

使用显式lambda语句确实有意义的一种情况是,如果您需要跟踪过程中的某种状态。例如,我们可以制作一个这样的计数器:

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

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