参数的不同处理:lambdas与Scheme中的defines

参数的不同处理: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

我有两个结构,我希望在功能上是相同的,但它们不是,我不知道为什么

使用define 使用lambda 在这种情况下,双方都接受。为了使它们的行为相同,我可以这样构造lambda:

((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)