我认为这在 Common Lisp 中是可能的(通过重载setf
),但不确定 Emacs Lisp。
我想做的是:
(setf (local variable) value)
表单(local ...)
将调用我编写的一些代码并返回用于设置其值槽的符号。
编辑:从 gv.el 看来,建议似乎gv-get
可以完成这项工作,但也许有更好的程序呢?
EDIT2:尝试了 Stefan 的建议,关闭,但不好:(
(gv-define-setter local (value varname &optional buffer)
`(with-current-buffer (or ,buffer (current-buffer))
(setq ,varname ,value)))
扩展为:
(let* ((v bar))
(with-current-buffer (or nil (current-buffer))
(setq v 42)))
显然,不是我想要的。我试图通过上面提到的建议和 with 来做到这一点gv-define-expander
,但是引用太多了,我找不到let
用冗余替换来松散表达式部分的方法。
编辑3:
好的,除非我在范围或变量将设置为的值的评估顺序中严重搞砸了一些东西,这似乎有效:
(gv-define-expander local
(lambda (do &rest args)
(let ((varname (first args))
(buffer (or (second args) '(current-buffer)))
(value (funcall do nil #'identity)))
`(with-current-buffer ,buffer
(setq ,varname ,value)))))