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 还中更高级的语法,可参数其他文档。
转载于:https://www.cnblogs.com/qtchina/archive/2010/06/12/1757069.html