符号
符号本身是以要一个对象所存在。一个符号可以用任何字符串作为名称,可通过调用symbol-name来获得符号的名字缺省情况下,common lisp在读入时,将符号名字所有的英文字母都转为大写,则表示缺省时不区分大小写。
特殊语法用来参照符号:任何存在垂直杠(|)之间的字符序列被视为一个符号。在此种情况下读入的符号名不会转大写。宏字符和其他的字符被视为一般字符。
若想用垂直杠(|)作为符号,则在其前加一个反斜杠(\)
属性列表
每一个符号都有一个属性列表或成为plist。
函数get接受一个符号及任何类型的键值,然后返回符号的属性列表中,与键值相关的数值。
get使用eql比较各个键,若未找到某个属性时,返回nil。
要将一个值与一个键关联起来,则用setf和get。
测试代码:
CL-USER> (setf (get 'acd 'co) 're)
RE
CL-USER> (get 'acd 'co)
RE
一个符号可以有名字、home包、作为变量的值、作为函数的值、一个属性列表。
注意:符号实际是一个对象,当两个变量设成同一符号时,与两个变量设为相同列表一样:两个变都有指针指向同样的对象。
创建符号
概念上包是将名字映射到符号的符号表。每一个符号都属于一个特定的包。一个符号属于一个包,我们称为符号被包intermed了。数字
common lisp提供的数字类型:整数(integers)、浮点数(floating-point numbers)、比值(ratios)、复数(complex number)如:123(整数)、12.23(浮点数)、1.223e2(科学计数法表示浮点数)、2/3(比值)、#c(a b)(复数a+bi)
判断式:integerp、floatp、ratiop、complexp。判断是否为某种类型,是返回真。
通用经验法则:
1、若一个数值函数接收一个或多个浮点数作为参数,则返回值为浮点数(或一个由浮点数组成的复数)
2、可约分的比值会被约分。
3、若计算过程中复数的虚部会变成0,则复数会被转成实数。
4、2和3法则在参数读取时会直接运用。
类型转换:
float:可将任何实数转为一个浮点数
truncate:返回任何实数的整数部分,返回两个值,第一个为整数部分,第二个为传入参数减去第一个返回值(与实际小数部分有一点误差)
floor:返回小于等于其参数的最大整数。
ceiling:返回大于或等于其参数的最小整数。
round:返回最接近其参数的整数。
mod:仅返回floor会返回的第二个值
rem:返回truncate会返回的第二个值
signum:判断正负数。返回1、0、-1.分别表示正数、0、负数。若参数为浮点数,则返回的是浮点数的1.0、0.0、-1.0
abs:绝对值函数
numerator:返回分子。如:(numerator 1/2)→1
denominator:返回分母。如:(denominator 1/2)→2
realpart:返回复数的实数部分
imgpart:返回复数的虚数部分
random:随机数函数,接收一个参数用于表示随机数范围的上限,返回一个大于等于上限的数字且类型和参数一致
比较
=:数值上相等,即差为0,返回真
eql:类型和值都相等,返回真
一些其他的比较符:<、<=、>、>=、/=(不等于)
比较符号可以接受多个参数,当有多个参数时,等同于and语法。
如:(= w x y z)→(and (= w x) (= x y) (= y z))
(/= w x y z)→(and (/= w x) (/= w y) (/= w z)
(/= x y) (/= y z) (/= y z))
zerop:是否为0
plusp:是否大于0
minusp:是否小于0
oddp:是否为奇数
evenp:是否为偶数
只有=、/=、zerop可用于复数
算术
+和-可接受任何数量的参数,无参数返回0。其中-至少要有一个参数1+:自加1
1-:自减1
宏 incf:接受一个参数,返回参数加1的值,效果与1+等同
宏 decf:接受一个参数,返回参数减1的值,效果与1-等同
*:接受任何数量的参数,无参数返回1。
/:至少接受一个参数,接受一个参数时等同于(/ 1 n)。当给定两个整数时,返回的是一个比值而不是一个整数。若想等到整数需要用float函数转换一下类型。
expt:指数函数。如:(expt 2 3)→8
log:对数函数,其返回值是一个浮点数。如:(log 8 2)→3.0
exp:e的几次方,返回值为浮点数。如:(exp 2)→7.389056
若要找自然对数,则调用log时传入一个参数即可。如:(log 7.389056)→2.0
sqrt:平方根函数,返回一个浮点数。如:(sqrt 4)→2.0
三角函数
pi:是π的浮点表示法。其精度取决于编译器的实现
sin:正弦函数
cos:余弦函数
tan:正交函数
asin:正弦反函数
acos:余弦反函数
atan:正交反函数
参数介于-1到1时,asin,acos返回实数
sinh:双曲正弦
cosh:双曲余弦
tanh:双曲正交
asinh:双曲正弦反函数
acosh:双曲余弦反函数
atanh:双曲正交反函数
表示法
common lisp对整数大小没有限制,可以塞进一个字内存的小整数称为定数(fixnums)
当一个计算过程整数无法塞入一个字时,使用多个内存字的表示法(一个大数(bignum))
所以,一个整数的最大值取决于硬件的内存,而非语言的实现。
most-positive-fixnum:常量,表示整数的上限
most-negative-fixnum:常量,表示整数的下限
typep:判断是否为某个类型。第一个参数为要比较的参数,第二个参数为类型。如:(typep 1 'fixnum)