【问题标题】: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))。这里到底发生了什么?

【问题讨论】:

  • @Mechanicalsnail:你的意思是this post?还没看过,谢谢!

标签: 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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多