我的目标是能够像应用原始过程将过程应用于参数列表一样,将宏应用于参数列表。
该列表将在应用宏时进行评估,没有办法解决,这很好。我想知道是否有任何办法以编程方式将列表“拼接”到宏应用程序中(与的含义相同unquote-splicing
)。困难在于无法将宏标识符作为参数传递。
一种用例是
(apply and list)
相当于
(not (memq #f list))
看看是否有一个#f
in列表。优选地,这将是符合R7RS的。
一种变种方式(如reddit所建议)
(eval (cons 'and list))
但这不符合R7RS,因为eval必须接受一个环境参数,而且在我看来,该标准未指定如何在调用eval时抢夺有效的环境。
另一半解决方案如下,它仅在列表直接作为括号括起来的值序列给出时才有效:
(syntax-rules ()
((_ identifier (val ...))
(identifier val ...)))
我会将其发布为我对自己的问题的部分答案,如果没有新消息弹出,我将在几天后接受。
下面的方法起作用,但是仅当要应用的宏包含在库中时。
(import (scheme base)
(scheme eval)
(scheme write))
(define (apply-macro mac args . libs)
(eval (cons mac args)
(apply environment libs)))
(define list '(#f #t #t #t))
(display (apply-macro 'and list '(scheme base))) ; => #f
(display (apply-macro 'and (cdr list) '(scheme base))) ; => #t
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句