【问题标题】:How to express let* as a lambda expression (not the regular let)如何将 let* 表示为 lambda 表达式(不是常规 let)
【发布时间】:2013-05-17 21:43:23
【问题描述】:

我有一个与方案相关的问题,我们如何将 let* 实现为 lambda 表达式。更准确地说,我不是想知道“常规”let,而是带 * 的 let 让我们在另一个中使用一个 let 表达式。

【问题讨论】:

标签: lambda functional-programming scheme sicp let


【解决方案1】:

let* 表单是一系列嵌套的lambdas。例如,这个:

(let* ((a 10)
       (b (+ 10 a)))
  (+ a b))

相当于这个:

((lambda (a)
   ((lambda (b)
      (+ a b))
    (+ 10 a)))
 10)

【讨论】:

  • 感谢您的回答,现在很有意义!
【解决方案2】:

既然您不知道“常规”let,如果let* 可以转换为let,那么您将得到答案。因此要知道:

(let* ((a ...) (b ...) (c ...)) body ...)

相当于:

(let ((a ...))
  (let ((b ...))
    (let ((c ...))
      body ...)))

(参见 R5RS,第 44 页,(define-syntax let* ...))。现在,鉴于此,并且知道:

  (let ((a ...)) body ...)

相当于:

  ((lambda (a) body ...) ...)

我上面展示的let* 的“扩展”变为:

  ((lambda (a)
     ((lambda (b)
        ((lambda (c)
           body ...)
          <c-init>))
      <b-init>))
   <a-init>)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2019-10-12
    • 2019-05-22
    • 2019-06-19
    • 2014-01-01
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多