首页 > 解决方案 > 如何使用列表结果进行进一步计算

问题描述

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

例如,我总结了 33 77 并希望将结果相除:

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

如果没有除法,我会收到正确的金额。当我尝试进一步进行时,我收到一个错误,即为数值函数提供了参数。

一种类型的查询(type-of '(sum '(33 77)))说它是缺点

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

标签: common-lisp

解决方案


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

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

'(sum '(33 77))与 相同(quote (sum (quote (33 77)))),除了撇号是一种阅读器语法,它将后面的'内容,比如x,变成(quote x)

quote表单是自我评估的,这意味着它评估的值是引用的确切值,here (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。在这种情况下,您应该获得一个数值类型。


推荐阅读