为什么模式变量也在宏扩展中重命名?

时间:2014-04-14 10:22:17

标签: scheme racket

在阅读Dybvig的论文 Scheme 中的句法抽象时,我注意到该算法也重命名了模式变量。所以它意味着模式变量可能导致捕获。但我不知道他们会在什么情况下导致捕获?有人可以开导我吗?

1 个答案:

答案 0 :(得分:4)

宏可以使用模式扩展为宏定义。模式变量与正常变量一样具有词法范围,因此它们也需要重命名。

宏扩展到宏定义的示例。

#lang racket
(define-syntax (define-get/put-id stx)
  (syntax-case stx ()
    [(_ id get put!)
     #'(define-syntax id
         (syntax-id-rules (set!)
           [(set! id e) (put! e)]
           [(id a (... ...)) ((get) a (... ...))]
           [id (get)]))]))

(define id 0)
(set! id 42)
(define-get/put-id clock 
  (λ()  (displayln "Reading clock") id)
  (λ(x) (displayln "Setting clock") (set! id x) id))

clock
(set! clock 10)
clock

;;; Output
Reading clock
42
Setting clock
10
Reading clock
10