可以将宏应用于参数列表吗?

奥柳斯

我的目标是能够像应用原始过程将过程应用于参数列表一样,将宏应用于参数列表。

该列表将在应用宏时进行评估,没有办法解决,这很好。我想知道是否有任何办法以编程方式将列表“拼接”到宏应用程序中(与的含义相同unquote-splicing)。困难在于无法将宏标识符作为参数传递。

一种用例是

(apply and list)

相当于

(not (memq #f list))

看看是否有一个#fin列表。优选地,这将是符合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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章