common-lisp - 如何使用列表结果进行进一步计算
问题描述
作为一个 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))
,然后用评估的结果调用函数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
。在这种情况下,您应该获得一个数值类型。
推荐阅读
- php - 试图获取非对象的属性 'id' {"exception":"[object]
- java - 调用端点时如何在 MongoDB 中填充表?- MongoDb,SpringBoot
- html - VS 代码自动完成
- c++ - 打印向量中的值
- selenium - 使用 Selenium 从输入元素(类型=提交)获取文本
- java - 失败:使用继承时 loginTest java.lang.NullPointerException。如何解决?
- html - 为什么 div 位置在不同的语言环境中发生变化?
- javascript - 将函数映射到数组时,GAS 导致“参数与方法签名不匹配”异常
- vb.net - 在用户回答多项选择题后,如何让我的程序在 vb.net 中继续下一个问题?
- android - 当应用程序在后台运行时,Android Listener 停止运行