如何将变量发送到方案中的函数?

时间:2012-09-21 13:19:03

标签: function variables scheme

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

(define lst '(1))

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

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

2 个答案:

答案 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),参数本身。