`定义`带和不带` lambda`

`定义`带和不带` lambda`,lambda,scheme,lisp,racket,Lambda,Scheme,Lisp,Racket,我是lisp/scheme的初学者,遇到了以下两种在scheme中创建函数的方法: (define (square x) (* xx)) 以及: 这两者有什么区别?这两个版本在所有版本/方言的lisp中都受支持吗?还是一个版本比另一个版本更通用?所有版本/方言的lisp都是一个非常广泛的工具。当然,这不适用于这里。这就像是问,在每个欧洲国家,是否都有正确的方式称呼某人。它比每种语言都窄,但lisps差别很大 但用我的比喻来说,它们都适用于我在所有英语国家听说过的所有方言。它们的意思完全相同。l

我是lisp/scheme的初学者,遇到了以下两种在scheme中创建函数的方法:

(define (square x) (* xx))
以及:


这两者有什么区别?这两个版本在所有版本/方言的lisp中都受支持吗?还是一个版本比另一个版本更通用?

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


但用我的比喻来说,它们都适用于我在所有英语国家听说过的所有方言。它们的意思完全相同。

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

但用我的比喻来说,它们都适用于我在所有英语国家听说过的所有方言。它们的意思完全相同。

在Scheme中,它们在支持它们的地方是相同的:定义x。。。与定义xλ相同。。。。然而,在Lisp族语言中,它们肯定是不同的,Lisp族语言包括了许多早在Scheme发明之前就存在的语言

然而,Scheme标准有基本语法和非基本语法或可选语法的概念:任何实现都必须支持基本语法,但允许实现不支持可选语法。在中,定义是必要的,但定义变量。。。事实并非如此。这种区别似乎已经消失了:我认为这两种形式现在都是必要的

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

请注意,如果您的方案只有define版本,但有一个宏系统,那么您也可以很容易地支持其他版本:

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

在Scheme中,它们在支持它们的地方是相同的:定义x。。。与定义xλ相同。。。。然而,在Lisp族语言中,它们肯定是不同的,Lisp族语言包括了许多早在Scheme发明之前就存在的语言

然而,Scheme标准有基本语法和非基本语法或可选语法的概念:任何实现都必须支持基本语法,但允许实现不支持可选语法。在中,定义是必要的,但定义变量。。。事实并非如此。这种区别似乎已经消失了:我认为这两种形式现在都是必要的

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

请注意,如果您的方案只有define版本,但有一个宏系统,那么您也可以很容易地支持其他版本:

(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方言甚至没有定义…没有定义的lisp方言可能比有定义的lisp方言更多:-o但是所有scheme方言都有它们。一些lisp方言甚至没有定义…没有定义的lisp方言可能比有定义的lisp方言更多:-o但是所有scheme方言都有只是为了澄清一下,定义版本意味着要定义一个函数而不仅仅是像a=5这样的变量,你必须使用lambda语法,对吗?@David542定义一个变量。当你定义+a b时,有3个变量,+,a和b。Evaluate+返回一个函数对象,该函数对象与计算+AB时应用的函数对象完全相同,当然,该函数将检查两个计算参数是否都变成了数字。如果您在本地定义了list,则函数列表将被覆盖且不可用。let list'1 2 3 list 1 2将给出一个错误,即1 2 3不是一个函数。拉姆达。。。计算为一个函数,因此在没有糖的情况下,您需要lambda将变量绑定到函数。@David542:是的,如果您希望变量的值成为一个新函数,您需要使用lambda或一些返回一个新函数的东西。我只想澄清一下,define版本意味着要定义一个函数而不仅仅是像a=5这样的变量,你必须使用lambda语法,对吗?@David542 define定义一个变量。当你定义+a b时,有3个变量,+、a和b。Evaluate+返回一个函数对象,该函数对象与计算+AB时应用的函数对象完全相同,当然,该函数将检查两个计算参数是否都变成了数字。如果您在本地定义了list,则函数列表将被覆盖且不可用。let list'1 2 3 list 1 2将给出一个错误,即1 2 3不是一个函数。拉姆达。。。计算为一个函数,因此在没有糖的情况下,需要lambda将变量绑定到函数。@David542:是的,如果 如果希望变量的值是一个新函数,则需要使用lambda或其他返回新函数的函数。