lisp - 单引号字符串检入列表

时间:2017-02-18 17:35:28

标签: lisp

我正在考虑这个问题。 如何检查列表中的单引号字符串? (不是双引号字符串) 函数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它不能正常工作。

我该怎么做才能解决这个问题?

1 个答案:

答案 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 该符号。