初识LISP(3)——谓词、字符及数组

2024-02-08 12:32
文章标签 初识 数组 字符 谓词 lisp

本文主要是介绍初识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)——谓词、字符及数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/691055

相关文章

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2