# 字符
`chars/*` 是字符分类命名空间:回答字符如何分类的谓词,外加两个显式的按字符粒度的字符串动词。这些谓词涵盖语言用于标识符和类词记号的 ASCII 约定,而 `chars/count` 和 `chars/slice` 是基于码点的 `len` 和 `slice` 的自说明拼写——提醒你字符串索引基于字符而非字节(见 字符串)。每个 `chars/*` 函数都在所有宿主中注册,无需导入;标识符谓词与 语法与风格 中的词法规则一致。
## 函数
| 函数 | 用途 |
|---|---|
| `chars/word? ch` | 词字符:字母数字或 `_ - ? ! /` |
| `chars/digit? ch` | 数字(`0`-`9`) |
| `chars/alpha? ch` | 字母(`a`-`z`、`A`-`Z`) |
| `chars/upper? ch` | 大写字母(`A`-`Z`) |
| `chars/lower? ch` | 小写字母(`a`-`z`) |
| `chars/space? ch` | 空白:空格、制表符、换行、回车 |
| `chars/ident-start? ch` | 标识符起始:字母或 `_` |
| `chars/ident-cont? ch` | 标识符延续:字母数字或 `_ - ? ! /` |
| `chars/count s` | 码点数量(与 `len` 相同) |
| `chars/slice s a b` | 码点范围 `[a, b)`(与 `slice` 相同) |
说明:
- 八个谓词接受单字符字符串并返回布尔值。空字符串为 `false`。传入更长的字符串时,它们分类其第一个字符(`[chars/digit? "42"]` 为 `true`),因此请一次传入一个字符。
- 分类仅限 ASCII——`[chars/upper? "É"]` 为 `false`,非 ASCII 字母永远不是词字符。
- `chars/word?` 和 `chars/ident-cont?` 接受同一集合:字母、数字、`_`、`-`、`?`、`!` 和 `/`。`chars/ident-start?` 更严格:仅字母和 `_`。
- `chars/count` 与字符串上的 `len` 相同;`bytes/len` 是 UTF-8 字节大小。`chars/slice` 会钳制边界:`b` 至字符串末尾,`a` 至 0,而 `a >= b` 得到 `""`。
## 示例
### 字符分类
echo [chars/digit? "7"] # true echo [chars/alpha? "x"] # true echo [chars/space? "\t"] # true echo [chars/upper? "É"] # false — ASCII only echo [chars/word? "/"] # true — namespace separators are word chars
### 标识符规则
echo [chars/ident-start? "_"] # true echo [chars/ident-start? "-"] # false echo [chars/ident-cont? "?"] # true echo [chars/ident-cont? " "] # false set code "x9" echo [chars/ident-start? [char-at $code 0]] # true echo [chars/ident-cont? [char-at $code 1]] # true
### 码点与字节
set s "a中c" echo [chars/count $s] # 3 codepoints echo [bytes/len $s] # 5 UTF-8 bytes echo [chars/slice $s 1 2] # 中 echo [chars/slice $s 2 99] # c — b clamps to the end