文章目录
lisp
lisp数字
在Lisp中处理数字主要涉及数值操作、数据类型识别以及一些与数学相关的函数。Lisp支持整数、浮点数、复数等多种数据类型,并且提供了许多内置的数学函数,适合在数值计算或数学运算中使用。下面是Lisp中一些与数字相关的操作和函数:
1. 数字类型
Lisp的数值类型包括:
- 整数 (Integer):如
1
、-10
- 浮点数 (Float):如
3.14
、-0.5
- 复数 (Complex):如
#C(2 3)
表示2+3i
2. 基本数值操作
Lisp支持一些基本的数学运算,如加法、减法、乘法、除法等。
(+ 1 2 3) ; 加法,返回 6
(- 5 2) ; 减法,返回 3
(* 4 3) ; 乘法,返回 12
(/ 10 2) ; 除法,返回 5
3. 常用数学函数
Lisp提供了许多常用的数学函数:
-
abs:求绝对值
(abs -10) ; 返回 10
-
expt:求幂
(expt 2 3) ; 返回 8,即2的3次幂
-
sqrt:求平方根
(sqrt 9) ; 返回 3.0
-
mod:取模(余数)
(mod 10 3) ; 返回 1
-
round、floor、ceiling、truncate:取整函数
(round 2.6) ; 返回 3 (floor 2.6) ; 返回 2 (ceiling 2.6) ; 返回 3 (truncate 2.6) ; 返回 2
4. 比较运算
Lisp提供了数值比较运算符:
- =:判断是否相等
- /=:判断是否不相等
- <、<=、>、>=:比较大小
(= 3 3) ; 返回 T
(/= 3 4) ; 返回 T
(< 2 5) ; 返回 T
(> 5 2) ; 返回 T
5. 检查数字类型
Lisp中可以使用以下函数来检查变量的数值类型:
- integerp:检查是否为整数
- floatp:检查是否为浮点数
- numberp:检查是否为数字
- complexp:检查是否为复数
(integerp 5) ; 返回 T
(floatp 3.14) ; 返回 T
(numberp 2) ; 返回 T
(complexp #C(2 3)) ; 返回 T
6. 复数操作
Lisp支持复数的创建与操作,可以使用make-complex
来创建复数,也可以使用realpart
和imagpart
来提取实部和虚部。
(setq z (make-complex 2 3)) ; 创建复数2+3i
(realpart z) ; 返回 2
(imagpart z) ; 返回 3
示例:阶乘函数
一个简单的阶乘函数示例:
(defun factorial (n)
(if (<= n 1)
1
(* n (factorial (- n 1)))))
以上函数实现了阶乘计算,递归地计算n!
。
在Lisp中,字面数值(literal numbers)
是指直接写在代码中的数字。Lisp支持多种字面数值的表示方法,包括整数、浮点数、复数、分数等。
1. 整数
整数是最基本的数值类型,可以直接书写为正数或负数。例如:
42 ; 正整数
-7 ; 负整数
0 ; 零
2. 浮点数
浮点数用于表示带有小数点的数值,通常以小数点的形式或科学记数法表示。例如:
3.14 ; 小数形式
-0.5 ; 负浮点数
6.022e23 ; 科学记数法,表示6.022×10^23
3. 分数
在Lisp中,可以使用分数来表示有理数,分数使用分子/
分母的形式表示。例如:
3/4 ; 表示3/4
-7/2 ; 表示-7/2
Lisp中的分数会自动化简。例如,6/8
会被简化为3/4
。
4. 复数
复数是由实部和虚部组成的数,在Lisp中可以通过#C(实部 虚部)
表示。例如:
#C(2 3) ; 表示复数2 + 3i
#C(-1 0.5) ; 表示复数-1 + 0.5i
Lisp支持对复数进行操作,例如加、减、乘、除等。
5. 进制表示
Lisp支持多种进制的整数表示。可以通过前缀来指定数值的进制:
#b
:二进制(binary)#o
:八进制(octal)#x
:十六进制(hexadecimal)#d
:十进制(decimal,默认)
例如:
#b1010 ; 二进制,等于10
#o12 ; 八进制,等于10
#xA ; 十六进制,等于10
#d10 ; 十进制
6. 特殊常数
Lisp还支持一些数学常数:
pi
:圆周率,约等于3.14159
most-positive-fixnum
:最大整数most-negative-fixnum
:最小整数
例如:
pi ; 圆周率
most-positive-fixnum ; 最大整数
most-negative-fixnum ; 最小整数
示例代码
以下是一些包含不同类型字面数值的示例代码:
(+ 42 3.14 -7) ; 加法操作,整数和浮点数相加
(* 3/4 2) ; 分数运算,返回3/2
(realpart #C(2 3)) ; 获取复数的实部,返回2
(imagpart #C(2 3)) ; 获取复数的虚部,返回3
这些字面数值表示法可以帮助在Lisp中精确地表达不同的数值类型,并且简化了代码书写和数值操作。
在Lisp中,运算符
通常是以前缀表达式的形式调用的,运算符写在前面,后跟操作数。Lisp提供了多种内置的数学运算和逻辑运算支持。
1. 数学运算
加法
可以对两个或多个数字进行加法运算。
(+ 2 3) ; 返回 5
(+ 1 2 3 4) ; 返回 10
减法
减法操作可以减去一个或多个数。
(- 5 3) ; 返回 2
(- 10 2 3) ; 返回 5 (等同于 10 - 2 - 3)
乘法
乘法可以对多个数字进行运算。
(* 2 3) ; 返回 6
(* 2 3 4) ; 返回 24
除法
除法用于对多个数字进行除法操作,返回浮点数结果。
(/ 10 2) ; 返回 5.0
(/ 20 2 2) ; 返回 5.0 (等同于 20 / 2 / 2)
求余和模
Lisp提供了mod
和rem
函数来计算除法的余数。
mod
:取模运算,结果与除数符号一致。rem
:求余运算,结果与被除数符号一致。
(mod 10 3) ; 返回 1
(rem 10 3) ; 返回 1
(mod -10 3) ; 返回 2
(rem -10 3) ; 返回 -1
求幂
expt
函数用于计算幂。
(expt 2 3) ; 返回 8 (即2的3次幂)
求平方根
sqrt
函数用于计算平方根。
(sqrt 9) ; 返回 3.0
2. 比较运算
Lisp的比较运算符包括=
、<
、<=
、>
、>=
、/=
,可以对数字进行比较。
(= 3 3) ; 返回 T
(< 2 5) ; 返回 T
(> 5 2) ; 返回 T
(/= 3 4) ; 返回 T (表示不等)
3. 逻辑运算
Lisp提供了常用的逻辑运算符,包括and
、or
和not
。
and
:如果所有参数都是真值,则返回最后一个真值,否则返回NIL
。or
:如果有任何参数是真值,则返回第一个真值,否则返回NIL
。not
:取反,如果参数为NIL
,则返回T
,否则返回NIL
。
(and T T) ; 返回 T
(and T NIL) ; 返回 NIL
(or NIL T) ; 返回 T
(not T) ; 返回 NIL
(not NIL) ; 返回 T
4. 常用的数学函数
Lisp还提供了一些实用的数学函数,例如abs
、max
、min
等:
abs
:求绝对值。max
:求最大值。min
:求最小值。
(abs -10) ; 返回 10
(max 1 2 3) ; 返回 3
(min 1 2 3) ; 返回 1
5. 复数运算
Lisp支持复数运算,可以直接进行加减乘除,并且提供了realpart
和imagpart
来提取复数的实部和虚部。
(setq z1 #C(2 3)) ; 定义复数 z1 = 2 + 3i
(setq z2 #C(1 -1)) ; 定义复数 z2 = 1 - i
(+ z1 z2) ; 返回 #C(3 2)
(- z1 z2) ; 返回 #C(1 4)
(* z1 z2) ; 返回 #C(5 1)
(/ z1 z2) ; 返回 #C(-0.5 2.5)
(realpart z1) ; 返回 2
(imagpart z1) ; 返回 3
6. 条件判断
可以使用if
和cond
来进行条件判断。
if表达式
if
用于简单的二分判断。
(if (> 3 2)
'yes
'no) ; 返回 'yes
cond表达式
cond
用于多条件判断,类似于多个if-else
。
(cond
((> 3 5) 'greater)
((< 3 5) 'less)
(T 'equal)) ; 返回 'less
示例:阶乘函数
下面是用Lisp实现的一个递归阶乘函数,示例中也展示了运算的灵活性:
(defun factorial (n)
(if (<= n 1)
1
(* n (factorial (- n 1)))))
总结
Lisp的运算方式简洁且灵活,通过这些基本运算符,可以方便地进行各种数学和逻辑运算。
在Lisp中,数值比较操作符
用于对数值进行大小、等值、不等值的比较。以下是Lisp中常用的数值比较函数及其用法。
1. 相等比较
=
:用于判断数值是否相等。只适用于数值类型。/=
:用于判断数值是否不相等。如果任意两个数值不等,返回T
。
(= 3 3) ; 返回 T,表示 3 等于 3
(= 3 4) ; 返回 NIL,表示 3 不等于 4
(/= 3 4) ; 返回 T,表示 3 不等于 4
(/= 3 3 3) ; 返回 NIL,所有数值相等
2. 大小比较
<
:判断第一个数是否小于第二个数。<=
:判断第一个数是否小于或等于第二个数。>
:判断第一个数是否大于第二个数。>=
:判断第一个数是否大于或等于第二个数。
可以连续比较多个数值,当所有条件成立时,返回T
。
(< 2 3) ; 返回 T,表示 2 小于 3
(<= 2 2) ; 返回 T,表示 2 小于或等于 2
(> 5 3) ; 返回 T,表示 5 大于 3
(>= 5 5) ; 返回 T,表示 5 大于或等于 5
(< 1 2 3) ; 返回 T,表示 1 < 2 < 3
(> 3 2 1) ; 返回 T,表示 3 > 2 > 1
(<= 1 2 2 3) ; 返回 T,表示 1 <= 2 <= 2 <= 3
3. 综合示例:比较函数
可以用这些比较操作符定义函数来实现逻辑判断,例如编写一个函数来比较两个数的大小。
(defun compare (a b)
(cond
((= a b) "Equal")
((< a b) "Less than")
((> a b) "Greater than")))
调用示例:
(compare 3 5) ; 返回 "Less than"
(compare 5 3) ; 返回 "Greater than"
(compare 4 4) ; 返回 "Equal"
4. 数值比较的特殊情况
在比较中,如果操作数包含复数,则需要分开比较复数的实部和虚部,因为Lisp的这些数值比较操作符并不直接支持复数。
在Lisp中,字符
是基础数据类型之一,用于表示单个字符。字符常常用于字符串处理或特定的字符判断操作。字符在Lisp中通常使用单引号#\
开头的形式来表示。例如,字符A
表示为#\A
。
1. 字符表示
Lisp中的字符可以使用#\
前缀来表示:
#\A ; 表示字符 A
#\a ; 表示字符 a(与大写不同)
#\Space ; 表示空格字符
#\Tab ; 表示制表符
#\Newline ; 表示换行符
2. 字符操作函数
Lisp提供了许多函数来处理和比较字符。
字符比较
char=
:判断两个字符是否相等。char<
:判断第一个字符是否小于第二个字符。char<=
:判断第一个字符是否小于或等于第二个字符。char>
:判断第一个字符是否大于第二个字符。char>=
:判断第一个字符是否大于或等于第二个字符。
(char= #\A #\A) ; 返回 T
(char< #\A #\B) ; 返回 T
(char> #\B #\A) ; 返回 T
(char<= #\A #\B) ; 返回 T
(char>= #\B #\A) ; 返回 T
不区分大小写的字符比较
对于不区分大小写的字符比较,可以使用char-equal
、char-lessp
等函数。
char-equal
:判断两个字符是否相等,不区分大小写。char-lessp
:判断第一个字符是否小于第二个字符,不区分大小写。char-greaterp
:判断第一个字符是否大于第二个字符,不区分大小写。
(char-equal #\A #\a) ; 返回 T
(char-lessp #\a #\B) ; 返回 T
(char-greaterp #\B #\a) ; 返回 T
3. 字符转换
Lisp中可以使用以下函数来转换字符的大小写:
char-upcase
:将字符转换为大写。char-downcase
:将字符转换为小写。
(char-upcase #\a) ; 返回 #\A
(char-downcase #\A) ; 返回 #\a
4. 字符判断
Lisp提供了几个判断字符类型的函数:
alpha-char-p
:判断字符是否为字母。digit-char-p
:判断字符是否为数字字符,返回对应的数字。alphanumericp
:判断字符是否为字母或数字。upper-case-p
:判断字符是否为大写字母。lower-case-p
:判断字符是否为小写字母。
(alpha-char-p #\A) ; 返回 T
(digit-char-p #\3) ; 返回 3
(alphanumericp #\B) ; 返回 T
(upper-case-p #\A) ; 返回 T
(lower-case-p #\a) ; 返回 T
5. 生成字符
可以使用code-char
将整数转为字符,或者使用char-code
将字符转为对应的整数编码。
(char-code #\A) ; 返回 65,字符 A 的 ASCII 编码
(code-char 65) ; 返回 #\A,将编码 65 转为字符
6. 示例:检查字符类型
下面是一个示例函数,用于检查给定字符的类型。
(defun check-char-type (ch)
(cond
((alpha-char-p ch) "Alphabet")
((digit-char-p ch) "Digit")
((alphanumericp ch) "Alphanumeric")
((upper-case-p ch) "Uppercase")
((lower-case-p ch) "Lowercase")
(T "Other")))
调用示例:
(check-char-type #\A) ; 返回 "Alphabet"
(check-char-type #\3) ; 返回 "Digit"
总结
在Lisp中,字符是一种重要的数据类型,许多函数支持对字符进行比较、转换、类型判断等操作。这些函数使得字符处理更加便捷和灵活。
字符比较
在Lisp中,字符比较操作主要用于比较两个字符的大小、相等性等。Lisp提供了区分大小写和不区分大小写的比较操作符,常用的字符比较函数有以下几种:
1. 区分大小写的字符比较
char=
:判断两个字符是否相等,区分大小写。char<
:判断第一个字符是否小于第二个字符,按字符编码排序,区分大小写。char<=
:判断第一个字符是否小于或等于第二个字符。char>
:判断第一个字符是否大于第二个字符。char>=
:判断第一个字符是否大于或等于第二个字符。
这些函数在比较字符时,会根据字符的ASCII(或Unicode)编码来判断大小。
(char= #\A #\A) ; 返回 T,表示字符相等
(char= #\A #\a) ; 返回 NIL,A 不等于 a(区分大小写)
(char< #\A #\B) ; 返回 T,A 的编码小于 B
(char> #\B #\A) ; 返回 T,B 的编码大于 A
(char<= #\A #\A) ; 返回 T,A 小于或等于 A
(char>= #\B #\A) ; 返回 T,B 大于或等于 A
2. 不区分大小写的字符比较
Lisp还提供了不区分大小写的字符比较函数。这些函数在比较字符时,会自动将字符转换为相同的大小写进行比较。
char-equal
:判断两个字符是否相等,不区分大小写。char-lessp
:判断第一个字符是否小于第二个字符,不区分大小写。char-not-greaterp
:判断第一个字符是否小于或等于第二个字符,不区分大小写。char-greaterp
:判断第一个字符是否大于第二个字符,不区分大小写。char-not-lessp
:判断第一个字符是否大于或等于第二个字符,不区分大小写。
(char-equal #\A #\a) ; 返回 T,不区分大小写,A 等于 a
(char-lessp #\a #\B) ; 返回 T,不区分大小写,a 小于 B
(char-greaterp #\B #\a) ; 返回 T,不区分大小写,B 大于 a
(char-not-greaterp #\a #\A) ; 返回 T,不区分大小写,a 等于 A
(char-not-lessp #\B #\b) ; 返回 T,不区分大小写,B 等于 b
3. 示例:比较函数
下面是一个使用字符比较函数的示例代码,它检查两个字符的关系,并返回相应的信息。
(defun compare-chars (ch1 ch2)
(cond
((char-equal ch1 ch2) "Characters are equal (case-insensitive)")
((char< ch1 ch2) "First character is less than second (case-sensitive)")
((char> ch1 ch2) "First character is greater than second (case-sensitive)")
((char-lessp ch1 ch2) "First character is less than second (case-insensitive)")
((char-greaterp ch1 ch2) "First character is greater than second (case-insensitive)")
(t "Characters are different")))
调用示例:
(compare-chars #\A #\a) ; 返回 "Characters are equal (case-insensitive)"
(compare-chars #\A #\B) ; 返回 "First character is less than second (case-sensitive)"
4. 应用场景
字符比较可以用于排序、文本处理、字符匹配等操作。通过区分大小写和不区分大小写的比较,可以灵活应对不同的场景需求。
参考文献
- chatgpt