Common lisp 如何使用列表结果进行进一步计算

Common lisp 如何使用列表结果进行进一步计算,common-lisp,Common Lisp,作为一个lisp新手,我遇到了一个普遍的问题:我想查询数据,生成一个求和,然后用这个结果进一步计算 例如,我将33 77相加,并将结果除以: (defun sum (L) (reduce '+ L)) (/ 999 (sum '(33 77))) 没有除数,我得到的是正确的总数。当我试图继续下去时,我得到一个错误,一个数值函数被赋予了一个参数 一种查询类型(type of'(sum'(33 77))表示它是错误的 对于进一步计算的结果,正确的处理方法是什么 (type-of '(sum '

作为一个lisp新手,我遇到了一个普遍的问题:我想查询数据,生成一个求和,然后用这个结果进一步计算

例如,我将33 77相加,并将结果除以:

(defun sum (L)
  (reduce '+ L))
(/ 999 (sum '(33 77)))
没有除数,我得到的是正确的总数。当我试图继续下去时,我得到一个错误,一个数值函数被赋予了一个参数

一种查询类型
(type of'(sum'(33 77))
表示它是错误的

对于进一步计算的结果,正确的处理方法是什么

(type-of '(sum '(33 77)))
上述评估首先包括评估
'(sum'(33 77))
,并使用评估结果调用函数
类型

”(sum)(33 77))
(quote(sum)(quote(33 77)))
相同,只是撇号是一种读取器语法
,它将后面的内容(如
x
)转换为
(quote x)

quote
表单是自评估的,这意味着它评估的值就是所引用的准确值,这里是
(sum'(33 77))

该值是表示代码的数据:它实际上是一个在读取时构建的列表,其中包含符号
sum
,后跟另一个元素,该列表的第一个元素是
quote
,后跟另一个包含33和77个文字数字的列表

由于表达式的值是一个列表,并且列表是通过链接cons单元格构建的,因此
type of
返回
cons
是正常的

如果删除一级引号:

(type-of (sum '(33 77)))

然后对
(sum'(33 77))
的求值遵循函数调用的正常求值,首先求值参数
(33 77)
,一个文本列表,然后用它调用
sum
。函数返回总和110,这是调用
type of
时给出的值。在这种情况下,您应该获得一个数值类型。

关于“数值函数被赋予参数的错误”:我不认为这是实际的错误消息。所示代码按预期工作。你能展示一下你实际运行的是什么吗?谢谢你的帮助,我正在使用一个建筑模拟软件(IDA ICE)和一个集成的通用lisp解释器。它不工作了,不,我用gnu common lisp检查了它,它在哪里工作。这似乎是对该软件的一种特殊解释。如果我删除了外部引号,我会得到相同的错误,就像我尝试分割求和结果时一样:一个数值函数被赋予了一个argument@FloydP请仔细检查,据我所知,您描述的代码应该有效: