Macros DrRacket中的宏步进器

Macros DrRacket中的宏步进器,macros,scheme,racket,expansion,Macros,Scheme,Racket,Expansion,链接上有使用宏步进器的说明 然而,当我要尝试它时,我不能在非零的定义中得到myor的第二个展开式?功能,只有第一个。而且,上学期和下学期我都没有按钮 所以我的问题是:我必须如何配置宏步进器以获得第二次扩展,就像在教程中一样?它对我有效,无需做任何额外的操作。尝试使用最新版本的Racket,同时尝试从菜单中选择其他语言,并确保为所选语言选择了调试。我假设您的源程序如下所示: #lang racket (define-syntax myor (syntax-rules () [(myor

链接上有使用宏步进器的说明

然而,当我要尝试它时,我不能在非零的定义中得到myor的第二个展开式?功能,只有第一个。而且,上学期和下学期我都没有按钮


所以我的问题是:我必须如何配置宏步进器以获得第二次扩展,就像在教程中一样?

它对我有效,无需做任何额外的操作。尝试使用最新版本的Racket,同时尝试从菜单中选择其他语言,并确保为所选语言选择了调试。

我假设您的源程序如下所示:

#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)))
短篇故事:暂时使用语法大小写而不是语法规则;似乎存在一些与宏步进器和语法规则相关的错误。我已经向球拍开发者发送了一封邮件,希望这封邮件很快就能修复。上述程序的语法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的用法。非常奇怪

让我们看看球拍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中看到的相同的问题,以及预发布

这个bug似乎与宏隐藏特性的行为有关,当宏隐藏特性设置为标准时,它试图不让您完全被扩展淹没。如果将其设置为Disabled(禁用),您将看到宏调试器将显示完整的、未经修饰的扩展,并且它确实包括我们希望看到的扩展:

(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)))))))
我会写一封信给球拍开发者

如果使用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)))

当我通过这一步,它似乎工作得更好。因此,无论触发bug的是什么,它似乎都是与宏步进器和语法规则的一些交互作用。因此,请尝试改用语法大小写。

我正在Windows 7上运行DrRacket 5.2,语言是lang racket。这里的屏幕截图:@RacketNoob:看起来您正在尝试单步执行模块扩展,而不是宏扩展。很抱歉,无论我做什么,我都无法在第一次单击后获得myor button step->的第二次扩展。有人能详细地一步一步地说明如何完成所有宏扩展步骤吗?你可能想试试racket freenode irc频道。这种问题会从StackOverflow没有提供的来回对话中受益。是的,Dan,我知道。但是,不幸的是,我不能在那里提问,因为我被勒克用户组织Shriram Krishnamurthi禁止,我恨我,因为我批评了他们的网络框架。@Greg H:是的,我非常感谢dyoo,我通过投票支持他的回答表达了这一点。我不知道如何将他的答案标记为已接受。找不到那个按钮。在向上/向下投票按钮后,你看到复选标记的轮廓了吗?如果你点击它,它将变成纯绿色,你已经接受了答案。酷。如果答案可以接受,请将此问题标记为已回答,以便将其从未回答列表中删除。