`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)]))
(这个宏可能有问题:我刚输入。)
我是 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)]))
(这个宏可能有问题:我刚输入。)