2013-01-13 28 views
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

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

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

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

+1

确实!当我第一次看到第一个声明时,我明白它是一个函数声明。一个认为它是一个变量声明持有拉姆达没有发生在我身上。谢谢。 – JAM

1

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

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

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

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