lisp - 普通 lisp 中的子列表

标签 lisp 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) ........)

我不想要,因为我有很多新元素进来,每个元素代表列表中的一些子列表 block

非常感谢您的帮助。

最佳答案

听起来您只需要将 pushconslist* 的结果包装在另一个列表中:

(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/

相关文章:

Lisp 引用在内部工作

c++ - 各种语言的 Python 生成器

lisp - 从终端命令提示符运行 Common Lisp 函数

lisp - 普通口齿不清, "defined but never used"

lisp - 没有名为 "CLACK.APP.DIRECTORY"的包

lisp - Racket 博士中的mcons

lisp - 如何在 SLIME EMACS 窗口中写入逗号字符

lisp - 比较 Lisp 中的列表

common-lisp - 如何使这段代码更简单,更清晰和 "more lispy"?

lisp - Lisp 中的相等函数