引用变量的常规方式是书写其对应的符号名称。See 符号形式。
偶尔你可能需要引用一个仅在运行时才能确定的变量,这种情况下无法在程序代码中直接指定变量名,此时可以使用 symbol-value 函数来获取其值。
该函数返回存储在 symbol 值域(value cell)中的值,变量当前的(动态)值就存储在这里。如果该变量没有局部绑定,返回的就是其全局值;如果变量为空(void),则会触发 void-variable 错误。
如果变量是词法绑定的,那么 symbol-value 返回的值不一定等于该变量的词法值。词法值由词法环境决定,而非由符号的值域(value cell)决定。See Scoping 变量绑定的作用域规则。
(setq abracadabra 5)
⇒ 5
(setq foo 9)
⇒ 9
;; Here the symbol abracadabra
;; is the symbol whose value is examined.
(let ((abracadabra 'foo))
(symbol-value 'abracadabra))
⇒ foo
;; Here, the value ofabracadabra, ;; which isfoo, ;; is the symbol whose value is examined. (let ((abracadabra 'foo)) (symbol-value abracadabra)) ⇒ 9
(symbol-value 'abracadabra)
⇒ 5