2015-03-31 108 views
0

我列出的名單在我的計劃 例如子列表Common Lisp中

((a b) (c d) (x y) (d u) ........) 

其實我想補充的名單,但新的元素1個新元素將所有現有的子表的父。

例如,如果一個新的元素是Z,所以我的名單應該變成這個樣子

((z(a b) (c d) (x y) (d u) ........)) 

我與推新元素嘗試,但它列表就這樣產生了

(z(a b) (c d) (x y) (d u) ........) 

,我不因爲我有很多新元素進來,每個元素代表列表中的一些子列表塊

您的幫助將非常感謝。

+0

作爲[我之前提到](http://stackoverflow.com/questions/29314957/how-to-create-list-of-lists-from-one-single-list-with-odd-and-偶對偶#comment46836370_29314957),它是「Common Lisp」。 – 2015-03-31 04:50:37

回答

3

這聽起來像你只需要包裝利弊,或列表*的結果在另一份清單:

(defun add-parent (children parent) 
    (list (list* parent children))) 

(add-parent '((a b) (c d) (x y) (d u)) 'z) 
;;=> ((Z (A B) (C D) (X Y) (D U))) 

這是我可能會採取與方法這個。保存返回值非常重要。在這方面,它有點像排序函數。

但是,如果你想製作一個破壞性的宏,你也可以使用define-modify-macro。在下文中,我們使用define-modify-macro來定義一個宏add-parentf,它將第一個參數更新爲使用第一個參數和父項調用add-parent(定義如上)的結果。

(define-modify-macro add-parentf (parent) add-parent) 

(let ((kids (copy-tree '((a b) (c d) (x y) (d u))))) 
    (add-parentf kids 'z) 
    kids) 
;;=> ((Z (A B) (C D) (X Y) (D U))) 
+0

非常感謝很棒的主意工作perfet – user3356568 2015-03-31 06:48:18

+0

@ user3356568:然後接受答案 – Baggers 2015-03-31 16:28:10

0

對於這樣一個簡單的例子,你也可以用更短的反引號方法,例如:

(let ((parent 'z) (children '((a b) (c d) (e f)))) 
    `((,parent ,@children))) 

如果你不熟悉反引號,我建議你閱讀的不錯,簡潔的描述在附錄D中:閱讀Paul Graham的ANSI Common Lisp的宏。