2016-01-20 63 views
4

拍微距我希望能够写:的扩大代码

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

你忘了'define'吗? – stchang

+2

你得到“坏语法”错误的原因是因为'(nota x)'表示你的宏只需要一个“参数”,但你已经给了它两个。正如@stchang提到的,它看起来像你想添加一个额外的参数,并在扩展中包含'define'。 –

回答

5

最简单的解决办法是

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

简洁优雅的解决方案!有用。谢谢! –

3

好吧,这只是可怕。你真的不需要写这个宏;应该有一种向网络提供固定输入的表格。

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

感谢您在此提示我!

约翰

+0

为了将来证明这个答案,你可以链接到文档吗? (当它发布的下一个版本的球拍发布。) –