本文主要是介绍初识LISP(3)——谓词、字符及数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、LISP—谓词
谓词的作用是做一些条件判断,从而筛选出需要的结果(比如一组数中选出偶数)。
谓词 | 描述 |
---|---|
atom | 它接受一个参数,并返回t如果参数是一个原子或,否则nil。 |
equal | 它有两个参数,并返回t,如果他们在结构上相同或否则nil |
eq | 它有两个参数,并返回t,如果它们是相同的相同的对象,共享相同的内存位置或否则nil |
eql | 它有两个参数,并返回t如果参数相等,或者如果他们是同一类型具有相同值的数字,或者如果他们是代表相同的字符的字符对象,否则返回nil |
evenp | 它接受一个数字参数,并返回t如果参数为偶数或否则为nil。 |
oddp | 它接受一个数字参数,并返回t如果参数为奇数或否则为nil。 |
zerop | 它接受一个数字参数,并返回t如果参数是零或否则为nil。 |
null | 它接受一个参数,并返回t,如果参数的计算结果为nil,否则返回nil。 |
listp | 它接受一个参数,并返回t如果参数的计算结果为一个列表,否则返回nil。 |
greaterp | 这需要一个或多个参数,并返回t,如果不是有一个单一的参数或参数是从左到右,或如果无先后,否则为nil。 |
lessp | 这需要一个或多个参数,并返回t,如果不是有一个单一的参数或参数是从左到右依次更小的向右,或否则为nil. |
numberp | 它接受一个参数,并返回t如果参数是一个数字,否则为nil。 |
symbolp | 它接受一个参数,并返回t如果参数是一个符号,否则返回nil。 |
integerp | 它接受一个参数,并返回t如果参数是一个整数,否则返回nil。 |
rationalp | 它接受一个参数,并返回t如果参数是有理数,无论是比例或数量,否则返回nil>。 |
floatp | 它接受一个参数,并返回t当参数则返回一个浮点数否则为nil。 |
realp | 它接受一个参数,并返回t如果参数是一个实数,否则返回nil。 |
complexp | 它接受一个参数,并返回t如果参数是一个复数,否则返回nil。 |
characterp | 它接受一个参数,并返回t如果参数是一个字符,否则返回nil。 |
stringp | 它接受一个参数,并返回t,如果参数是一个字符串对象,否则返回nil。 |
arrayp | 它接受一个参数,并返回t如果参数是一个数组对象,否则返回nil。 |
packagep | 它接受一个参数,并返回t,如果参数是一个包,否则返回nil。 |
;逐一对谓词的测试
(write (atom 'abcd))
(terpri)
(write (equal 'a 'b))
(terpri)
(write (evenp 10))
(terpri)
(write (evenp 7 ))
(terpri)
(write (oddp 7 ))
(terpri)
(write (zerop 0.0000000001))
(terpri)
(write (eq 3 3.0 ))
(terpri)
(write (equal 3 3.0 ))
(terpri)
(write (null nil ));递归实现的阶乘
(defun factorial(n)(cond ((zerop n) 1)(t (* n (factorial(- n 1))));这里的t可有可无,在这里的意义就是此句一定执行,但没有t,依照函数返回最后一个表达式的值,结果依然可以得出。 )
)
(setq n 8)
(format t "factorial ~d is : ~d " n (factorial n))
二、LISP—数字
这没什么好说的,就是一些数学运算。
Data type | 描述 |
---|---|
fixnum | 这个数据类型表示的整数哪些不是太大,大多在范围-215到215-1(它是依赖于机器) |
bignum | 这些都是非常大的数字有大小受限于内存中分配LISP量,它们不是长整数数字。 |
ratio | 表示两个数中的分子/分母形式的比率。在/函数总是产生结果的比率,当其参数都是整数。 |
float | 它表示非整数。还有随着精密四个浮点数据类型。 |
complex | 它表示复数,这是由#C表示。实部和虚部可以是两者或者理性或浮点数。 |
Function | 描述 |
---|---|
+, -, *, / | 各算术运算 |
sin, cos, tan, acos, asin, atan | 相应的三角函数 |
sinh, cosh, tanh, acosh, asinh, atanh | 相应的双曲函数 |
exp | 幂函数,计算 ex |
expt | 幂函数,需要基础和幂两者 |
sqrt | 它可以计算一个数的平方根 |
log | 对数函数。它的一个参数给出,则它计算其自然对数,否则将第二个参数被用作基数 |
conjugate | 它计算一个数的复共轭,如有任何实数,它返回数字本身 |
abs | 它返回一个数的绝对值(或幅度) |
gcd | 它可以计算给定数字的最大公约数 |
lcm | 它可以计算给定数的最小公倍数 |
isqrt | 它提供了最大的整数小于或等于一个给定的自然数的精确平方根。 |
floor, ceiling, truncate, round | 所有这些函数把一个数字的两个参数,并返回商;地面返回的最大整数不大于比,天花板选择较小的整数,它比比率越大,截断选择相同符号的整数的比值与最大的绝对值是小于的比值的绝对值,与圆公司选用一个整数,它是最接近比值 |
ffloor, fceiling, ftruncate, fround | 确实与上述相同,但返回的商作为一个浮点数 |
mod, rem | 返回除法运算的余数 |
float | 将实数转换为浮点数 |
rational, rationalize | 将实数转换为有理数 |
numerator, denominator | 返回有理数的各个部分 |
realpart, imagpart | 返回一个复数的实部和虚部 |
;数字
(write (/ 1 2))
(terpri)
(write ( + (/ 1 2) (/ 3 4)))
(terpri)
(write ( + #c( 1 2) #c( 3 -4)));映射对应的进行运算(write (/ 45 78))
(terpri)
(write (floor 45 78));商取整
(terpri)
(write (/ 3456 75))
(terpri)
(write (floor 3456 75))
(terpri)
(write (ceiling 3456 75))
(terpri)
(write (truncate 3456 75))
(terpri)
(write (round 3456 75))
(terpri)
(write (ffloor 3456 75))
(terpri)
(write (fceiling 3456 75))
(terpri)
(write (ftruncate 3456 75))
(terpri)
(write (fround 3456 75))
(terpri)
(write (mod 3456 75))
(terpri)
(setq c (complex 6 7))
(write c)
(terpri)
(write (complex 5 -9))
(terpri)
(write (realpart c))
(terpri)
(write (imagpart c))
三、LISP—字符
在LISP中,字符被表示为字符类型的数据对象。
可以记#前字符本身之前的字符的对象。例如,#一个表示字符a。
空格和其它特殊字符可以通过#前面的字符的名称前表示。例如,#空格代表空格字符Common Lisp允许使用以下特殊字符在代码。他们被称为半标准字符。
-
#Backspace
-
#Tab
-
#Linefeed
-
#Page
-
#Return
-
#Rubout
Case Sensitive Functions | Case-insensitive Functions | 描述 |
---|---|---|
char= | char-equal | 检查如果操作数的值都相等与否,如果是的话那么条件为真。 |
char/= | char-not-equal | 检查如果操作数的值都不同,或没有,如果值不相等,则条件为真。 |
char< | char-lessp | 检查如果操作数的值单调递减。 |
char> | char-greaterp | 检查如果操作数的值单调递增。 |
char<= | char-not-greaterp | 如有左操作数的值大于或等于下一个右操作数的值,如果是则条件为真检查。 |
char>= | char-not-lessp | 如有左操作数的值小于或等于其右操作数的值,如果是,则条件为真检查。 |
(write 'a)
(terpri)
(write #a)
(terpri)
(write-char #a)
(terpri)
;(write-char 'a); case-sensitive comparison
(write (char= #a #))
(terpri)
(write (char= #a #a))
(terpri)
(write (char= #a #A))
(terpri)
;case-insensitive comparision
(write (char-equal #a #A))
(terpri)
(write (char-equal #a #))
(terpri)
(write (char-lessp #a # #c))
(terpri)
(write (char-greaterp #a # #c))
四、LISP—数组
LISP中的数组,概念上与其他语言没有什么分别,make-array函数有许多其他的参数,总的来讲功能还是挺多的。
参数 | 描述 |
---|---|
dimensions | 它给该数组的大小。它是一个数字为一维数组,而对于多维数组列表。 |
:element-type | 它是类型说明符,默认值是T,即任何类型 |
:initial-element | 初始元素值。它将使一个数组的所有初始化为一个特定值的元素。 |
:initial-contents | 初始内容作为对象。 |
:adjustable | 它有助于创造一个可调整大小(或可调)向量,其底层的内存可以调整大小。该参数是一个布尔值,表示数组是否可调与否,默认值是nil。 |
:fill-yiibaier | 它跟踪实际存储在一个可调整大小的矢量元素的数目 |
:displaced-to | 它有助于创造一个移位的数组或共享数组共享其内容与指定的数组。这两个数组应该有相同的元素类型。位移到选项可能无法使用:displaced-to或:initial-contents选项。此参数默认为nil。 |
:displaced-index-offset | 它给出了索引偏移创建的共享数组。 |
; 创建一个一维10个元素的数组
(write (setf my-array (make-array '(10))))
(setf (aref my-array 0) 1)
(setf (aref my-array 1) 'abc);注意,没有单引号,会被当作变量名
(setf (aref my-array 2) "d")
(setf (aref my-array 3) 1)
(setf (aref my-array 4) 1)
(setf (aref my-array 5) 1)
(setf (aref my-array 6) 1)
(setf (aref my-array 7) 1)
(setf (aref my-array 8) 1)
(setf (aref my-array 9) 1)
(terpri)
(write my-array);创建一个二维数组
(setf x (make-array '(3 3) :initial-contents '((1 2 3) (4 5 6) (7 8 9))));这里冒号与“initial-contents”之间不能有空格
(write x);
(setf a (make-array '(4 3)));这里使用setf和setq都可以
(dotimes (i 4)(dotimes (j 3)(setf (aref a i j) (list i 'x j '= (* i j)));以列表的形式赋值给a(i,j))
)(dotimes (i 4)(dotimes (j 3)(print (aref a i j));打印出存储在每个元素中的列表)
);“displaced-to”为设置共享数组,“displaced-index-offset”显示索引的偏移地址,
;从该偏移地址开始复制,直到填满新建的数组
(setf a (make-array '(3 2 3):initial-contents '(((1 2 3) (a b c)) ((4 5 6) (d e f)) ((7 8 9) (g h i))))
)
(setf b (make-array '(3 2):displaced-to a:displaced-index-offset 3)
)
(write a)
(terpri)
(write b);这里将数组关键字都进行了尝试,但注释中的代码在编译器中报错,
;可能是编译器问题,也可能是代码问题,先将问题搁置,在之后的学习中如果了解到再回过头来解决吧
;a one dimensional array with 5 elements,
;initail value 5
(write (make-array 5 :initial-element 5))
(terpri)
;two dimensional array, with initial element a
(write (make-array '(2 3) :initial-element 'a))
(terpri)
;an array of capacity 14, but fill yiibaier 5, is 5
;(write(length (make-array 14 :fill-yiibaier 5)))
;(terpri)
;however its length is 14
;(write (array-dimensions (make-array 14 :fill-yiibaier 5)))
;(terpri)
; a bit array with all initial elements set to 1
(write(make-array 10 :element-type 'bit :initial-element 1))
(terpri)
; a character array with all initial elements set to a
; is a string actually
;(write(make-array 10 :element-type 'character :initial-element #a))
;(terpri)
; a two dimensional array with initial values a
(setq myarray (make-array '(2 2) :initial-element 'a :adjustable t));设置为可调整数组
(write myarray)
(terpri)
;readjusting the array
(adjust-array myarray '(1 3) :initial-element 'b);重新调整为1x3的数组,前两个元素为a没有被覆盖,
(write myarray) ;最后一个元素是新增的,所以初始化为b
这篇关于初识LISP(3)——谓词、字符及数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!