# 类型 类型、谓词、强制转换和元数据动词是裸标准库函数,在每个运行时中 都存在。`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
## 另见 - 类型与协议 - 结果 - 引用 - 数学