我在Common Lisp中做了一些测试:
(defvar *a* 0)
(defvar *b* *a*)
(setf *b* 5)
*b* ; returns 5 of course
*a* ; returns 0. Is there a way to set it to 5 without setting *a* directly, via *b* ?
Run Code Online (Sandbox Code Playgroud)
有一种简单的方法可以同时进行:
将值设置*b*为一种"函数",它检查值*b*是否为符号,如果"是"访问符号的值(此处*a*),依此类推,直到它是非符号原子或符号为止指向任何事物或对自己,
*b*是自我评估(很重要,我不想(funcall ...)到处都是)并返回非符号原子或......(见上面的定义).
问题可以重新表述:这是否可以将变量设置为函数,并且在评估此变量时评估函数?有没有办法强迫和控制自我评估?
我曾经想过改变eval功能(可能是一个非常糟糕的主意),或者创建一个自定义defvar和自定义setf,但也许有一个内置的工具呢?
我知道可以设置*b*为类似的功能,(lambda () *a*)但我更愿意使用*b*而不是(funcall *b*)代码可读性.
注意:我偏爱非宏解决方案,因为我可以在运行时使用此功能.
我想你正在寻找define-symbol-macro:
(defvar *a* 1)
(define-symbol-macro *b* *a*)
*b*
==> 1
(setq *b* 5)
*a*
==> 5
Run Code Online (Sandbox Code Playgroud)
另请参见符号作为表单.