我有一个乘的函数,带有可变数量的参数。
(defun mult (&rest args) ...) ==> e.g. (multiply a b c)
我有一个查找表,每个给定的参数(a,b,c)中都有一个关联的数字。另一方面,每个数字又有一个关联的字母。 这些数字将相乘并返回结果。
问题: 尝试评估(乘以'a'b'c)效果很好。 尝试计算(乘以a b c)无效,因为变量是未绑定的。 不幸的是,呼叫以以下形式发出:(乘以a b c)。
它也可以是嵌套调用:(乘以a(乘以x y z)c)
查询表:
((a . 1) (x . 4) (y . 6) (z . 2) (c . 3) (res . 144))
我如何评估这样的东西?
答案 0 :(得分:2)
简短的回答:您不能。更长的答案:您可以采用其他方法。
函数调用的评估规则是:首先评估所有参数,然后评估函数调用。参数的评估没有关于运算符将是什么的任何信息。您无法神奇地更改此基本评估规则。
解决方案是使用宏。宏以未经评估的形式获取其参数。
假设您有一个函数multiply%
(%
只是通常添加到“内部”函数中的另一个字符),如果您像(multiply% 'a 'b 'c)
这样调用它,该函数就可以工作。然后,您可以编写一个宏multiply
引用每个参数形式:
(defmacro multiply (&rest inputs)
`(multiply% ,@(mapcar (lambda (arg)
`(quote ,arg))
inputs)))
这意味着,只要编译器遇到以multiply
开头的格式,例如e。 G。 (multiply a b c)
,它将在实际编译之前将其扩展为(multiply% (quote a) (quote b) (quote c))
(nitpick:解释器具有类似的行为)。 (Quote foo)
的缩写为'foo
。