Mad*_*ist 2 functional-programming list concatenation append common-lisp
我想知道在 Common Lisp 中做这样的事情最有效(算法)和可读的方式是什么:
(setq result-list (append result-list small-list))
Run Code Online (Sandbox Code Playgroud)
也就是说,是否有类似的东西(append-destructively result-list small-list)可以确保result-list包含连接列表?
我这样做是为了提高可读性,但是在(功能性)编程实践方面,这是一个好主意吗?
如果你必须在同一个列表上一遍又一遍地做,
tail-wagging可能是最好的解决方案(这是我从 Edi Weitz 的书中学到的):
(defparameter *l* (list 'a 'b 'c 'd 'e 'f))
Run Code Online (Sandbox Code Playgroud)
给出的最后利弊细胞*l*的名称
(defparameter *tail* (last *l*))
Run Code Online (Sandbox Code Playgroud)
现在,(cdr *tail*)是列表的最后一个元素:'()。假设您想添加(list 'g 'h 'i)到它的末尾。将setf它分配 ( ) 到列表(cdr *tail*)的最后一个cons-cell: ,并将新的最后一个 cons 元素重新分配 ( ) 到tail。'()*l*setf
(setf (cdr *tail*) (list 'g 'h 'i)
*tail* (last *tail*))
Run Code Online (Sandbox Code Playgroud)
现在,*l*被变异为包含第二个列表。并*tail*命名cons这个新列表的最后一个单元格。
*l*
;; (a b c d e f g h i)
*tail*
;; (i)
Run Code Online (Sandbox Code Playgroud)
下一次,当*tail*已经由一个列表进行扩展,您不必再遍历所有的名单,但可以只分配到cdr的*tail*待补写列表,然后将原来的名单将被修改。
顺便说一句,我tail-wagging在考虑的时候绊倒了tailp