【发布时间】:2012-07-24 14:43:56
【问题描述】:
我已经看到this question,但它并不能解释我在想什么。
当我第一次从 Common Lisp 来到 Clojure 的时候,我很纳闷它为什么把符号和关键字当作不同的类型,但后来我想通了,现在我觉得这是一个绝妙的想法。现在我想弄清楚为什么符号和变量是独立的对象。
据我所知,Common Lisp 实现通常使用以下结构表示“符号”,该结构具有 1) 名称字符串,2) 在函数调用位置求值时指向符号值的指针,3) 指向它在外部调用位置评估时的值,以及 4) 属性列表等。
忽略 Lisp-1/Lisp-2 的区别,事实仍然是在 CL 中,“符号”对象直接指向它的值。换句话说,CL 将 Clojure 所谓的“符号”和“变量”组合在一个对象中。
在 Clojure 中,要评估一个符号,首先必须查找相应的变量,然后必须取消引用该变量。为什么 Clojure 会这样工作?这样的设计可能有什么好处?我知道 var 具有某些特殊属性(它们可以是私有的、常量或动态的......),但这些属性不能简单地应用于符号本身吗?
【问题讨论】:
-
并非所有符号都被评估为 var。例如符号
String计算为一个类。 -
还要注意,符号在编译时解析,而变量在运行时存在。
-
@AlexTaggart,很好——我想知道这是否是正确的答案。
-
@amalloy,这可能是真的 - 但它也可以很容易地成为另一种方式。这并不能解释 为什么 Clojure 的设计者选择与以前的 Lisps 决裂。
-
@amalloy 对于编译时与运行时的注释,其背后的想法是符号的存在是为了灵活和可读的编译时操作,而变量的存在是为了运行时速度?还是我只是误解了?