用于扩展代码的球拍宏

时间:2016-01-20 17:19:46

标签: macros pattern-matching racket define-syntax

我希望能写下来:

(nota E2 82)

而不是:

(define E2
  (network ()
           [sunet <= sine-wave 82]
           [out = (+ sunet)]))

我知道我可以使用宏来做到这一点,并尝试写这个:

(define-syntax (nota stx)
  (syntax-case stx ()
    [(nota x) #'(network ()
                         [sunet <= sine-wave x]
                         [out = (+ sunet)])]))

但是我收到了这个错误:

nota: bad syntax in: (nota E2 82)

2 个答案:

答案 0 :(得分:5)

最简单的解决方案是

(define-syntax-rule (nota x y)
  (define x
    (network ()
             [sunet <= sine-wave y]
             [out = (+ sunet)])))

答案 1 :(得分:3)

好的,那太糟糕了。你真的不应该写这个宏;应该有一个向网络提供固定输入的表格。

事实上,有。但是......它没有记录,也没有很好的命名。它目前被称为fixed-inputs,但我要将其重命名为network-const,并将其记录下来。

感谢您提示我!

约翰