把列表变成符号

Make list into symbol

我正在尝试 pop elisp 中列表的一个元素,

(pop '(1 2))

但是,由于我的误解,这不起作用 b/c 该列表尚未被内化为符号。是否有一种惯用的方法来执行上述操作,或者这不是一种正确的方法?更进一步我发现我可以做到

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

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

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)没有被修改,只有变量的值是。

你到底想做什么?

pop 并不像您想象的那样。它不会修改任何列表。它只是将给定变量与列表的 cdr.

重新绑定

运行 (macroexpand '(pop foo)) 在 Emacs 中,我得到:

(car-safe (prog1 foo (setq foo (cdr foo))))

请注意缺少任何列表修改函数,例如 rplacarplacd