把列表变成符号
Make list into symbol
我正在尝试 pop
elisp 中列表的一个元素,
(pop '(1 2))
但是,由于我的误解,这不起作用 b/c 该列表尚未被内化为符号。是否有一种惯用的方法来执行上述操作,或者这不是一种正确的方法?更进一步我发现我可以做到
(pop (progn (setq tmp '(1 2)) tmp))
但好像不太对。有没有办法制作匿名列表并像我试图做的那样修改它们?
例如,
(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))))
请注意缺少任何列表修改函数,例如 rplaca
或 rplacd
。
我正在尝试 pop
elisp 中列表的一个元素,
(pop '(1 2))
但是,由于我的误解,这不起作用 b/c 该列表尚未被内化为符号。是否有一种惯用的方法来执行上述操作,或者这不是一种正确的方法?更进一步我发现我可以做到
(pop (progn (setq tmp '(1 2)) tmp))
但好像不太对。有没有办法制作匿名列表并像我试图做的那样修改它们?
例如,
(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))))
请注意缺少任何列表修改函数,例如 rplaca
或 rplacd
。