【问题标题】:Racket macro for expanding code用于扩展代码的球拍宏
【发布时间】:2016-04-26 16:14:22
【问题描述】:

我希望能够写作:

(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了吗?
  • 你得到“错误语法”错误的原因是因为(nota x) 表明你的宏只接受一个“参数”,但你给了它两个。正如@stchang 所提到的,您似乎想要添加一个额外的参数并将define 包含在您的扩展中。

标签: macros pattern-matching racket define-syntax


【解决方案1】:

最简单的解决方案是

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

【讨论】:

    【解决方案2】:

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

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

    感谢您在这方面提示我!

    约翰

    【讨论】:

    • 为了将来验证这个答案,你可以链接到文档吗? (以及当 Racket 的下一个版本发布时。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2016-06-06
    • 1970-01-01
    相关资源
    最近更新 更多