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

时间:2013-05-22 17:54:56

标签: lambda functional-programming scheme sicp let

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

2 个答案:

答案 0 :(得分:5)

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

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

等同于:

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

答案 1 :(得分:4)

由于您不想知道“常规”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>)