如何在LISP中计算具有未绑定变量的表达式?

时间:2019-12-07 14:32:59

标签: common-lisp

我有一个的函数,带有可变数量的参数。

(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))

我如何评估这样的东西?

1 个答案:

答案 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