【问题标题】:`define` with and without a `lambda`带有和不带有“lambda”的“定义”
【发布时间】:2021-06-28 01:22:11
【问题描述】:

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

(define (square x) (* xx))

还有:

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

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

【问题讨论】:

  • 一些lisp方言甚至没有define...
  • 没有 define 的 lisp 方言可能比使用 :-o 的 lisp 方言更多,但是所有方案方言都有它们。

标签: lambda scheme lisp racket


【解决方案1】:

Scheme 中,它们在都受支持的情况下是相同的:(define (x ...) ...)(define x (lambda (...) ...)) 相同。然而,在 Lisp 家族语言中它们肯定是不一样的,其中包括可以追溯到早在 Scheme 发明之前的各种语言。

然而,Scheme 标准有 essentialnon-essentialoptional 语法的概念:任何实现都必须支持基本语法,但实现是允许不支持可选语法。在R4RS 中,(define <variable> <expression>) 是必不可少的,但(define (variable ...) ...) 不是。在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)]))

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

【讨论】:

  • 澄清一下,(define <variable> <expression>) 版本意味着要定义一个函数(而不仅仅是像 a=5 这样的变量),您必须使用 lambda 语法,对吗?
  • @David542 define 定义一个变量。当您执行(+ a b) 时,有3 个变量,+ab。评估 + 并返回一个函数对象,与评估 (+ a b) 时应用的函数对象完全相同,当然该函数将检查两个评估参数是否都变为数字。如果您在本地定义 list 然后函数list 已被覆盖且不可用。例如。 (let ((list '(1 2 3))) (list 1 2)) 将给出 (1 2 3) 不是函数的错误。 (lambda ...) 计算为一个函数,因此如果没有糖,您需要 lambda 将变量绑定到函数。
  • @David542: 是的,如果你想让变量的值成为一个新函数,你需要使用lambda(或者当然是返回一个新函数的东西)。
【解决方案2】:

“lisp 的所有版本/方言”是一种非常非常广泛的画笔。当然它不适用于这里。这就像问“你好,那里”是否是在每个欧洲国家称呼某人的正确方式。它比“每种语言”都窄,但 lisps 变化很大。

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

【讨论】:

    猜你喜欢
    • 2021-03-06
    • 1970-01-01
    • 2014-03-23
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多