我假设您的源程序看起来像这样:
#lang racket
(define-syntax myor
(syntax-rules ()
[(myor e) e]
[(myor e1 . es)
(let ([r e1]) (if r r (myor . es)))]))
(define (nonzero? r)
(myor (negative? r)
(positive? r)))
小故事:暂时使用 syntax-case 而不是 syntax-rules;似乎有一些与宏步进器和语法规则相关的错误。我已将bug report 发送给 Racket 开发人员,因此希望这将很快得到解决。上述程序的 syntax-case 版本如下所示。
#lang racket
(define-syntax (myor stx)
(syntax-case stx ()
[(_ e) #'e]
[(_ e1 . es)
#'(let ([r e1]) (if r r (myor . es)))]))
(define (nonzero? r)
(myor (negative? r)
(positive? r)))
下面是更长的故事......
当我在 5.2.1 的预发布版本下运行您的程序时,我在宏步进器中看到以下内容,其中宏隐藏设置为“标准”:
(module anonymous-module racket
(#%module-begin
(define-syntax myor
(syntax-rules () [(myor e) e] [(myor e1 . es) (let ([r e1]) (if r r (myor . es)))]))
(define (nonzero? r)
(let:26 ([r:26 (negative? r)]) (if:26 r:26 r:26 (myor:26 (positive? r)))))))
看起来不对。它仅将 myor 的一种用法扩展到 if 的用法。很奇怪!
让我们看看在 Racket 5.2 下是什么样子的......
(module anonymous-module racket
(#%module-begin
(define-syntax myor
(syntax-rules () [(myor e) e] [(myor e1 . es) (let ([r e1]) (if r r (myor . es)))]))
(define (nonzero? r) (let ([r (negative? r)]) (if r r (myor (positive? r)))))))
啊。好的,我可以确认我看到了与您在 Racket 5.2 以及预发布版本中看到的相同的问题。
该错误似乎与“宏隐藏”功能的行为有关,当它设置为标准时,它会尽量不让您不知所措。如果您将其设置为“已禁用”,您将看到宏调试器将以其完整、朴实的荣耀显示扩展,并且它确实包含我们期望看到的扩展:
(module anonymous-module racket
(#%module-begin
(define-syntaxes (myor)
(lambda (x)
; ... I'm omitting the content here: it's way too long.
))
(define-values:20 (nonzero?)
(lambda:21 (r) (let-values:22 (((r) (#%app:23 negative? r))) (if r r (#%app:24 positive? r)))))))
我会写一个bug report 并将其发送给 Racket 开发人员。
如果您使用 syntax-case 编写宏,而不是 syntax-rules,那么它似乎更适合使用 Macro Stepper。
#lang racket
(define-syntax (myor stx)
(syntax-case stx ()
[(_ e) #'e]
[(_ e1 . es)
#'(let ([r e1]) (if r r (myor . es)))]))
(define (nonzero? r)
(myor (negative? r)
(positive? r)))
当我逐步完成时,它似乎工作得更好。所以无论是什么触发了这个错误,它似乎是与宏步进器和 syntax-rules 的一些交互。因此,请尝试改用 syntax-case。