考虑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
两者似乎都产生了相同的结果。
这些函数声明之间是否存在功能差异?在某些情况下,是否应优先选择其他人?
答案 0 :(得分:4)
这两个定义之间没有区别 - 前者是后者的语法糖。
你喜欢哪一个是风格问题,但我的印象是前者通常是定义功能的首选方式,因为它更简洁,也许更具可读性。
介绍性文本经常使用后者来明确命名函数只是一个持有lambda的变量 - 这在使用第一个变体时并不是那么清楚。
答案 1 :(得分:1)
sepp2k绝对正确,因为您定义的两个过程是相同的。在这样简单的程序中,这样的定义是正确的,这取决于偏好。
使用显式lambda
语句确实有意义的一种情况是,如果您需要跟踪过程中的某种状态。例如,我们可以制作一个这样的计数器:
(define counter
(let ((count 0))
(lambda ()
(set! count (+ count 1))
count)))
(counter) ;=> 1
(counter) ;=> 2
(counter) ;=> 3