在链接 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)))

小故事:暂时使用 syntax-case 而不是 语法规则 ;似乎有一些与宏步进器和语法规则相关的错误。我已经向 Racket 开发人员发送了 bug report,希望这会很快得到修复。上述程序的 语法案例 版本如下所示。
#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 的一种用途扩展为 如果 的用途。很奇怪!

让我们看看在 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 开发人员。

如果您使用 语法案例 编写宏,而不是 语法规则 ,它似乎与宏步进器一起工作得更好。
#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)))

当我逐步完成此操作时,它似乎工作得更好。因此,无论触发错误的是什么,似乎都是与宏步进器和 语法规则 的一些交互。所以尝试使用 语法案例 代替。

关于macros - DrRacket 中的宏步进器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8961762/

10-10 04:17