List 使列表成为符号

List 使列表成为符号,list,lisp,elisp,List,Lisp,Elisp,我试图弹出elisp中列表的一个元素,如下所示 (pop '(1 2)) 但是,由于我的误解,这不起作用b/c列表还没有被内在化为一个符号。有没有一种惯用的方法来实现上述目标,或者这不是一种正确的方法?再胡闹一点,我发现我能做到 (pop (progn (setq tmp '(1 2)) tmp)) 但这似乎不对。有没有一种方法可以制作匿名列表并像我尝试做的那样修改它们?是一个宏 修改其参数的值, a 例如: 请注意,修改的是位置的值,而不是位置中包含的对象 例如: 这样,列表(1 2 3)

我试图
弹出elisp中列表的一个元素,如下所示

(pop '(1 2))
但是,由于我的误解,这不起作用b/c列表还没有被内在化为一个符号。有没有一种惯用的方法来实现上述目标,或者这不是一种正确的方法?再胡闹一点,我发现我能做到

(pop (progn (setq tmp '(1 2)) tmp))
但这似乎不对。有没有一种方法可以制作匿名列表并像我尝试做的那样修改它们?

是一个宏 修改其参数的值, a

例如:

请注意,修改的是位置的值,而不是位置中包含的对象

例如:

这样,列表
(1 2 3)
不会被修改,只会修改变量的值

你到底想做什么?

是一个宏 修改其参数的值, a

例如:

请注意,修改的是位置的值,而不是位置中包含的对象

例如:

这样,列表
(1 2 3)
不会被修改,只会修改变量的值


你到底想做什么?

pop
不会做你认为它会做的事。它不会修改任何列表。它只是用列表的
cdr
重新绑定给定变量

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

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

请注意,没有任何列表修改功能,例如
rplaca
rplacd

pop
,这些功能并不能实现您认为的功能。它不会修改任何列表。它只是用列表的
cdr
重新绑定给定变量

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

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

请注意,没有任何列表修改函数,例如
rplaca
rplacd

@jenesaisquoi只有变量绑定发生了变化,而不是实际对象。@jenesaisquoi只有变量绑定发生了变化,而不是实际对象。
(car-safe (prog1 foo (setq foo (cdr foo))))