`define` 有和没有 `lambda`

`define` with and without a `lambda`

我是 lisp/scheme 的初学者(如果是的话),遇到了以下两种在方案中“创建函数”的方法:

(define (square x) (* xx))

并且:

(define square (lambda (x) (* x x)))

这两者有什么区别?所有 versions/dialects 的 lisp 都支持这两个版本,还是一个比另一个更“通用”?

“所有 versions/dialects of lisp”是一个非常非常广泛的画笔。当然这里不适用。这就像在每个欧洲国家询问“你好,那里”是否是称呼某人的正确方式。它比“在每种语言中”更窄,但口齿不清。

但它们在我听说过的 Scheme 的所有方言中都有效(在我的类比中,在每个英语国家)。它们的意思完全一样。

Scheme 中,它们在受支持的地方相同:(define (x ...) ...)(define x (lambda (...) ...)) 相同。然而,它们在 Lisp 家族语言中肯定是不一样的,Lisp 家族语言包括大量的语言,可以追溯到 Scheme 发明之前很久。

但是,Scheme 标准具有必要非必要可选的概念语法:任何实现都必须支持基本语法,但允许实现不支持可选语法。在 R4RS, (define <variable> <expression>) is essential but (define (variable ...) ...) is not. In R5RS 中,这种区别似乎已经消失:这两种形式(我认为)现在都是必不可少的。

如果有任何实现不支持这两种形式,我会感到惊讶,除了非常小/微小的形式。

请注意,如果您的方案只有 (define <variable> <expression>) 版本,但它有一个宏系统,您也可以很容易地支持其他版本:

(define-syntax defyne
  (syntax-rules ()
    [(_ (name) form ...)
     (defyne name (lambda () form ...))]
    [(_ (name formal ...) form ...)
     (defyne name (lambda (formal ...) form ...))]
    [(_ (name . formal) form ...)
     (defyne name (lambda formal form ...))]
    [(_ name expression)
     (define name expression)]))

(这个宏可能有问题:我刚输入。)