ANSI Common Lisp译本笔记7

来源:互联网 发布:淘宝怎么排名靠前 编辑:程序博客网 时间:2024/06/05 06:20

符号

符号本身是以要一个对象所存在。一个符号可以用任何字符串作为名称,可通过调用symbol-name来获得符号的名字
缺省情况下,common lisp在读入时,将符号名字所有的英文字母都转为大写,则表示缺省时不区分大小写。

特殊语法用来参照符号:任何存在垂直杠(|)之间的字符序列被视为一个符号。在此种情况下读入的符号名不会转大写。宏字符和其他的字符被视为一般字符。
若想用垂直杠(|)作为符号,则在其前加一个反斜杠(\)


属性列表

每一个符号都有一个属性列表或成为plist。
函数get接受一个符号及任何类型的键值,然后返回符号的属性列表中,与键值相关的数值。
get使用eql比较各个键,若未找到某个属性时,返回nil。

要将一个值与一个键关联起来,则用setf和get。

测试代码:

CL-USER> (setf (get 'acd 'co) 're)RECL-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都是从参数中导出整数。其第二个返回值和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)


原创粉丝点击