【问题标题】:Why is my lisp program not running?为什么我的 lisp 程序没有运行?
【发布时间】:2015-10-19 21:54:29
【问题描述】:

在学校“学习”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)) )
        )
    )
)

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    您正试图在 cond 的第一个子句中调用函数 0。 IE。 (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))))))
    

    请问您为什么要处理列表中的字符串?

    另外,我建议您使用可以为您格式化代码并平衡括号的文本编辑器。 Emacs 是最好的选择。 此外,此代码比 lispy 更“方案”。如果我可以问的话,你用什么书来学习 lisp。

    【讨论】:

    • 哇,很容易解决,谢谢!问题是针对学校班级的,“处理字符串”只是特定问题的要求(是的,有点傻)。我们的教科书是《编程语言概念》(Sebesta),我们在其中学习 lisp 以体验函数式编程。
    • 功能性的味道没有错,虽然在 Lisp 中不是最常见的,但它被一些人使用,最著名的是 Scott McKay。但是他们教的是(递归的)分而治之的方法来解决问题,而不是函数式编程。以我的经验,这种方法使难题更容易解决,但会导致代码难以通过略读来理解。为了说明我rewritten the code 的观点。您会看到它使用只做一件事的函数并将它们组合起来以解决问题。 (1/2)
    • 所以他们很可能使用 lisp(和其他语言)作为教你(其他)概念的工具。但如果这种风格就是你所看到的 lisp 的全部内容,它可能会给语言留下不好的印象(我知道我会的)。如果你想更详细地学习 lisp,你应该查看Practical Common Lisp。 (2/2)
    【解决方案2】:

    cond 的第一个子句中你有:

    (
      (null L)
      (0)
    )
    

    我想你想要:

    (
      (null L)
      0
    )
    

    ...没有括号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      相关资源
      最近更新 更多