感觉大家都没说到点子上,
定义:Symbol(符号)只是用来指代能够引用其他数据类型的一种数据类型而已。
通常情况下,Symbol在read时读为符号(这个数据类型),然后在eval时(根据上下文)求得另外一种数据对象。
特殊的符号,读为不同类型,求值后为自身(读后的类型):比如布尔值符号,在读时,为布尔值,求值时,为自身布尔值;再比如nil符号,Clojure里特有的keyword,都是这种特殊符号。(特殊符号也并没有脱离定义,特殊符号只不过引用了自身(这个数据类型),表示指代自己)
而String(字符串),它只是由字符按顺序组成的一种数据类型而已。读为字符串,求值为字符串,就和其他普通数据一样,it's just data,它并不引用任何其他数据类型。
符号本身也是数据,但是在进入求值阶段,你必须对其进行quote防止被求值(防止求得该符号所引用的数据),才能获得符号数据类型值本身,而像字符串 数字 等这种字面量值,它是啥就是啥。
符号作为一种数据类型,可被传递,可被引用,可被求值,甚至还能被进行读操控,是Lisp里的一等公民。能直接操作符号,才有强大的Lisp宏系统。这种特性在市面上流行的这些类C编程语言里是不可想象的。