1.数组,Array
make-array 构造一个数组。
[9]> (make-array '(2 3))
#2A((NIL NIL NIL) (NIL NIL NIL))
[10]> (make-array '(3 3))
#2A((NIL NIL NIL) (NIL NIL NIL) (NIL NIL NIL))
其中 n 是数组的维度。
[11]> #2a((1 2 3) (4 4 4))
#2A((1 2 3) (4 4 4))
可以使用:initial-element 参数初始化数组元素的值。
[12]> (make-array '(2 3) :initial-element 2)
#2A((2 2 2) (2 2 2))
取出数组内的元素我们调用 aref,要替换数组的某个元素,我们使用 setf 和 aref。
> (setf arr (make-array '(2 3)))
#2A((NIL NIL NIL) (NIL NIL NIL))
> (aref arr 0 1)
NIL
> (setf (aref arr 0 1) 'b)
B
> (aref arr 0 1)
B
> arr
#2A((NIL B NIL) (NIL NIL NIL))
2.字符串
一个字符 c 用 #\c 表示
字符比较函数 char< (小于), char<= (小于等于), char= (等于), char>= (大于等于) , char> (大于),以及 char/= (不同)
aref 来取出元素,但对一个字串,你可以使用更快的 char 函数。
[30]> (aref "abc" 1)
#\b
[31]> (char "abc" 1)
#\b
比较两个字串,你可以使用通用的 equal 函数,但还有一个忽略大小写的比较函数 string-equal。
连接字符串
[7]> (concatenate 'string "not " "to worry")
"not to worry"
3.结构
定义结构使用 defstruct,
[8]> (defstruct point x y)
POINT
定义了一个 point 具有两个字段 x 与 y,操作方法:
[9]> (setf p (make-point :x 0 :y 0))
#S(POINT :X 0 :Y 0)
[10]> (point-x p)
0
[11]> (point-y p)
0
[12]> (setf (point-y p) 2)
2
[13]> p
#S(POINT :X 0 :Y 2)
测试是否是一个point:
[14]> (point-p p)
T
make-point , point-p , copy-point , point-x 及 point-y 函数都是在定义结构时隐式定义了。
4.哈希表 (Hash Table)
当列表的长度大幅上升时(或是 10 个元素),使用哈希表会来得比较快。
[1]> (setf ht (make-hash-table))
#S(HASH-TABLE :TEST FASTHASH-EQL)
[2]> (gethash 'color ht)
NIL ;
NIL
[3]> (setf (gethash 'color ht) 'red)
RED
[4]> (gethash 'color ht)
RED ;
T
[5]> ht
#S(HASH-TABLE :TEST FASTHASH-EQL (COLOR . RED))
[6]> (setf (gethash 'size ht) '10)
10
[7]> ht
#S(HASH-TABLE :TEST FASTHASH-EQL (SIZE . 10) (COLOR . RED))
[12]> (remhash 'size ht)
NIL
[13]> ht
#S(HASH-TABLE :TEST FASTHASH-EQL (COLOR . RED))
make-hash-table构造一个哈希表,gethash第一个参数是键值,第二个是哈希表。返回的第一个参数是键值对应的值,不存在返回nil。第二个参数表示是否存在对应的值,不存在为nil,应该主要为了区别方便判断,比如nil可能为值。remhash是删除一个记录。
[14]> (setf ht2 (make-hash-table :size 5))
#S(HASH-TABLE :TEST FASTHASH-EQL)
[15]> (setf ht3 (make-hash-table :test #'equal))
#S(HASH-TABLE :TEST FASTHASH-EQUAL)
参数:size指定哈希表的大小,:test指定查询时候比较时用的函数,从构造完返回的值有显示:test的不同。
common lisp函数还真不是一般的多,从第一次看就感觉有很多函数没必要有,现在的感觉是无论用其他的能不能实现,只要你想到的就必须用一个函数可以直接实现。感觉好怪
上一篇: common lisp列表学习2
下一篇: sublime text编辑器
0 Responses so far.