附加可变变量

时间:2012-02-12 08:53:36

标签: lisp common-lisp

是否有内置函数或宏来将列表附加到可变列表中。像PUSH之类的东西,但略有不同。

这是使用exapmle的PUSH:

(setq v '(3))
(push '(1 2) v) ;v now ((1 2) 3)

我需要休闲行为:

(setq v '(3))
(mappend '(1 2) v) ;v should be (1 2 3)

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找nconc

  

[功能] nconc& rest list

     

nconc将列表作为参数。它返回一个列表   争论联系在一起。参数改变而不是   复制。 (将此与append进行比较,后者复制参数而不是   摧毁他们。)例如:

     

(setq x'(a b c))(setq y'(d e f))(nconc x y)=> (a b c d e f)x   => (a b c d e f)

您可以使用nconc定义推送列表宏,使其具有类似于push的接口:

(defmacro pushlist (lst place)
  `(setf ,place (nconc ,lst ,place)))

测试一下:

CL-USER> 
(defparameter *v* (list 3))
*V*
(pushlist (list 1 2) *v*)
CL-USER> 
(1 2 3)
CL-USER>
*v*
(1 2 3)
CL-USER> 

另请注意,我在阅读了sigjuice的评论后,使用(列表3)而不是'(3)。