我正在尝试pop
elisp中列表的元素,如下所示,
(pop '(1 2))
但是,由于我的误解,这不起作用b / c列表尚未内化为符号。有没有惯用的方法来做到这一点,或者这不是一个正确的方法?我发现我可以做得更进一步了解
(pop (progn (setq tmp '(1 2)) tmp))
但似乎不对。有没有办法制作匿名列表并像我试图那样修改它们?
答案 0 :(得分:4)
如,
(defparameter *var* '(1 2 3))
(pop *var*)
==> 1
*var*
==> (2 3)
请注意,修改的是地方的价值,而不是地方所包含的对象。
如,
(defparameter *var-1* '(1 2 3))
(defparameter *var-2* *var-1*)
(pop *var-1*)
==> 1
*var-1*
==> (2 3)
*var-2*
==> (1 2 3)
IOW,列表(1 2 3)
未被修改,只有变量的值为。
你究竟想做什么?
答案 1 :(得分:1)
pop
没有按照您的想法行事。它不会修改任何列表。它只是使用列表的cdr
重新绑定给定变量。
在Emacs中运行(macroexpand '(pop foo))
,我得到:
(car-safe (prog1 foo (setq foo (cdr foo))))
请注意,缺少任何列表修改功能,例如rplaca
或rplacd
。