初识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 













  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值