5

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

4

2 回答 2

5

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

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

相当于这个:

((lambda (a)
   ((lambda (b)
      (+ a b))
    (+ 10 a)))
 10)
于 2013-05-22T18:03:23.110 回答
4

由于您对 'regular' 不感兴趣let,因此如果 alet*可以转换为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>)
于 2013-05-22T21:01:38.623 回答