# 字符 `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
## 另见 - 字符串 — `len`、`slice`、`split ""` 和字节级访问 - 语法与风格 — 标识符规则和调用形式 - 正则表达式 — 对整字符串的模式匹配