【发布时间】:2017-06-23 11:54:23
【问题描述】:
考虑this 问题。这里的基本问题是代码:
(progv '(op arg) '(1+ 1)
(eval '(op arg)))
这里的问题是progv 将 value 绑定到 variable 作为变量的symbol-value 而不是symbol-function。但是,这很明显,因为我们没有明确建议哪些值是函数。
计划
所以,为了解决这个问题,我想到了手动将变量动态绑定到基于值类型的值。如果值是fboundp,那么它们应该绑定到变量的symbol-function。一个限制是 match-if 不能是 macro。它必须是function,因为它是由funcall 调用的。
宏:functioner:
(defmacro functioner (var val)
`(if (and (symbolp ',val)
(fboundp ',val))
(setf (symbol-function ',var) #',val)
(setf ,var ,val)))
函数:match-if:
(defun match-if (pattern input bindings)
(eval `(and (let ,(mapcar #'(lambda (x) (list (car x))) bindings)
(declare (special ,@ (mapcar #'car bindings)))
(loop for i in ',bindings
do (eval `(functioner ,(first i) ,(rest i))))
(eval (second (first ,pattern))))
(pat-match (rest ,pattern) ,input ,bindings))))
这里,let 部分以词法方式(假设)声明了所有变量。然后declare 声明它们special。然后functioner 恰当地绑定变量及其值。然后评估模式中的代码。如果代码部分为真,则仅调用模式匹配器函数pat-match。
问题
问题是在函数中,它的所有参数都被评估了。因此let 和declare 部分中的bindings 将被替换为:((v1 . val1)(v2 . val2)(v3 . val3))
不是'((v1 . val1)(v2 . val2)(v3 . val3))
因此,它被视为代码,而不是列表。
所以,我被困在这里。宏在这方面对我没有帮助。
任何帮助表示赞赏。
【问题讨论】:
标签: common-lisp eval backquote