【问题标题】:How variables are sent to the functions in scheme?如何将变量发送到方案中的函数?
【发布时间】:2012-09-21 13:19:03
【问题描述】:
我是新来的计划。当我运行以下代码时
(define lst '(1))
(let ((func1 (lambda lst
(begin (display lst)
lst))))
(begin (display lst)
(func1 lst)))
我得到了(1)((1))'((1)),这意味着在第四行调用时lst显示为(1),但是当它发送到函数func1时,它变成了((1))。这里到底发生了什么?
【问题讨论】:
标签:
function
variables
scheme
【解决方案1】:
(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))
;;; ^---^
然后该函数将打印并返回其单个参数。
【解决方案2】:
在lambda 表单中,当您这样写时:
(lambda x <body>)
...您声明x 是具有零个或多个元素的参数的列表。另一方面,这是:
(lambda (x) <body>)
... 声明 x 是一个参数。在问题中,此代码(lambda 中的正文部分不需要begin):
((lambda lst (display lst) lst) '(1))
... 将显示并返回参数列表;如果我们通过'(1),它将评估为'((1)):一个带有单个元素的列表,恰好是一个列表。
您当然打算这样做:
((lambda (lst) (display lst) lst) '(1))
... 它将显示并返回它接收到的单个参数 - 如果传递 '(1),上述表达式将计算为参数本身 '(1)。