Scheme 为什么模式变量也在宏扩展中重命名?
在阅读Dybvig的论文Scheme中的语法抽象时,我注意到该算法还重命名了模式变量。所以这意味着模式变量可能导致捕获。但我不知道在什么情况下他们会被抓获?有人能告诉我吗?宏可以使用模式扩展为宏定义。模式变量和普通变量一样具有词法作用域,因此它们也需要重命名 宏扩展为宏定义的示例Scheme 为什么模式变量也在宏扩展中重命名?,scheme,racket,Scheme,Racket,在阅读Dybvig的论文Scheme中的语法抽象时,我注意到该算法还重命名了模式变量。所以这意味着模式变量可能导致捕获。但我不知道在什么情况下他们会被抓获?有人能告诉我吗?宏可以使用模式扩展为宏定义。模式变量和普通变量一样具有词法作用域,因此它们也需要重命名 宏扩展为宏定义的示例 #lang racket (define-syntax (define-get/put-id stx) (syntax-case stx () [(_ id get put!) #'(define
#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
你能举个例子吗?我加了一个例子。谢谢。但一个比显示捕获是如何发生的更简单的示例更有帮助。另外,
(id a(……)
的情况也不起作用。像(时钟1 2 3)
这样的调用会导致错误。