ANSI Common Lisp 学习笔记 —— 第八章 符号

8.1 符号名 (Symbol Names)

使用 symbol-name函数 可获得符号的名字:

> (symbol-name 'abc)
"ABC"

lisp 默认不区分大小写,打印出来的名字都是大写字母。

> (eql 'abc 'ABC)
T
> (CaR '(a b c))
A

 想区分大小写,可使用|***|形式:

> (symbol-name '|a b C|)
"a b C"

要包含符号|的话:

> (symbol-name '|a \| b|)
"a | b"

其他示例:

> (list '|Lisp 1.5| '|| '|abc| '|ABC|)
(|Lisp 1.5| || |abc| ABC)

 8.2 属性列表 (Property Lists)

符号可以关联属性列表(property-list、plist),使用 get 返回属性列表中对应的值:

> (get 'a 'color)
NIL
> (setf (get 'a 'color))
RED
> (get 'a 'color)
RED

在示例中,未定义color属性时,则返回NIL。

> (setf (get 'a 'transparency) 'high)
HIGH
> (symbol-plist 'a)
(TRANSPARENCY HIGH COLOR RED)

lisp中属性列表用得不多,基本被哈希表取代了。

8.3 符号很不简单 (symbols Are Big)

符号是一个对象,结构大概跟defstruct定义的差不多:

(

  name:   "FOO"

  package: ...

  value:     27

  function: #<function>

  plist:     (color red)

)

8.4 创建符号(Creating Symbols)

符号大都包含在包中,包就是符号表(symbol-tabls),用来映射符号-name。

使用intern函数创建符号:

> (intern "RANDOM-SYMBOL")
RANDOM-SYMBOL
NIL

示例中,intern函数返回NIL,说明RANDOM-SYMBOL符号原先不存在,现在通过intern函数创建了。

示例中未指定包,lisp就会用默认包来关联符号,这个默认包通常是common-lisp-user。

8.5 多重包 (Multiple Packages

 

posted @ 2016-02-16 23:08  eippay  阅读(153)  评论(0)    收藏  举报