Scheme编程中的数值、字符、字符串和向量操作详解
发布时间: 2025-08-16 02:19:23 阅读量: 2 订阅数: 6 


Scheme编程语言:从入门到精通
### Scheme编程中的数值、字符、字符串和向量操作详解
在编程领域,对数值、字符、字符串和向量的操作是非常基础且重要的部分。下面将详细介绍相关的操作函数和方法。
#### 1. 数值操作
在数值操作方面,有几个重要的函数值得关注:
- **平方根计算**:`(flsqrt fl)` 函数用于返回 `fl` 的主平方根。需要注意的是,`-0.0` 的平方根是 `-0.0`,而对于其他负数,结果可能是 `NaN` 或其他未指定的浮点数。例如:
```scheme
(flsqrt 4.0) ; 结果为 2.0
(flsqrt 0.0) ; 结果为 0.0
(flsqrt -0.0) ; 结果为 -0.0
```
- **幂运算**:`(flexpt fl1 fl2)` 函数用于计算 `fl1` 的 `fl2` 次幂。当 `fl1` 为负数且 `fl2` 不是整数时,结果可能是 `NaN` 或其他未指定的浮点数;当 `fl1` 和 `fl2` 都为 0 时,结果为 1.0;当 `fl1` 为 0 且 `fl2` 为正数时,结果为 0。例如:
```scheme
(flexpt 3.0 2.0) ; 结果为 9.0
(flexpt 0.0 +inf.0) ; 结果为 0.0
```
- **数值类型转换**:
- `(fixnum->flonum fx)` 函数用于将 `fx` 转换为最接近的浮点数表示,它是 `inexact` 的受限变体。
- `(real->flonum real)` 函数用于将 `real` 转换为最接近的浮点数表示,当输入为精确实数时,它是 `inexact` 的受限变体;当输入为非浮点数的不精确实数时,它将其转换为最接近的浮点数。例如:
```scheme
(fixnum->flonum 0) ; 结果为 0.0
(fixnum->flonum 13) ; 结果为 13.0
(real->flonum -1/2) ; 结果为 -0.5
(real->flonum 1s3) ; 结果为 1000.0
```
#### 2. 字符操作
字符在编程中是原子对象,可表示字母、数字、特殊符号和非图形控制字符等。字符的书写以 `#\` 为前缀,例如 `#\A` 表示字母 `A`。对于换行符、空格和制表符,除了可以写成 `#\newline`、`#\space` 和 `#\tab` 外,也可以用上述方式书写。此外,任何 Unicode 字符都可以用 `#\xn` 的语法书写,其中 `n` 由一个或多个十六进制数字组成,表示有效的 Unicode 标量值。
字符操作的相关函数如下:
- **字符比较**:
- `(char=? char1 char2 char3 ...)`、`(char<? char1 char2 char3 ...)`、`(char>? char1 char2 char3 ...)`、`(char<=? char1 char2 char3 ...)`、`(char>=? char1 char2 char3 ...)` 这些谓词的行为与数值谓词 `=`、`<`、`>`、`<=` 和 `>=` 类似。例如:
```scheme
(char>? #\a #\b) ; 结果为 #f
(char<? #\a #\b) ; 结果为 #t
(char<? #\a #\b #\c) ; 结果为 #t
(let ([c #\r])
(char<=? #\a c #\z)) ; 结果为 #t
(char<=? #\Z #\W) ; 结果为 #f
(char=? #\+ #\+) ; 结果为 #t
```
- `(char-ci=? char1 char2 char3 ...)`、`(char-ci<? char1 char2 char3 ...)`、`(char-ci>? char1 char2 char3 ...)`、`(char-ci<=? char1 char2 char3 ...)`、`(char-ci>=? char1 char2 char3 ...)` 这些谓词与上述谓词类似,但不区分大小写,即比较参数的大小写折叠版本。例如:
```scheme
(char-ci<? #\a #\B) ; 结果为 #t
(char-ci=? #\W #\w) ; 结果为 #t
(char-ci=? #\= #\+) ; 结果为 #f
(let ([c #\R])
(list (char<=? #\a c #\z)
(char-ci<=? #\a c #\z))) ; 结果为 (#f #t)
```
- **字符属性判断**:
- `(char-alphabetic? char)` 用于判断字符是否为字母。
- `(char-numeric? char)` 用于判断字符是否为数字。
- `(char-whitespace? char)` 用于判断字符是否为空白字符。例如:
```scheme
(char-alphabetic? #\a) ; 结果为 #t
(char-alphabetic? #\T) ; 结果为 #t
(char-alphabetic? #\8) ; 结果为 #f
(char-alphabetic? #\$) ; 结果为 #f
(char-numeric? #\7) ; 结果为 #t
(char-numeric? #\2) ; 结果为 #t
(char-numeric? #\X) ; 结果为 #f
(char-numeric? #\space) ; 结果为 #f
(char-whitespace? #\space) ; 结果为 #t
(char-whitespace? #\newline) ; 结果为 #t
(char-whitespace? #\Z) ; 结果为 #f
```
- **字符大小写判断和转换**:
- `(char-lower-case? char)` 用于判断字符是否为小写字母。
- `(char-upper-case? char)` 用于判断字符是否为大写字母。
- `(char-title-case? char)` 用于判断字符是否为标题大小写字母。
- `(char-upcase char)` 用于将字符转换为大写字母。
- `(char-downcase char)` 用于将字符转换为小写字母。
- `(char-titlecase char)` 用于将字符转换为标题大小写字母。
- `(char-foldcase char)` 用于将字符进行大小写折叠。例如:
```scheme
(char-lower-case? #\r) ; 结果为 #t
(char-lower-case? #\R) ; 结果为 #f
(char-upper-case? #\r) ; 结果为 #f
(char-upper-case? #\R) ; 结果为 #t
(char-title-case? #\I) ; 结果为 #f
(char-title-case? #\x01C5) ; 结果为 #t
(char-upcase #\g) ; 结果为 #\G
(char-upcase #\G) ; 结果为 #\G
(char-upcase #\7) ; 结果为 #\7
(char-upcase #\ ) ; 结果为 #\
(char-downcase #\g) ; 结果为 #\g
(char-downcase #\G) ; 结果为 #\g
(char-downcase #\7) ; 结果为 #\7
(char-downcase #\ ) ; 结果为 #\
(char-titlecase #\g) ; 结果为 #\G
(char-titlecase #\G) ; 结果为 #\G
(char-titlecase #\7) ; 结果为 #\7
(char-titlecase #\ ) ; 结果为 #\
(char-foldcase #\g) ; 结果为 #\g
(char-foldcase #\G) ; 结果为 #\g
(char-foldcase #\7) ; 结果为 #\7
(char-foldcase #\ ) ; 结果为 #\
```
- **字符与整数的转换**:
- `(char->integer char)` 用于将字符转换为其 Unicode 标量值的精确整数表示。
- `(integer->char n)` 用于将精确整数 `n` 转换为对应的字符,`n` 必须是有效的 Unicode 标量值。例如:
```scheme
(char->integer #\newline) ; 结果为 10
(char->integer #\space) ; 结果为 32
(- (char->integer #\Z) (char->integer #\A)) ; 结果为
```
0
0
相关推荐









