我想制作一个宏:
(define-syntax MyMacro
(syntax-rules ()
((MyMacro a b) (cons a b))
)
)
(display (MyMacro + (list 1 2 3 4)))
我得到了,
#<subr +> 1 2 3 4)
但是,我真正想要的是1 2 3 4的总和。
我该如何解决这个问题?感谢。
更新
其实我的问题是关于meep:
我想使用一个功能&#34; at-every&#34; (每个arg1函数......)。
我定义了一个使用&#34; in-point&#34;功能
(define (makeBzSeries n)
(in-point
(vector3
(- (- (/ sx 2) (/ conThick 2)) (* obserR (cos (nToTheta n))))
(* obserR (sin (nToTheta n)))
0
)
(to-appended
(string-append "bz" (number->string n) )
output-bfield-z))
)
我想要的是
(at-every 2 (makeBzSeries 0) (makeBzSeries 1) ... (makeBzSeries 600))
我尝试使用apply和map,但是(makeBzSeries n)是一个过程而不是值。有什么办法可以解决吗?谢谢。
答案 0 :(得分:0)
语法规则中的模式语法以匹配a
== +
和b
== (list 1 2 3 4)
匹配的方式工作,因此:
(define lst (list 1 2 3 4))
(MyMacro + lst) ; ==>
(cons + lst)
这在代码运行之前发生。愚蠢的想法是要知道你的宏只会看到作为代码传递的内容。在上面的示例中,lst
是宏与之后评估的数据有关的数据。所以想象一下你只想要一个文字版本:
(define-syntax my-macro
(syntax-rules ()
((my-macro function (arg ...)) (function arg ...))
((my-macro . rest) (error "invalid use of my-macro"))))
(my-macro + (1 2 3 4)) ; ==>
(+ 1 2 3 4) ; ==> 10
这不适用于lst
:
(my-macro + lst) ; ==> "Invalid use of my-macro"
(my-macro + (list 1 2 3 4)) ; ==> complains about function list is not a number
请注意,您有一个名为apply
的功能可以执行您想要的操作:
(apply + (list 1 2 3 4)) ; ==> 10