跳转至

示例

examples/ 里有三个完整、可跑的 CLI 工具——它们同时是发布验收的考题。前置只有一个:可用的 ctron(安装见入门);三者构建形态相同,以 ctgrep 为例:ctron build examples/ctgrep/src/main.ct。它们共用同一入口模型:ctron_entry() 返回 CLI 单串,约定以字面 run 触发(<二进制> run "<参数>"),构建产物与解释执行行为一致。

示例 对标 语义口径
ctgrep grep 固定串匹配(grep -F -n),行号 1 起,输出 行号:内容,退出码 0/1/2 = 命中/无命中/用法错误
ctwc wc 行数 词数 字节数 路径,行数与 wc -l 同口径
ctwf 词频统计 逐行 词 次数(插入序,确定性)+ 汇总行 + Top-3

三个示例共用同一输入 sample.txt(28 字节:三行文本,末尾带换行),先建好它,下面的复现命令即可闭环:

alpha beta
gamma alpha
nope

ctgrep —— 子串搜索

$ examples/ctgrep/src/main run "alpha sample.txt"
1:alpha beta
2:gamma alpha

首个空格分隔模式与路径——路径可含空格,模式不可;嵌套 if 定位首空格是刻意的(避开 && 不短路的运行时已知坑)。核心循环(源码 25-48 行,缩进前移一级):

match read_file(path) {
    Some(s) => {
        var ls = lines(s)
        var n: I32 = 0
        var hits: I32 = 0
        while n < ls.len {
            if contains(ls[n], pat) {
                var no = n + 1
                println(no.to_string() + ":" + ls[n])
                hits += 1
            }
            n += 1
        }
        if hits > 0 {
            return 0
        }
        return 1
    }
    None => {
        println("ctgrep: cannot open " + path)
        return 2
    }
}

ctwc —— 行词字节计数

$ examples/ctwc/src/main run sample.txt
3 5 28 sample.txt

行数按换行字节计(count_ch(s, 10)),词按空白分隔,字节取 s.len——main 的有效主体只有三行(源码 14-16 行,缩进前移):

var nw = words(s).len
var nl = count_ch(s, 10)
println(nl.to_string() + " " + nw.to_string() + " " + s.len.to_string() + " " + path)

ctwf —— 词频统计

$ examples/ctwf/src/main run sample.txt
alpha 2
beta 1
gamma 1
nope 1
distinct=4|total=5|sample.txt
top:alpha=2,beta=1,gamma=1

词频行按首次插入序,输出确定;汇总行经 std.str.join 组装(锚定 join 的发射面);Top-3 用 std.sort.sorted_by_desc 对索引排序,计数比较经独立函数 cnt_of 完成——闭包形参走 32 位 ABI,直接捕获词表/值表两个 List 句柄即可(源码 56 行):

var byidx = sorted_by_desc[I32](idxs, |a, b| cnt_of(ks, vs, vocab[a]) < cnt_of(ks, vs, vocab[b]))

三个示例都只消费 std.str / std.fmap / std.sort 的公开入口,源码各不到 80 行——当语言导读读,比读规范快。