我正在考虑这个问题。 如何检查列表中的单引号字符串? (不是双引号字符串) 函数stringp,typecase等等..只处理双引号。
我想make(f'((3 a)(2 b)(1 c)))应该返回6。 非整数应该被忽略。
我尝试了这段代码。
(defun f (lst)
(typecase lst
(integer (+ (f (first lst)) (f (rest lst))))
(list 0))
)
我需要检查列表中的单引号字符串。 但是,stringp,typecase它不能正常工作。
我该怎么做才能解决这个问题?
答案 0 :(得分:2)
当你写'((3 a) (2 b) (1 c))
时,有没有字符串:没有单引号字符串(在Lisp中没有这样的东西),没有双引号字符串。你有这个值:
(quote ((3 a) (2 b) (1 c)))
QUOTE
是一个特殊运算符,它会阻止对其子表单的评估。引号内部是文字的常量数据,它被读取但未被评估。
在这里,您有一个列表列表,每个列表在第一个位置包含数字,第二个包含符号元件。特别是,没有字符串。
符号是具有名称(字符串)的对象。同一符号x
的每次出现都指向相同的对象 1 。在下面,所有x
指向同一个符号:
((3 x) (2 x) (1 x))
在你的代码中,你只需要检查是否有一个整数,并为其他任何东西使用零:浮点数,字符串,符号,向量,哈希表,CLOS实例,....
代码中的一个大问题是你检查变量list
(一个坏名称,因为你不确定它是否是一个列表)是整数,但是你继续进行这个整数的第一次和休息:这肯定会失败!
(defun f (form)
(typecase form
;; cons cell: recurse
(cons (+ (f (first form))
(f (rest form))))
;; integer: form is the value
(integer form)
;; anything else: zero
(t 0)))
如果您的数据始终遵循相同的模式(具有一个数字,一个符号的夫妇列表),您可以简单地遍历每一对并对数字求和:
(loop for (number symbol) in list sum number)
1。在相同的package中,如果您没有 unintern 该符号。