【问题标题】:lisp - single quote string check in listlisp - 单引号字符串签入列表
【发布时间】:2017-02-18 17:35:27
【问题描述】:

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

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

【问题讨论】:

标签: lisp


【解决方案1】:

当你写'((3 a) (2 b) (1 c)) 时,没有字符串:没有单引号字符串(在 Lisp 中没有这样的东西),没有双引号字符串。你有这个值:

(quote ((3 a) (2 b) (1 c)))

QUOTE 是一个特殊运算符,它会阻止对其子表单的求值。引号内的内容是字面量、常量数据,可以读取但不求值。

在这里,您有一个 list 列表,每个列表的第一个位置包含一个 数字,第二个位置包含一个 符号元素。特别是没有字符串。

符号是具有名称(字符串)的对象。相同符号 x 的每次出现均指代相同的对象1。下面,所有x 都指向同一个符号:

((3 x) (2 x) (1 x))

在您的代码中,您只需要检查是否存在整数并将零用于其他任何内容:浮点数、字符串、符号、向量、哈希表、CLOS 实例......

你的代码中的一个大问题是你检查变量list(一个坏名字,因为你不确定它是否是一个列表)是一个整数,但是你继续取这个整数的firstrest:那肯定会失败!

(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 符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    相关资源
    最近更新 更多