将变量名称合并到“dolist”循环中并更改其值

时间:2014-08-26 18:04:47

标签: emacs elisp

我正在尝试将缓冲区本地变量的名称合并到dolist周期中,并更改 buffer-local 变量的值。 setqsetq-local拒绝了我尝试过的所有变量名称变体。在dolist周期中,变量名称为(car (car (cdr test)))

相同的变量名将在多个缓冲区中使用,每个缓冲区具有不同的值。

这个项目与我最近的其他两个主题有关,但我相信这是一个有点独特的问题。相关主题如下:How to use `setcdr` with buffer-local variables How to use a cons cell to define and later remove overlays with `dolist`

我尝试了以下所有内容以及其他一些变体,但没有成功:

(setq (car (car (cdr test))) newlist)

(setq var newlist)

(setq (make-symbol (car (car (cdr test)))) newlist)

(setq (intern (car (car (cdr test)))) newlist)

我还尝试修改列表以使用字符串,例如'("variable-one" ,variable-one)


以下是测试代码

(defvar variable-one '(a t))

(make-variable-buffer-local 'variable-one)

(defvar variable-two '(c t))

(make-variable-buffer-local 'variable-two)

(defvar variable-three '(e t))

(make-variable-buffer-local 'variable-three)

(dolist (test `(
    '(variable-one ,variable-one)
    '(variable-two ,variable-two)
    '(variable-three ,variable-three) ))
  (let* (
      (var (car (car (cdr test))))
      (newlist (copy-list (car (cdr (car (cdr test)))))) )
    (setcdr newlist nil)
    (message "var: %s | newlist: %s" var newlist)
    ;; (setq (car (car (cdr test))) newlist)
  ))

编辑(2014年8月26日):以下修订版基于此主题中每个人提供的有用建议 - 非常感谢! :)我仍然需要在今天晚些时候使用多个缓冲区进行一些缓冲区本地测试,但论坛参与者提出的建议似乎与下面的测试大纲有关。

(defvar variable-one '(a t))

(make-variable-buffer-local 'variable-one)

(defvar variable-two '(c t))

(make-variable-buffer-local 'variable-two)

(defvar variable-three '(e t))

(make-variable-buffer-local 'variable-three)

(dolist (test `(
    (variable-one ,variable-one)
    (variable-two ,variable-two)
    (variable-three ,variable-three) ))
  (let* (
      (var (car test))
      (newlist (copy-list (car (cdr test)))) )
    (setcdr newlist nil)
    (message "var: %s | newlist: %s" var newlist)
    (set (car test) newlist) ))

1 个答案:

答案 0 :(得分:2)

我不知道你的购物周期"是什么意思。

问题的根源是setq是一种特殊形式。第一个论点不需要引用 - 这就是" q"装置

您想改用set