如何将 let* 表示为 lambda 表达式(不是常规 let)

Posted

技术标签:

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

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

【问题讨论】:

看看这个:***.com/questions/15003518/… 【参考方案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>)

【讨论】:

以上是关于如何将 let* 表示为 lambda 表达式(不是常规 let)的主要内容,如果未能解决你的问题,请参考以下文章

在 Scheme / Racket 中 let 的 lambda 定义是啥? [复制]

计划中的 lambda 有啥意义?

方案:从 Let 转换为 Lambda

在 emacs lisp 中使用 let 和 flet

将多级 for 循环转换为 linq 或 lambda 表达式

Lambda表达式介绍