1

在方案中,为什么会这样:

(define foo
  (lambda (x)
    42))

被认为比这更好的风格:

(define (foo x)
  42)

是否有任何理由偏爱其中一个?

4

4 回答 4

4

我不认为这被认为是更好的风格,第一个是多余的。真正的问题是您是定义命名函数foo还是仅使用它lambda。如果您已经决定创建一个命名函数foo,那么我不明白您为什么要放入其中lambdalambda使您不必单独命名和定义您创建的每个小函数,所以这才是真正的决定所在:这个函数是否足够重要,可以单独定义和命名。

于 2010-08-05T20:44:12.633 回答
0

您所显示的内容等同于 Javascript 中的内容:

var foo = function(x) {42;}

对比

function foo(x) {
  42;
}

后者是前者的语法糖。第一种样式是一般形式,后者是定义函数的快捷方式。

至于风格,我不知道为什么前者会更受欢迎。它更长,需要更多的嵌套。

于 2010-08-05T20:49:59.423 回答
0

如果风格是偏好的另一个词,那么我同意前者是一种更好的风格。它直截了当地说,“foo 是 x 的函数”。那里很难出错。在您的第二个示例中,“defun”样式的参数是您以您调用它的方式定义它。

它与在 C 中声明指针变量时放置 * 的位置是 lisp 等效的。没有任何意义:选择您喜欢的,或者您正在使用的组已经决定的任何内容。没有人会误解你。

于 2010-08-05T20:50:21.373 回答
0

这是因为

(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))

是可读的,记住和理解它并不需要花那么多钱,所以我不介意把它放在计划中。

于 2010-08-07T12:12:53.943 回答