将变量的值设置为自评估代码

时间:2018-06-22 14:43:02

标签: common-lisp

我已经在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*)

注意:因为我可以在运行时使用此功能,所以我偏爱非宏解决方案。

1 个答案:

答案 0 :(得分:6)

我认为您正在寻找define-symbol-macro

(defvar *a* 1)
(define-symbol-macro *b* *a*)
*b*
==> 1
(setq *b* 5)
*a*
==> 5

另请参阅Symbols as Forms