作为一个轻率的新手,我遇到了一个普遍的问题:我想查询数据,生成数据的总和,并希望进一步计算出结果。
例如,我总结33 77并想除以结果:
(defun sum (L)
(reduce '+ L))
(/ 999 (sum '(33 77)))
没有分度,我会收到正确的总和。当我尝试进一步时,出现错误,数值函数被赋予了参数。
类型查询(type-of '(sum '(33 77)))
说它是CONS
对结果进行进一步计算的正确处理是什么?
答案 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
时给出的值。在这种情况下,您应该获取数字类型。