Rac*_*oob 3 macros scheme expansion racket
在链接http://www.ccs.neu.edu/home/ryanc/macro-stepper/tutorial.html上有关于使用宏步进器的说明.
但是,当我要尝试它时,我无法在非零的定义中得到myor的第二次扩展?功能,只有第一个.另外,我没有按钮"上一学期"和"下一学期".
所以我的问题是:我如何配置宏步进器以获得第二次扩展,就像在教程中一样?
我假设您的源程序看起来像这样:
#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)))
Run Code Online (Sandbox Code Playgroud)
短篇小说:暂时使用语法大小写而不是语法规则 ; 似乎有一些与宏步进器和语法规则相关的错误.我已经向Racket开发人员发送了一个错误报告,希望很快就会修复.上述程序的语法案例版本如下所示.
#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)))
Run Code Online (Sandbox Code Playgroud)
以下是较长的故事......
当我在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)))))))
Run Code Online (Sandbox Code Playgroud)
看起来不对劲.它只展示了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)))))))
Run Code Online (Sandbox Code Playgroud)
啊.好的,我可以确认我看到了你在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)))))))
Run Code Online (Sandbox Code Playgroud)
我将编写一个错误报告并将其发送给Racket开发人员.
如果使用syntax-case编写宏,而不是语法规则,那么使用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)))
Run Code Online (Sandbox Code Playgroud)
当我单步执行此操作时,它似乎工作得更好.因此无论触发错误,它似乎都是与Macro Stepper和语法规则的一些交互.因此,请尝试使用syntax-case.