2015-10-19 133 views
0

「學習」學校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))) 
     ) 
    ) 
) 

回答

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更「方案」。如果我可能會問,你會用什麼書來學習lisp。

+1

哇很容易修復謝謝!問題在於學校班級,「處理字符串」只是特定問題的一個要求(是的,有點愚蠢)。我們的教科書是編程語言的概念(Sebesta),我們正在學習Lisp的功能編程口味。 –

+0

功能性的味道沒有錯,雖然不是Lisp中最常見的,但它被一些人使用,最着名的是Scott McKay。但他們所教的是(遞歸)分而治之的解決問題的方法,而不是函數式編程。根據我的經驗,這種方法使得難以解決的難題變得容易,但是導致後面的代碼難以通過略讀來理解。爲了說明我已經[重寫了代碼](https://gist.github.com/PuercoPop/66137175f6d1bbc5dfe2)的觀點。你會看到它使用的功能只做一件事,並組合它們來解決問題。 (1/2) – PuercoPop

+0

所以他們很可能使用lisp(和其他語言)作爲教導你(其他)概念的工具。但是,如果這種風格是你看到的所有誹謗,那麼可能會給這種語言留下不好的印象(我知道我會這麼做)。如果你想更詳細地學習lisp,你應該看看[Practical Common Lisp](http://www.gigamonkeys.com/book/)。 (2/2) – PuercoPop

1

cond第一條你有:

(
    (null L) 
    (0) 
) 

我想你想:

(
    (null L) 
    0 
) 

...沒有parens。

相關問題