2015-06-24 12 views
-1

這個函數應該刪除列表內部的所有圓括號。我不問如何做到這一點(我已經知道這將是一個重複的),我問爲什麼,當我跑我的解決方案,它打破了這裏告訴我我的扁平函數有什麼問題

"Error: The variable APPEND is unbound."

是我的代碼

(defun flatten (lst) 
    (cond ((null lst) lst) 
    ((listp (first lst))(append((flatten(first lst)) flatten(rest lst)))) 
    (append(list(first lst) flatten(rest lst))))) 

繼承人如何支持其工作: 1:首先檢查列表是否爲空。基本案例 2:然後它檢查它的第一個元素是否是一個列表。如果是,則它將該列表附加到列表尾部的遞歸調用結果上 3:最後,如果第一個元素不是子列表,則它會將包含該元素的列表附加到列表的結果上遞歸調用尾部。

什麼不起作用?

編輯


我只想補充一點,這是字面上口齒不清我有史以來第一次節目。如果我的錯誤是由於括號放置或其他菜鳥錯誤引起的,我不知道,因爲我仍在適應用功能語言編程。

+0

GNU Common Lisp,我寫了它。 – jokeSlayer94

+0

順便說一句,你的邏輯對'(((1))((2)))'不起作用。「你需要在第一次和第二次都追加遞歸結果。 – Sylwester

+0

我需要將它們追加到什麼?彼此?我現有的名單? – jokeSlayer94

回答

2

很多東西在這裏不起作用。像

(append ((flatten(first lst)) flatten(rest lst)))) 

東西是一個函數調用該函數追加,但有一個說法:

((flatten(first lst)) flatten(rest lst)) 

一個函數調用,除了(flatten (first lst))不是一個函數,你可以打電話。而且即使是,你可以用兩個參數調用:

flatten 

(rest list) 

那些第二次排序是有道理的,但你沒有一個變量list做,你只有lst。第一個將是一個變量引用,但是您尚未聲明變量flatten

但是,您所得到的具體錯誤不是其中之一。你可能用不是空列表的東西來調用你的函數(所以你不在第一個子句中),並且沒有列表作爲第一個參數(所以你不在第二個子句中)。這意味着,你去第三條:

(defun flatten (lst) 
    (cond ((null lst)   lst) 
     ((listp (first lst)) (append ((flatten(first lst)) flatten(rest lst)))) 
     (append    (list(first lst) flatten(rest lst)))) ; *here* 

在這方面,你要評估append,如果這是真的,你會評估

(list(first lst) flatten(rest lst))) 

append不是一個變量儘管如此,所以你得到了未綁定的變量錯誤。即使是這樣,它是真實的,你會得到一個錯誤,當您嘗試評估

(list(first lst) flatten(rest lst))) 

,因爲這是一個函數調用list,與(first lst)作爲第一個參數(這是好的),並flatten作爲它的第二個參數(另一個未綁定的變量),並將其作爲第三個參數(這很好)(rest lst)。請記住,在Lisp的函數調用看起來像

(<function-name> <arg1>...) 

所以你寫(list (flatten (first lst)) (flatten (rest lst))),雖然,你可能真的想(append (flatten ...) (flatten ...))。也就是說,已經有很多關於如何在Stack Overflow上展開列表的問題。其中一些可能會更有啓發性。