# 类型
类型、谓词、强制转换和元数据动词是裸标准库函数,在每个运行时中
都存在。`type` 报告值的类型名,`is?` 检查类型;谓词回答常见问题
(`nil?`、`empty?`、`future?`)。强制转换(`num`、`keyword`)和
元数据访问(`meta`、`with-meta`、`vary-meta`、`without-meta`)
构成了这组函数的其余部分。类型系统本身——用户定义类型与协议——
参见类型与协议。
## 函数
| 函数 | 用途 |
|---|---|
| `type x` | 以字符串表示的类型名(`"number"`、`"string"`、`"map"` 及用户类型) |
| `is? type-name x` | 按名称检查类型——类型在前,值在后 |
| `nil? x` | nil 检查 |
| `future? x` | Future(异步任务)检查 |
| `empty? xs` | 字符串与集合的空检查 |
| `num x` | 转换为数字(字符串、布尔或数字);字符串无法解析时返回 nil |
| `keyword x` | 将字符串转换为关键字 |
| `meta value ?key` | 读取元数据映射,或单个键的值 |
| `with-meta value meta` | 附加元数据(映射则替换,键/值对则合并,nil 则清除) |
| `vary-meta value f` | 对当前元数据映射应用 `f`,并附加结果 |
| `without-meta value` | 剥离元数据,共享载荷 |
### 说明
- `is?` 的第一个参数是类型名,然后是值:`[is? "number" 42]`。
类型名也可以是用户定义类型值(`[is? Point $p]`)。
- 对整数和浮点数,`type` 都返回 `"number"`——Deft 的数字底层统一为
f64——对带类型的值则返回用户类型名。
- 可携带元数据的值包括映射、带标签映射、向量、集合、字符串和关键字。
立即值(数字、nil、布尔)经过元数据辅助函数时原样返回。`with-meta`
返回共享载荷的新值,对普通值调用 `meta` 得到 nil,而 `vary-meta`
是穿线形式(`[with-meta $value [$f [meta $value]]]`)。
- `num` 解析 `"3.14"` 和 `"42"`,把 `true`/`false` 映射为 `1`/`0`,解析
失败时得到 nil。`int`(参见数学)还会截断浮点数。
## 示例
echo [type 42] # "number" echo [type "hi"] # "string" echo [type %{ a 1 }] # "map" echo [is? "number" 42] # true echo [is? "string" 42] # false echo [nil? nil] # true echo [empty? @{}] # true echo [num "42"] # 42 echo [num "abc"] # nil echo [keyword "ok"] # :ok # Metadata on a function def inc {|x| ($x + 1)} set f [with-meta $inc %{ "doc" "adds one" }] echo [meta $f "doc"] # "adds one" # Functional metadata updates on a tagged value def tagged [with-meta :deepseek %{ "n" 1 }] echo [meta $tagged "n"] # 1 echo [meta [vary-meta $tagged {|m| [assoc $m "n" 2]}] "n"] # 2 echo [meta [without-meta $tagged]] # nil