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