如何将`setcdr`与缓冲区局部变量一起使用

law*_*ist 1 emacs elisp

我遇到的行为setcdr似乎表明它不局限于在不同缓冲区中包含相同名称的缓冲区局部变量.我尝试过使用with-current-buffer,但这并不能解决问题.

例如,buffer-A并且buffer-B都含有一个名为局部变量variable-one,这是一种cons细胞-例如(overlay-string t),与setcdr正被用来设置cdr值要么tnil.

有没有办法确保setcdr仅限于修改缓冲区本地值?

phi*_*ils 6

没有,对列表的CDR没有缓冲范围的数值.

如果两个变量指向同一个列表,并且您修改了列表,那么您将在两个变量中看到效果.

这与缓冲区局部变量无关,而与将变量分配给变量意味着什么有关.

如果您希望两个变量指向不同的列表,则需要复制整个列表.

您可以使用(copy-sequence LIST)复制列表.或者(append LIST nil)也很常见(作为附加副本除了最终参数之外的所有副本).

nb这些函数创建一个新的列表结构,但列表中的仍然是原始对象.通常情况下,这就是所需要的,但如果您确实需要列表内容完全相互独立,那么请copy-tree改用.