我已经在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* ?
是否有一种简单的方法同时进行:
将*b*
的值设置为一种“函数”,用于检查*b*
的值是否为符号,如果“是”,则检查符号的值(此处*a*
),依此类推,直到它是一个非符号原子或一个指向无物或指向自己的符号为止,
*b*
是自我评估(重要的是,我不想到处(funcall ...)
)并返回非符号原子或...(请参见上面的定义)。
问题可以重新表述:是否可以为函数设置变量,并且在评估此变量时对函数进行评估?有没有办法强迫和控制自我评估?
我曾经考虑过更改eval
函数(可能是一个非常糟糕的主意),或者创建自定义defvar
和自定义setf
,但是也许有内置的工具吗?
我知道可以将*b*
设置为类似(lambda () *a*)
的函数,但是为了代码的可读性,我宁愿只使用*b*
而不是(funcall *b*)
。
注意:因为我可以在运行时使用此功能,所以我偏爱非宏解决方案。
答案 0 :(得分:6)
我认为您正在寻找define-symbol-macro
:
(defvar *a* 1)
(define-symbol-macro *b* *a*)
*b*
==> 1
(setq *b* 5)
*a*
==> 5
另请参阅Symbols as Forms。