2015-03-31 88 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的宏。