1

我是新来的计划。当我运行以下代码时

(define lst '(1))

(let ((func1 (lambda lst 
               (begin (display lst)
                      lst))))
  (begin (display lst) 
         (func1 lst)))

我得到了(1)((1))'((1)),这意味着 lst(1)在第四行调用时显示为,但是当将其发送到函数func1时,它变为((1)). 这里究竟发生了什么?

4

2 回答 2

3

(lambda Args E)意思是:将此函数的变长参数列表绑定到Args. 例如

(define f (lambda args `(got ,(length args) arguments)))
(display (f 'foo 'bar 'baz))

将打印(got 3 arguments)。如果将lambda表达式更改为

(lambda (lst) (begin (display lst) lst))
;;;     ^---^

然后该函数将打印并返回其单个参数。

于 2012-09-21T13:25:23.813 回答
2

在一个lambda表格中,当你写这个时:

(lambda x <body>)

...您声明这x是一个包含零个或多个元素的参数列表。另一方面,这是:

(lambda (x) <body>)

...说明这x是一个参数。在问题中,此代码(begina 中的正文部分不需要lambda):

((lambda lst (display lst) lst) '(1))

... 将显示并返回参数列表;如果我们通过'(1)它,它将评估为'((1)):一个带有单个元素的列表,恰好是一个列表。

您肯定打算这样做:

((lambda (lst) (display lst) lst) '(1))

...它将显示并返回它接收到的单个参数 - 如果传递'(1)上述表达式'(1),则将评估为参数本身。

于 2012-09-21T14:42:23.090 回答