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

时间:2019-03-27 15:54:23

标签: common-lisp

作为一个轻率的新手,我遇到了一个普遍的问题:我想查询数据,生成数据的总和,并希望进一步计算出结果。

例如,我总结33 77并想除以结果:

(defun sum (L)
  (reduce '+ L))
(/ 999 (sum '(33 77)))

没有分度,我会收到正确的总和。当我尝试进一步时,出现错误,数值函数被赋予了参数。

类型查询(type-of '(sum '(33 77)))说它是CONS

对结果进行进一步计算的正确处理是什么?

1 个答案:

答案 0 :(得分:2)

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

上述评估首先包括评估'(sum '(33 77)),然后将评估结果调用函数type-of

'(sum '(33 77))(quote (sum (quote (33 77))))相同,除了撇号是读者语法'之外,该语法将随后出现的内容x转换为(quote x)

quote形式是自我评估的,这意味着它评估的值是引用的确切值,在这里(sum '(33 77))

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

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

如果删除一级引号:

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

然后,对(sum '(33 77))的求值遵循对函数调用的常规求值,方法是首先对参数'(33 77),文字列表进行求值,然后调用sum。您的函数返回总和110,这是调用type-of时给出的值。在这种情况下,您应该获取数字类型。