【发布时间】:2019-12-23 10:40:10
【问题描述】:
我的目标是能够将宏应用到参数列表,就像 apply 原始过程将过程应用到参数列表一样。
该列表在应用宏时已经被评估,没有办法解决这个问题,这很好;我想知道是否有任何方法可以以编程方式将列表“拼接”到宏应用程序中(与unquote-splicing 具有相同的意义)。困难在于不能将宏标识符作为参数传递。
一个用例是
(apply and list)
相当于
(not (memq #f list))
查看列表中是否有#f。
最好是符合 R7RS 标准。
一种 hacky 方式是(建议 on reddit)
(eval (cons 'and list))
但这不符合 R7RS,因为 eval 必须采用环境参数,而且在我看来,标准并没有指定如何在调用 eval 时有效地获取环境。
另一个半解决方案如下,仅当列表直接作为带括号的值序列给出时才有效:
(syntax-rules ()
((_ identifier (val ...))
(identifier val ...)))
【问题讨论】:
标签: list macros scheme eval apply