考虑这个问题。这里的基本问题是代码:
(progv '(op arg) '(1+ 1)
(eval '(op arg)))
这里的问题是将值progv
绑定到变量作为变量的not 。但是,这很明显,因为我们没有明确建议哪些值是函数。symbol-value
symbol-function
计划
因此,为了解决这个问题,我想到了手动将变量动态绑定到基于值的类型的值。如果值是,fboundp
那么它们应该绑定到symbol-function
变量的。一个限制,就是match-if
不能是macro
. 它必须是 a function
,因为它是由 a 调用的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
调用模式匹配器函数。
问题
问题是在函数中,它的所有参数都被评估了。因此bindings
,let
anddeclare
部分将被替换为 :
((v1 . val1)(v2 . val2)(v3 . val3))
not
'((v1 . val1)(v2 . val2)(v3 . val3))
所以,它被视为代码,而不是列表。
所以,我被困在这里。宏不会帮助我解决这个问题。
任何帮助表示赞赏。