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