用于扩展代码的 Racket 宏

Racket macro for expanding code

我希望能够写作:

(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)

最简单的解决方案是

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

好吧,这太糟糕了。你真的不需要写这个宏;应该有一种形式可以为网络提供固定输入。

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

感谢您就此提示我!

约翰