Scheme:构成一个在宏中列出的函数

时间:2016-10-24 14:39:13

标签: scheme

我想制作一个宏:

(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)是一个过程而不是值。有什么办法可以解决吗?谢谢。

1 个答案:

答案 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