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

Scheme 为什么模式变量也在宏扩展中重命名?,scheme,racket,Scheme,Racket,在阅读Dybvig的论文Scheme中的语法抽象时,我注意到该算法还重命名了模式变量。所以这意味着模式变量可能导致捕获。但我不知道在什么情况下他们会被抓获?有人能告诉我吗?宏可以使用模式扩展为宏定义。模式变量和普通变量一样具有词法作用域,因此它们也需要重命名 宏扩展为宏定义的示例 #lang racket (define-syntax (define-get/put-id stx) (syntax-case stx () [(_ id get put!) #'(define

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

宏可以使用模式扩展为宏定义。模式变量和普通变量一样具有词法作用域,因此它们也需要重命名

宏扩展为宏定义的示例

#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)
这样的调用会导致错误。