在方案中,为什么会这样:
(define foo
(lambda (x)
42))
被认为比这更好的风格:
(define (foo x)
42)
是否有任何理由偏爱其中一个?
在方案中,为什么会这样:
(define foo
(lambda (x)
42))
被认为比这更好的风格:
(define (foo x)
42)
是否有任何理由偏爱其中一个?
我不认为这被认为是更好的风格,第一个是多余的。真正的问题是您是定义命名函数foo
还是仅使用它lambda
。如果您已经决定创建一个命名函数foo
,那么我不明白您为什么要放入其中lambda
。 lambda
使您不必单独命名和定义您创建的每个小函数,所以这才是真正的决定所在:这个函数是否足够重要,可以单独定义和命名。
您所显示的内容等同于 Javascript 中的内容:
var foo = function(x) {42;}
对比
function foo(x) {
42;
}
后者是前者的语法糖。第一种样式是一般形式,后者是定义函数的快捷方式。
至于风格,我不知道为什么前者会更受欢迎。它更长,需要更多的嵌套。
如果风格是偏好的另一个词,那么我同意前者是一种更好的风格。它直截了当地说,“foo 是 x 的函数”。那里很难出错。在您的第二个示例中,“defun”样式的参数是您以您调用它的方式定义它。
它与在 C 中声明指针变量时放置 * 的位置是 lisp 等效的。没有任何意义:选择您喜欢的,或者您正在使用的组已经决定的任何内容。没有人会误解你。
这是因为
(define (foo x)
42)
为语言添加特殊形式。
1.
(define foo 45)
是一种特殊形式
2.
(lambda (x) (+ x 1)
是另一种特殊形式,所以:
(define foo (lambda (x) (+ x 1)))
除了上述2之外,没有添加其他特殊形式。
因此,为定义函数添加简写是一种语法糖。由于方案往往是极简主义的,因此语言没有必要添加比必要更多的特殊形式。现在我认为:
(define foo (x) (+ x 1))
是可读的,记住和理解它并不需要花那么多钱,所以我不介意把它放在计划中。