为什么我的lisp程序没有运行?

时间:2015-10-19 21:54:30

标签: lisp common-lisp

"学习" Lisp适合上学,但感觉我没有正确学习。我正在尝试编写一个函数来将所有数字添加到由列表,数字和字符串组成的列表中。我忽略了字符串并输入了列表。我对所有的括号都感到很失落......

我收到错误在函子位置0的非法参数

(defun add-all (L)
    (cond
        (
            (null L)
            (0)
        )
        ( 
            (listp (car L) )
            (+ (add-all (car L)) (add-all (cdr L)) )
        )
        (
            (stringp (car L) )
            (+ (add-all (cdr L)) )
        )
        ( 
            t
            (+ (car L) (add-all (cdr L)) )
        )
    )
)

2 个答案:

答案 0 :(得分:3)

您正试图在cond的第一个子句中调用函数0。即。 (0)。这是为了可读性而格式化的固定代码。

(defun add-all (list)
  (cond
    ((null list) 0)
    ((listp (car list)) (+ (add-all (car list)) (add-all (cdr list))))
    ((stringp (car list)) (+ (add-all (cdr list))))
    (t (+ (car list) (add-all (cdr list))))))

我可以问你为什么要处理列表中的字符串?

作为额外的,我建议你使用一个文本编辑器,它可以格式化代码并为你平衡parens。 Emacs是最好的选择。 此代码也比lispy更“流行”。如果我问的话,你用什么书来学习口齿不清。

答案 1 :(得分:1)

cond的第一个条款中,您有:

(
  (null L)
  (0)
)

我想你想要:

(
  (null L)
  0
)

......没有parens。