3

考虑 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

两者似乎产生相同的结果。

这些函数声明之间有什么功能上的区别吗?在某些情况下是否应该优先选择一个?

4

2 回答 2

4

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

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

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

于 2013-01-13T17:19:10.860 回答
1

sepp2k 是绝对正确的,因为您定义的两个过程是相同的。在像这样的简单程序定义中,要么是正确的,要么归结为偏好问题。

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

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

(counter) ;=> 1
(counter) ;=> 2
(counter) ;=> 3
于 2013-01-14T18:00:50.277 回答