标准库与 Runtime API
玄铁在底层 Runtime (xt_runtime.c) 提供了丰富的内置函数和标准库对象方法,这些 API 可以直接在语言层被调用:
全局内置原语
- 基础交互:
示(内容)(等同于 Print) - 数据转换:
化(对象)(JSON序列化),解(字符串)(JSON反序列化) - 系统与网络:
执(命令):执行系统命令 (Execute)输(提示):读取标准输入 (Input)听(端口, 处理函, 绑定地址?):网络监听 (Listen);缺省只绑回环127.0.0.1,对外监听须显式传"0.0.0.0"求(地址):发起 HTTP 请求 (Request),支持 https(TLS 走系统原生通道:Windows=Schannel / macOS=SecureTransport;Linux 暂无);单参 GET 自动跟随 301/302/303/307/308 重定向(≤5 跳)、默认 Chrome User-Agent、连接 10s/收发 30s 超时;详见 08_网络与并发编程指南连(地址):建立网络连接 (Connect)
命令行参数与环境变量
命令行参数用 runtime 内建 xt_get_args() 获取(须先 外 函 声明;返回数组,第 0 项是程序自身路径):
外 函 xt_get_args(): 数组
设 参数 = xt_get_args()
设 i = 1 // 0 是程序自身路径
当 i < 参数.长度 {
若 参数[i] == "--详细" { 示("详细模式") }
i = i + 1
}环境变量用 runtime 内建 xt_env_get(名) 读取(未设置返回空串;不启子进程——比 执("cmd /c echo %VAR%") 快,且不会闪控制台窗口):
外 函 xt_env_get(名: 字): 字
设 家目录 = xt_env_get("USERPROFILE") // Windows
若 家目录 == "" { 家目录 = xt_env_get("HOME") } // macOS / Linux注意:语言没有名为
参数的全局变量——参数只是编译器源码里自己起的局部变量名。凡 runtime 内建都需先外 函声明才可解析(签名范例见xuantie_compiler/玄铁.xt文件头)。
运行时内建函数
Runtime (xt_runtime.c) 中以 XTValue xt_xxx(...) 形式实现的函数,在程序里 外 函 声明后即可调用:
| 内建 | 签名 | 作用 |
|---|---|---|
xt_get_args | (): 数组 | 命令行参数(第 0 项为程序自身路径) |
xt_env_get | (名: 字): 字 | 读环境变量(未设置返空串) |
xt_cwd | (): 字 | 当前工作目录绝对路径 |
xt_self_path | (): 字 | 程序自身可执行文件绝对路径 |
xt_get_temp_path | (): 字 | 系统临时目录路径 |
外 函 xt_cwd(): 字
外 函 xt_self_path(): 字
示("工作目录: " & xt_cwd())
示("程序位置: " & xt_self_path())完整清单以
runtime/xt_runtime.c的函数定义为准(另有 arena 池、跑模式进程继承等编译器内部使用、不建议用户直接调用的内建)。
URL 编解码与字节转换
| 函数 | 返回 | 行为 |
|---|---|---|
URL编码(串) | 字 | 按 RFC 3986 做百分号编码:A-Z a-z 0-9 - _ . ~ 直通,其余按 UTF-8 字节转 %XX(大写);空格 → %20;空串 → 空串。URL 里带中文/空格/特殊字符时必须先编码——求 不做编码,未编码的中文会得到"成功但空体"(服务端拒答,容易误判) |
URL解码(串) | 字 | %XX(十六进制大小写均可)→ 原字节;+ 原样保留(RFC 3986,不做 form 的空格还原)。转义不完整 / 非十六进制 / 结果非合法 UTF-8 一律明确报错退出(提示含偏移) |
字节到字符串(字节) | 字 | 字节流按 UTF-8 严格校验后还原为字符串;非法字节或非字节输入明确报错退出。取字节流可用 字节(容量) 建缓冲、.追加(字节值) 逐个写入 |
到字节集(字符串) | 字节 | 拷贝字符串的 UTF-8 字节建字节集;字节集方法(截取/寻找/倒找/替换/取字节/写字节/到十六进制/分割/长度)详见 字节 |
设 地址 = "https://example.com/search?q=" & URL编码("玄铁 语言")
示(URL解码("%E7%8E%84%E9%93%81")) // 玄铁类型转换(整/小数/字)
把值显式转换为另一类型。整()/小数() 返回结果容器(失败不炸,可判定);字() 直接返回字符串。
| 函数 | 返回 | 行为 |
|---|---|---|
整(x) | 结果<整> | 整数原样;真/假→1/0;小数→截断取整(整(3.7)=3);字符串→严格解析(整("42")=42),非数字串失败;空 失败 |
小数(x) | 结果<小数> | 整数→小数(小数(5)=5.0);数字符串解析(小数("3.14")=3.14);失败同 整 |
字(x) | 字(直接) | 任意值转文本:字(42)="42"、字(3.7)="3.7"、字(真)="真"、数组→"数组对象" 这类占位描述 |
结果容器判定写法(失败不会中断程序):
设 转 = 整(输("请输入数字:"))
若 转.成功 {
示("两倍 = " & 字(转.值 * 2))
} 否 {
示("不是数字: " & 转.错误)
}注意:整("12abc")、整("")、整("1.5")(带小数点的串)都判失败——字符串必须是纯整数文本。要解析小数请用 小数()。
- JSON 转换:
化(对象)(序列化为 JSON 文本),解(字符串)(解析 JSON 文本为字典/数组)
标准库命名空间
- 文件 (
文件.):文件.读(路径):返回结果容器——成功时.值为文件内容字符串,失败时.错误为原因文件.写(路径, 内容):返回结果容器——成功时.值为真,失败时.错误为原因文件.存在?(路径):返回布尔;文件.删(路径):删除(结果容器)文件.建目录/删目录/改目录:目录操作(结果容器);文件.复制/移动:文件复制与移动更名(结果容器;移动为同盘 rename,跨盘用 复制+删除)文件.尺寸(路径):字节数(结果容器);文件.修改时间(路径):Unix 时间戳(结果容器)文件.打开(路径, 模式):流式句柄(结果容器;模式 读/写/追加/读写/写读)——句柄方法读一行/读全部/读字节/写文本/写行/移动位置/取位置/取长度/到文件尾/尾?/刷新/关闭,ARC 回收自动关闭- 用法:
设 r = 文件.读(路径) ; 若 r.成功 { 设 内容 = r.值 }——不要把文件.读的返回值直接当字符串用
- 数学 (
数学.): - 系统 (
系统.):系统.运行(命令):启动不等待;系统.取剪辑板文本/置剪辑板文本/清除剪辑板:剪辑板三件套系统.取屏幕宽度/取屏幕高度/取鼠标位置:显示器与鼠标信息;系统.操作系统类别/取启动时间/鸣叫/信息框系统.读配置项/写配置项:INI 配置读写(UTF-8 自解析,跨平台一致)
- 时间 (
时.):时.现(): 当前 Unix 时间戳(秒)时.毫秒(),时.微秒(): 高精度单调计时(测耗时用)时.睡(毫秒): 休眠(在 异步 块内是 fiber 切分点,详见详情页)时.部分(时间戳): 拆为{年,月,日,时,分,秒,星期,年积日}字典(本地时区);时.格式(时间戳,格式串): strftime 格式化(结果容器);时.指定(年,月,日,时,分,秒): 合成时间戳;时.间隔(t1,t2): 秒差
数组
数组支持动态扩容、索引访问和丰富内置方法。创建:设 列表 = [1, 2, 3];索引:列表[0];长度:列表.长度。
内置方法:追加(append)、删(remove)、插(insert)、找(find)、含?(contains)、连接(join)。
高阶方法(通过 引 "../lib/数组.xt" 予 A 引入标准库):A.映射(map)、A.过滤(filter)、A.归纳(reduce)、A.查找(find)、A.每个?(every)、A.存在?(some)、A.排序(sort)、A.去重(dedup)、A.反转(reverse)。
完整教程、详细示例与输出请参阅:06_数组编程指南.md
字符串方法
详情页:字符串
- 常用成员:
截取(substring)、包含?/含?(contains)、替换(replace)、寻找/倒找(find/rfind,返字符位置,找不到 -1)、分割(split)、到大写/到小写(ASCII 大小写)、重复(repeat)、去首尾空格/去首空格/去尾空格(strip/lstrip/rstrip)、字符数/长度(字节数) 等属性读取;拼接用&运算符(没有拼接方法,实测调用会报对象不存在的方法)。 分割语义(同 Pythonsplit):分隔符按完整字面子串匹配,保留空段。例:"a,b,,c".分割(",")→["a","b","","c"](4 段);"a,b,,c".分割(",,")→["a,b","c"](2 段);"".分割(",")→[""]。分隔符为空串""时按逻辑字符逐字拆分:"你好".分割("")→["你","好"]。- 剥空白三件套(同 Python
strip/lstrip/rstrip):剥 ASCII 空白(空格、\t、\n、\r;判定集另含\v/\f,但本语言字面量写不出这两个转义),中间空白保留,返回新串(无可剥时复用原串,零分配)。全角空格(U+3000) 不在其列——要一起剥就先替换(" ", " ")。
字典方法
详情页:字典
- 支持
设置(set)、获取(get)、包含?(contains)、键集(keys) 等。
字典字面量的键写法
键支持三种写法(同一字典可混用):
设 配置 = {"名称": "玄铁", 版本: 1, ("动态" & 后缀): 真}- 引号字符串键:
{"名称": "玄铁"}—— 经典写法,任何内容都可作键。 - 裸标识符键(CSS 风):
{版本: 1}—— 标识符紧跟冒号时直接作字符串键,不当变量求值。UI 库选项推荐此写法:{宽: 240, 圆角: 8, 点击: 函() {...}}。 - 括号表达式键:
{(变量): 值}—— 要用变量/表达式的值作键时必须加括号(否则会被当裸键字面量)。
注意:关键字作键仍需引号(如 {"选": 1},因 选 是通道关键字);裸键仅限标识符。