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

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

如何将一个文件里不包含某个字符的行输出到另一个文件?

第一种: grep -v 'string' filename > newfilenamegrep -v 'string' filename >> newfilename 第二种: sed -n '/string/!'p filename > newfilenamesed -n '/string/!'p filename >> newfilename

PHP7扩展开发之数组处理

前言 这次,我们将演示如何在PHP扩展中如何对数组进行处理。要实现的PHP代码如下: <?phpfunction array_concat ($arr, $prefix) {foreach($arr as $key => $val) {if (isset($prefix[$key]) && is_string($val) && is_string($prefix[$key])) {$arr[