用于扩展代码的球拍宏

The*_*rza 4 macros define-syntax pattern-matching racket

我希望能够写:

(nota E2 82)
Run Code Online (Sandbox Code Playgroud)

代替:

(define E2
  (network ()
           [sunet <= sine-wave 82]
           [out = (+ sunet)]))
Run Code Online (Sandbox Code Playgroud)

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

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

但我得到这个错误:

nota: bad syntax in: (nota E2 82)
Run Code Online (Sandbox Code Playgroud)

use*_*lpa 5

最简单的解决方案是

(define-syntax-rule (nota x y)
  (define x
    (network ()
             [sunet <= sine-wave y]
             [out = (+ sunet)])))
Run Code Online (Sandbox Code Playgroud)