ANSI Common Lisp译本笔记3

特殊数据结构


数组


make-arry:构造一个数组,第一个参数为数组维度,若要指定多维数组,则此参数为一个列表。第二个参数为初始化值,可以使用关键字initial-element来指定全部初始值。
如:(make-array 2 :initial-element nil)→(nil nil)一个一维数组含有两个nil值的元素。
(make-array '(2 2) :initial-element nil)→((nil nil) (nil nil))一个二维数组含有两个一维数组。


aref:根据下标取数组值。第一个参数为数组,第二个参数为下表。
如:(aref arr 0 0)表示:取出一个二维数组的第0行0列的元素。
(aref arr 1 2)表示:取出一个二维数组的第1行第2列的元素。


若要生成一个常量数组则用#na,其中n表示维度。
如:#2a((1 2) (3 4))表示:一个二维数组含有元素为1 2 3 4


其中,一维数组又叫向量,从向量中取值有一个更快速的方法:svref。是专为向量制定的。


若要生成一个常量向量则使用#。
如:#(1 2 3)表示一个一维数组,即向量。


字符与字符串


char-code:返回与字符相关的数字
code-char:返回与数字相关的字符


字符比较函数:char< char<= char= char> char>= char/=(不等于)


字符串可理解为向量,所以序列和数组的函数,字符串都能使用,如:aref取出元素。
字符串专有取出元素函数:char:第一个参数为字符串,第二个参数为取出位置。
比较字符串通用方法为:equal
string-equal:此函数忽略大小写来比较字符串。
concatenate:可用来连接字符串。接受一个指定类型的符号,后面加上一个或多个序列。
如:(concarenate 'string "not" "to worry") → "not to worry"




序列
序列类型包含:列表和向量
所以,remove、length、subseq、reverse、sort、every、some都是序列函数。
取出序列元素的函数:nth(列表)、aref(数组)、svref(向量)、char(字符串)。
其中,还有一个elt,对任何种类的序列都有效。
elt:第一个参数是一个序列,第二个参数为位置。返回指定位置的值。
如:(elt '(a b c) 2) → c


序列函数关键字


参数用途缺省
:key应用至每个元素的函数identity
:test作来比较的函数eql
:from-end若为真,反向工作nil
:start 起始位置0
:end若给定,结束位置nil


一个可以 接受上述的全部关键字的函数:position
position:返回序列中一个元素的位置,未找到时,返回nil。

结构


defstruct:定义一个结构。第一个参数是结构的名字,后续参数为结构的字段名。同时还隐式的定义了make-结构名、结构名-p、copy-结构名、结构-结构字段名。


make-结构名:是用来创建一个结构变量
结构名-p:是判断一个变量是否是此结构
copy-结构名:复制结构变量的值
结构名-结构字段名:取出结构变量中的指定字段。


如:(defsruct point x y)→定义一个点结构,有两个字段名:x、y
(setf p (make-point :x 1 :y 1)→创建要给点结构的变量,并将字段x、y赋值为1 
(point-p p)→判断变量p是否为点结构,是返回T,否返回nil
(setf temp (copy-point p))→复制p的值并将此值设置给temp,即temp和p相等,也是一个点结构
(point-x p)→取出结构p的字段x
(point-y p)→取出结构p的字段y


还可以,在本来的定义中,附上一个含有字段名及要给预设表达式的列表,来指定结构字段的缺省值。即:在创建结构的时候,给结构加上缺省值。当调用make-结构名,指定初始值时则使用缺省值。
如:(defstruct point (x 0) (y 0))


其中,使用:conc-name参数制定了要放在字段前面的名字,并用这些名字来生成存取函数。
即:conc-name是用来制定结构字段存取函数前缀。默认为结构名-。如:point-x 若制定:conc-name p则为px
使用例子:(defstruct (point (:conc-name p)) x y),则字段x、y的存取函数为px、py而不是point-x、point-y


:print-function:在结构需要被显示时,要用来打印的函数名。即:使用make-结构名,可打印出缺省值。
例子:(defstruct (point (:conc-name p) (:print-function print-point) (x 1) (y 2))
(defun print-point (p stream depth)
  (format stream "<~A,~A>") (px x) (py y)))
在控制台输入:(make-point)
显示:<1,2>
其中,:print-function后面的函数名可以自定义,但是此函数的参数列表一定为三个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值