自定义 Let*

实现Let*语法的两种方式,主要目的是记录两种编程思路,在编写其他程序时应该也有所裨益。


(define-syntax my-let*
  (syntax-rules ()
    ((_ () bodys ...) (let () bodys ...))
    (
      (_ ((a1 v1)) bodys ...)
      (let ((a1 v1)) bodys ...)
    )
    (
      (_ ((a1 v1) (a2 v2) ...) bodys ...)
      (let ((a1 v1)) (my-let* ((a2 v2) ...) bodys ...))
    )
  )
)

注意,my-let*是可以递归使用的,以及**…**的用法。

(define-syntax my-let*
  (syntax-rules ()
    (
      (_ () bodys ...)
      (let () bodys ...)
    )
    (
      (_ ((a1 v1) ...) bodys ...)
      (let ()
       (define a1 v1) ...
       bodys ...
      )
    )
  )
)

这个实现方式与上面的不同,上面的是嵌套let,这里将直接按顺序define内部变量,代码更短。注意此处的**…**的用法。