理解scheme的let宏定义 - fun - fun
理解scheme的let宏定义
abelard
posted @ 2012年6月28日 17:06
in 程序语言
, 2893 阅读
在《The Scheme Programming Language Fourth Edition》的 Section 2.5. Lambda Expressions中描述了let的通用表示为:
(let ((var expr) ...) body1 body2 ...)
且说明了,它的lambda等价形式为:
((lambda (var ...) body1 body2 ...) expr ...)
那就意味着任何let表达式,都可以翻译为lambda表达式:第一个简单例子如下:
(let ([x 'a]) (cons x x)) => ((lambda (x) (cons x x)) 'a)
它们的结果都是: (a . a)
翻译一个复杂一点的例子:
(let ([double (lambda (x) (+ x x))])
(list (double (* 3 4))
(double (/ 99 11))
(double (- 2 7)))) =>
> ((lambda (double)
(list (double (* 3 4))
(double (/ 99 11))
(double (- 2 7))))
(lambda (x) (+ x x)))
结果都是 (24 18 -10)
有了这些直观的认识,再来看在scheme中let宏定义,就会不是那么难了:
(define-syntax let
(syntax-rules ()
[(_ ((x e) ...) b1 b2 ...)
((lambda (x ...) b1 b2 ...) e ...)]))
2024年1月16日 17:22
including me. Keep doing what you are doing – can’r wait to read more posts.