2016-02-09 76 views
0

嘿,我試圖打破一個複雜的問題,並能夠添加一個元素而不在列表中創建列表將使問題更容易。我做了大量的Google搜索,並且在common-lisp中找不到任何提及的add函數。我還應該提到,我正試圖將其添加到列表的末尾。是否有基於sbcl的common-lisp添加(列表)函數?

- 我看到了推宏,但不會因爲任何原因編譯。我收到一個非法函數調用。

- 我試過使用缺點,並且不會工作,因爲它會使我正在使用的主列表中的多個列表。我需要將每個元素放在一個列表中,這樣不會有幫助。

- 使用列表將產生與cons相同的問題,因爲我將再次獲取分層列表。

必須有一些方法可以在不創建分層列表的情況下將元素添加到列表中。我是新來的lisp,所以我很抱歉,如果這是基本的。

+0

顯示代碼,否則您將無法獲得幫助。我不知道如何使用'push'來設法產生非法函數調用。 – Svante

回答

2

我相信你正在尋找追加。

CL-USER> (append '(:a :b :c) '(1 2 3)) 
(:A :B :C 1 2 3) 

http://www.lispworks.com/documentation/HyperSpec/Body/f_append.htm#append

+0

不知道這個功能是否可用。我正在上課的是一位臭名昭着的教授和一本可怕的書。感謝您親切回答我簡單的問題。 – Xuluu

+3

@ user3622073 common lisp記錄在免費提供的[hyperspec](http://www.lispworks.com/documentation/HyperSpec/Front)中。它很大,但可以訪問,我們將組織。瀏覽會發現你很多有用的東西。 –

+2

@ user3622073還有一些免費的在線書籍,即[Practical Common Lisp](http://gigamonkeys.com/book/)和[Common Lisp:符號計算的簡潔介紹](http:// www.cs.cmu.edu/~dst/LispBook/)。 – Pascal

1

當鏈表(cons單元基於列表)的工作往往是有幫助的 「逆向思考」。你說過要將元素添加到列表的末尾,但將某些內容添加到鏈接列表的最佳方式是將其添加到前面。所以如果你能夠把你的問題轉到你可能會用cons

舉例來說,如果我在那裏創建一個函數來構建一個範圍爲列表我能做到這一點:

(defun make-range (from to result) 
    (if (<= from to) 
    (make-range (1+ from) to (cons from result)) 
    result)) 

但是,這將導致向後範圍:

* (make-range 1 5()) 
(5 4 3 2 1) 

然而,解決這個問題就像在完成構建時反轉列表一樣簡單。

(defun make-range2 (from to result) 
    (if (<= from to) 
    (make-range2 (1+ from) to (cons from result)) 
    (reverse result))) 

* (make-range2 1 5()) 
(1 2 3 4 5) 

倒車列表一次在很多情況下,你看到了很多在函數式編程的開銷,我們可以住在一起,有什麼東西。

相關問題