clisp 语言中的结构体

发布: 2008-07-23 07:56

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 还中更高级的语法,可参数其他文档。


原文: http://qtchina.tk/?q=node/192

Powered by zexport