我是计划的新手。当我运行以下代码时
(define lst '(1))
(let ((func1 (lambda lst
(begin (display lst)
lst))))
(begin (display lst)
(func1 lst)))
我得到了(1)((1))'((1))
,这意味着当在第四行调用时,lst显示为(1)
,但是当将其发送到函数func1
时,它变为((1))
。这到底发生了什么?
答案 0 :(得分:3)
(lambda Args E)
表示:将此函数的可变长度参数列表绑定到Args
。 E.g。
(define f (lambda args `(got ,(length args) arguments)))
(display (f 'foo 'bar 'baz))
将打印(got 3 arguments)
。如果您将lambda
表达式更改为
(lambda (lst) (begin (display lst) lst))
;;; ^---^
然后该函数将打印并返回其单个参数。
答案 1 :(得分:2)
以lambda
形式,当你写这个:
(lambda x <body>)
...您宣布x
是包含零个或多个元素的参数的列表。另一方面,这个:
(lambda (x) <body>)
...声明x
是一个参数。在问题中,此代码(begin
中的正文部分不需要lambda
):
((lambda lst (display lst) lst) '(1))
...将显示并返回参数列表;如果我们通过'(1)
,它将评估为'((1))
:一个列表,其中包含一个恰好是列表的单个元素。
当然,你打算这样做:
((lambda (lst) (display lst) lst) '(1))
...将显示并返回它收到的单个参数 - 如果传递'(1)
,上面的表达式将评估为'(1)
,参数本身。