Scheme 这是如何定义工作的?

Scheme 这是如何定义工作的?,scheme,Scheme,我有一个方案代码: (define (x . y) y) (x 1 2 3) 我知道这相当于: '(1 2 3) 但我不明白为什么 第一行代码是做什么的 谢谢。根据(最后一条),第一行(define(x.y)y)相当于(define x(lambda y)) 而(lambda y)是一个过程;调用时,所有参数都将存储在新分配的列表中。e、 g.list可以定义为(define list(lambda xs xs))。(请参见形式参数的第二种形式。) 所以(x123)等同于(列表123),它们

我有一个方案代码:

(define (x . y) y)
(x 1 2 3)
我知道这相当于:

'(1 2 3)
但我不明白为什么

第一行代码是做什么的

谢谢。

根据(最后一条),第一行
(define(x.y)y)
相当于
(define x(lambda y))

(lambda y)
是一个过程;调用时,所有参数都将存储在新分配的列表中。e、 g.
list
可以定义为
(define list(lambda xs xs))
。(请参见形式参数的第二种形式。)


所以
(x123)
等同于
(列表123)

它们是不等价的。(x 1 2 3)与(列表1 2 3)相同。你想要什么?R6RS是一个可读性很强的文档,里面有关于函数定义和参数的所有内容。感谢您的回答,我只是有一个疑问:为什么
(lambda y)
接受无限数量的参数?与
(lambda(y)y)
的区别是什么?(只接受一个参数)。我正在阅读r6rs标准,但我遗漏了一些东西。再次感谢。它接受无限数量的参数,因为当你说
x时。y
(lambda y)
您定义的列表不正确。因此,在该上下文中,
y
可以指单个元素或整个元素列表。这与定义
(lambda(y)y)
不同,因为在该上下文中,y是列表中的单个元素。
(lambda y)
的形式参数部分是
y
,而
(lambda(y)y)
的形式参数部分是
(y)
。接受无限数量参数的过程有时很有用,所以许多编程语言都支持它。在lisp中,有许多方法表示可变参数。CL使用特殊符号&例如rest。Scheme只使用了缺点:形式参数部分是一个成对的链(固定部分,可能是空的),以空列表结尾(不能再接受任何参数)或以符号结尾(接受无限数量的参数)。一些示例:
(ab)
(a.(b.'))
,它有固定的部分
a
b
并以空列表结束,因此
(lambda(ab)…
完全接受两个参数
(ab.c)
(a.(b.c))
,它有固定的部分
a
b
,以符号
c
结尾,所以
(lambda(ab.c)
接受N(N>=2)个参数,前两个绑定到
a
b
,其余绑定到
c
(lambda.y…)
是一个特例,它没有固定的部分。@Aslan986是的。还有更多的例子:
(定义f(lambda(a.b)b))
(f)=>错误
(f 0)=>(
(f 0 1)=>(1)
(f 0 1 2)=>(12)
(定义g(lambda a))/code>,
(g)(
(g=(g=>,
,<1)=>(g12)=>(12)