参数的不同处理:lambdas与Scheme中的defines
我有两个结构,我希望在功能上是相同的,但它们不是,我不知道为什么 使用define 使用lambda 在这种情况下,双方都接受。为了使它们的行为相同,我可以这样构造lambda:参数的不同处理:lambdas与Scheme中的defines,lambda,scheme,r5rs,chicken-scheme,Lambda,Scheme,R5rs,Chicken Scheme,我有两个结构,我希望在功能上是相同的,但它们不是,我不知道为什么 使用define 使用lambda 在这种情况下,双方都接受。为了使它们的行为相同,我可以这样构造lambda: ((lambda b (display b) (newline)) 3 4 5) => (3 4 5) (define (name . arguments) ..) 这是报表的形式参数定义中列出的有效构造之一。但如果我尝试将其与define一起使用,则会导致参数编号不匹配错误 (defi
((lambda b
(display b)
(newline))
3 4 5) => (3 4 5)
(define (name . arguments)
..)
这是报表的形式参数定义中列出的有效构造之一。但如果我尝试将其与define一起使用,则会导致参数编号不匹配错误
(define (x2 b)
(display b)
(newline))
(x2 3 4 5) => Error: bad argument count
我认为
(define(xy)y)
只是(define x(lambda(y)y))的语法糖。似乎只有在大多数情况下才是这样。有人能解释不同行为的基本原理吗?这些表达式表示具有固定算术的匿名过程:
(define (x y) y)
(define (x y z) z)
它们相当于:
(define x (lambda (y) y))
(define x (lambda (y z) z))
(define x (lambda y y))
但是,以这个过程为例,使用数量可变的参数:
(define (x . y) y)
它只相当于:
(define x (lambda (y) y))
(define x (lambda (y z) z))
(define x (lambda y y))
继续示例,此过程有一个强制参数,其他参数是可变的:
(define (x y . z) z)
其等效形式为:
(define x (lambda (y . z) z))
因此,隐式/显式使用lambda
来定义具有可变参数数的过程的语法有点不同,这就是本例中使用的点表示法
另外,像”(.b)
这样的语法是无效的,因为在这种情况下,点符号表示的是不正确的列表,即最后一个元素不是空列表的列表。另一方面,这是有效的:”(a.b)
。这解释了表达式(lambda(.x)x)
无效的原因;假设(lambda(x)x)
表示一个带有一个强制参数的匿名过程,我们剩下(lambda x)
来表示一个只有可变数量参数且没有强制参数的匿名过程
据我所知,之所以会出现这种情况,唯一的理由是按照惯例,可能是因为它更容易解析。(.arguments)
是无效语法。点表示一对中的两部分之间的间隔,这里没有第一部分。我确实明白你在这里指的是参数
,它不应该是一个列表
定义如下所示:
((lambda b
(display b)
(newline))
3 4 5) => (3 4 5)
(define (name . arguments)
..)
同:
(define name
(lambda arguments
..))
有一个参数的示例:
(define (name arg1 . arguments)
..)
变成
(define name
(lambda (arg1 . arguments)
..))
原因很简单:(cdr'(name.arguments));=>参数
和(cdr'(名称arg1.arguments));==>'(arg1.arguments)