我的程序中有列表列表 例如
(( 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) ........)
我不想要,因为我有很多新元素进来,每个元素代表列表中的一些子列表 block
非常感谢您的帮助。
最佳答案
听起来您只需要将 push、cons 或 list* 的结果包装在另一个列表中:
(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)))
关于lisp - 普通 lisp 中的子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29360787/