clisp 语言中的结构体
1. defstruct语法结构:
(defstruct struct-name (filed1 default-value :type filed-type)
(filed2 default-value2 :type filed-type2) ... )
struct-name 为定义的结构体的名字,可以是clisp允许的符号名。
field1 结构第一个成员变量名,可以是clisp允许的任何符号名。
default-value 该成员的默认值
:type 后面的值指定该成员的数据类型
field-type 该成员的数据类型,可以是string, integer 等clisp实现的数据类型。
field2, default-value2, field-type2与上同。
2. 构造clisp结构体
定义了结构体后,可以使用MAKE- + struct-name函数构造结构体
如定义一个结构体 person,
CLISP> (defstruct person (name "john" :type string)
(age 23 :type integer))
然后使用函数 make-person 构造结构体变量,这函数不需要另外定义。
CLISP> (make-person :name "james" :age 30)
#S(PERSON :NAME "james" :AGE 30)
如果调用make-person函数不带参数,则构造一个默认的person变量:
CLISP> (make-person)
#S(PERSON :NAME "john" :AGE 23)
这变量中的成员值为定义结构体时指定的默认值。
3. 构造一个结构体并赋值给一个变量。
CLISP> (setq person_1 (make-person :name "qtchina" :age 28))
CLISP> (print person_1)
#S(PERSON :NAME "qtchina" :AGE 28)
4. 引用结构体中的成员的值。
定义结构体的时候clisp会为我们定义一个函数 structure-name-slot-name,可以使用这个函数
引用结构体成员中的值,该函数只有一个参数,结构体变量名。.
CLISP> (print (person-name person_1))
"qtchina"
"qtchina"
5. 修改结构体中的成员的值。
可以使用第4节中的方法修改成员的值。
CLISP> setf (person-name person_1) "qter")
"qter"
CLISP> (print person_1)
#S(PERSON :NAME "qter" :AGE 28)
#S(PERSON :NAME "qter" :AGE 28)
可以看到结构体变量中的成员变量的值已经修改了。
6. 结构体拷贝
在声明结构体的同时,clisp为我们定义了拷贝函数: copy-structure-name
CLISP> (setq person_copy (copy-person person_1))
#S(PERSON :NAME "qter" :AGE 28)
但注意拷贝过来的值与原来的直是不同的,虽然它们的值相同,即
CLISP> (eq person_copy person_1)
NIL
所以上面的copy-person为拷贝赋值。
而如果执行
CLISP> (setq person_same person_1)
#S(PERSON :NAME "qter" :AGE 28)
CLISP> (eq person_same person_1)
T
这个才是引用赋值,用eq函数比较才返回真值。
defstruct 还中更高级的语法,可参数其他文档。
posted on 2010-06-12 14:33 drswinghead 阅读(157) 评论(0) 编辑 收藏 举报