我认为这在常见的Lisp中是可能的(通过重载setf
),但对emacslisp并不确定。
我想做的是:
(setf (local variable) value)
其中表单
(local ...)
将调用我编写的一些代码,并返回用于设置其值槽的符号。编辑:从gv.el看来,建议
gv-get
可以胜任这项工作,但也许有更好的程序呢?编辑2:尝试了斯特凡的建议,很接近,但不好:(
(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)))
显然,不是我想要的我试着用上面提到的建议和
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)))))
最佳答案
有gv-define-expander
、gv-define-setter
和gv-define-simple-setter
(为了提高使用的简单性)。
您可能希望尝试100%保证的未测试代码(注意我如何将with-current-buffer+setq
传递给do
,而不是使用伪参数调用do
,这样当与push
一起使用时,这些东西就有了工作的机会)。
(gv-define-expander local
(lambda (do &rest varname &optional buffer)
(macroexp-let2 nil b buffer
(funcall do `(buffer-local-value ',varname ,b)
(lambda (value)
`(with-current-buffer ,b
(setq ,varname ,value)))))))
关于emacs - 为setf添加新的变量指示符?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13416796/