这是 Riddle 的主源码仓库,包含格式化工具(riddle fmt)、编译器(riddlec)、项目工具(clue)和语言服务器(riddle-lsp)。
Riddle 是一门受 Rust 和 Go 启发的实验性编程语言。v0.2.3 提供类型检查、move checker、借用与逃逸分析、unsafe 语义、内置标准库、C 后端、项目工具和 LSP。当前版本仍处于技术预览阶段:语言和工具链仍可能发生不兼容变化。
-
可靠性:值默认移动,
Copy、借用检查与字段级部分移动在编译期保证内存语义;std::ops::Drop提供确定性析构,覆盖局部变量、参数、模式绑定、迭代项、聚合体字段和闭包环境,并由 drop flag 防止移动后重复析构。 -
性能:未逃逸的值优先留在栈上;只有当引用超出当前栈帧时,逃逸分析才会把值提升到保守式非移动 GC 堆。存储位置不会改变移动、借用与析构语义,C11 后端则把程序编译成可直接链接的普通 C。
-
生产力:泛型与 trait、闭包、递归模式匹配、由
IntoIterator/Iterator驱动的for循环、unsafe与 C FFI 一应俱全;配合clue项目工具和 LSP,从创建项目到运行一路顺畅。
riddlec:检查 Riddle 源码并生成 C;riddle fmt:按统一风格格式化 Riddle 源码,也可用--check检查格式;clue:管理 Riddle 包、依赖、工作区、构建目标与安装产物;riddle-lsp:为编辑器提供诊断、工作区索引、自动导入补全、高级导航、重命名、格式化和语义高亮。
仓库中的 editors 目录为 Helix、VS Code、Zed 和 IntelliJ IDEA 2026.1+ 提供 riddle-lsp 适配。
clue new hello
cd hello
clue check
clue build
clue runclue fetch 会解析 path、git 和 sparse registry 依赖并生成 Clue.lock v3;普通构建复用锁定版本,clue update 才重新求解,--locked 和 --offline 分别提供锁文件与缓存约束。clue build 会保留 .clue/build/hello.c,并支持多 bin、lib、example、test 和 bench 目标;完整清单与命令参见 app/clue。设置 CC 时,Clue 只会使用该编译器;否则会探测能完成 C11 编译与链接的 GCC、Clang 或 MSVC 工具链。
可从 GitHub Releases 下载预编译版本:解压对应平台的 zip,并将二进制所在的目录加入 PATH。
从源码构建使用仓库 rust-toolchain.toml 固定的 Rust 1.97.1。
Bash:
git clone --depth 1 https://github.com/riddle-lang/riddle.git
cd riddle
cargo install --path . --features install-bins --force --target-dir "${TMPDIR:-/tmp}/riddle-install"PowerShell:
git clone --depth 1 https://github.com/riddle-lang/riddle.git
Set-Location riddle
cargo install --path . --features install-bins --force --target-dir "$env:TEMP\riddle-install"上述两种方式都会安装 clue、riddle-lsp、riddlec 和 riddle 四个二进制。
如果只想构建这四个可安装二进制,请指定根发行包(root distribution package),避免 workspace 中同名开发包重复输出:
cargo build -p riddle --release --features install-bins --bins修改源码后,使用以下命令验证完整 workspace:
cargo test --workspace --all-targets
cargo check -p riddle --features install-bins --bins
cargo fmt --all -- --check
cargo clippy --workspace --all-targets --all-features -- -D warningsinstall-bins 只用于根发行包。不要在 workspace 测试命令中添加 --all-features,否则根发行包与成员 crate 的 clue、riddlec 会产生同名输出警告;上面的独立 cargo check 会覆盖这四个安装入口。
Clippy 会检查默认启用的全部规则并把告警视为错误,不使用新增的 #[allow(clippy::...)] 绕过源码问题。
clue check、clue build 和 riddlec 均接受 --target <triple>。目标选择优先级依次为命令行参数、RIDDLE_TARGET 环境变量、Clue.toml 中的 [build].target,最后回退到宿主平台。目标组件可通过 ridup 安装:
ridup target add aarch64-unknown-linux-gnu
clue build --target aarch64-unknown-linux-gnu首个发布版仅支持以下 7 个目标,不接受其他 triple:
x86_64-unknown-linux-gnuaarch64-unknown-linux-gnui686-unknown-linux-gnux86_64-pc-windows-msvci686-pc-windows-msvcaarch64-pc-windows-msvcaarch64-apple-darwin
目标组件与可用的 C 工具链是两个相互独立的状态。ridup target add 会安装 Riddle runtime,并询问是否安装配套的 LLVM/Clang;实际链接仍需要目标平台的系统库:Linux 需要 sysroot,Windows MSVC 目标需要 Windows SDK 与 MSVC 库,macOS 需要 Apple SDK。缺少这些组件时,ridup 不会把目标标记为可用。clue run 只能运行宿主目标;交叉编译产物需复制到目标系统上运行。
教程与已实现的能力参见 The Riddle Book;报告 bug、提问或贡献代码请到 GitHub Issues。Riddle Book 的源码位于本仓库的 docs/ 目录。
Riddle 使用 Apache License 2.0。