理解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 ...)]))

 

Avatar_small
seo service UK 说:
2024年1月16日 17:22

including me. Keep doing what you are doing – can’r wait to read more posts.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee