将列表设为符号

时间:2016-06-17 21:42:03

标签: list lisp elisp

我正在尝试pop elisp中列表的元素,如下所示,

(pop '(1 2))

但是,由于我的误解,这不起作用b / c列表尚未内化为符号。有没有惯用的方法来做到这一点,或者这不是一个正确的方法?我发现我可以做得更进一步了解

(pop (progn (setq tmp '(1 2)) tmp))

但似乎不对。有没有办法制作匿名列表并像我试图那样修改它们?

2 个答案:

答案 0 :(得分:4)

pop 修改其参数的值, 一个place

如,

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

请注意,缺少任何列表修改功能,例如rplacarplacd