Skip to content
📖 Auto 版 Rust Book本书目录

附录 ​

以下各节包含你在 Auto 学习旅程中可能觉得有用的参考材料,并在适用的地方提供了与 Rust 等价物的比较。

附录 A:关键字 ​

以下列表包含 Auto 语言保留的关键字。因此,它们不能用作标识符。_标识符_是函数、变量、参数、类型字段、模块、包、常量、静态值、属性、类型或规范的名称。

当前使用的关键字 ​

以下是 Auto 中当前使用的所有关键字列表,描述了它们的功能并注明了等效的 Rust 关键字。

Auto 关键字Rust 等价物描述
actor(无)定义一个 actor 类型
asas类型转换
breakbreak立即退出循环
comptime(无)标记函数在编译时执行
constconst定义常量
continuecontinue继续下一次循环迭代
dyndyn对规范对象的动态派发
elseelseif 和 if let 控制流的回退分支
enumenum定义枚举
extimpl为类型附加方法
externextern链接外部函数或变量
falsefalse布尔假字面量
fnfn定义函数
forfor遍历迭代器中的项
has(无)通过组合委托行为
ifif基于条件表达式的分支
ininfor 循环语法的一部分
ismatch将值与模式匹配;组合类型
letlet绑定变量
looploop无条件循环
modmod定义模块
mutmut(Rust) 表示可变性
on(无)处理 actor 消息;订阅蓝图
pubpub表示公共可见性
returnreturn从函数返回
SelfSelf正在定义或实现的类型的别名
selfself方法主体
spectrait定义规范(共享行为接口)
staticstatic全局变量
sysunsafe表示系统级(不安全)代码
tell(无)向 actor 发送消息
truetrue布尔真字面量
typestruct / type定义数据类型或类型别名
useuse将符号引入作用域
varlet mut声明可变变量
wherewhere用规范约束限制类型
whilewhile条件循环
yield(无)在蓝图中将控制权交还运行时

Auto 独有关键字 ​

这些关键字存在于 Auto 中,但没有直接的 Rust 等价物:

关键字描述
actor定义并发处理消息的 actor 类型
comptime标记在编译时执行的函数
ext为类型附加方法(替代 Rust 的 impl)
has将方法调用委托给包含的类型
is模式匹配(替代 match)和类型组合
onActor 中的消息处理器;蓝图订阅
spec定义行为规范(替代 Rust 的 trait)
sys系统级代码(替代 Rust 的 unsafe)
tell向 actor 发送消息
var可变变量声明的简写

Rust 中有但 Auto 中没有的关键字 ​

这些 Rust 关键字在 Auto 中不存在,因为 Auto 以不同方式处理它们的用例:

Rust 关键字Auto 等价物原因
async~T 返回类型蓝图通过类型而非关键字指示
awaiton 块订阅蓝图而非等待
crate(包根)Auto 使用基于包的模块解析
implext不同关键字,相同概念
matchis不同关键字,相同模式语法
move(隐式)Auto 使用隐式移动语义
mutvar可变绑定的简写
ref(不需要)AutoFree 处理引用语义
structtype统一的类型声明关键字
super(父引用)Auto 使用带父路径的 use
traitspec为 Auto 语义重命名
unionunion仅在联合体声明中是关键字

为未来使用保留的关键字 ​

以下关键字目前没有任何功能,但被 Auto 保留以备将来可能使用:

  • abstract
  • become
  • do
  • final
  • macro
  • override
  • priv
  • try
  • typeof
  • virtual

附录 B:运算符和符号 ​

运算符 ​

表 B-1 包含 Auto 中的运算符,并与 Rust 进行比较。大多数运算符在两种语言中是相同的。

运算符示例描述Auto 与 Rust 差异
!!expr逻辑取反相同
!=expr != expr不等于相同
%expr % expr取余相同
%=var %= expr取余赋值相同
&&expr借用/引用相同
&expr & expr按位与相同
&&expr && expr逻辑与相同
*expr * expr乘法相同
**expr解引用相同
+expr + expr加法相同
+=var += expr加法赋值相同
--expr取负相同
-expr - expr减法相同
-=var -= expr减法赋值相同
->fn() -> type函数返回类型相同语法,也用于 is 分支
.expr.ident字段访问相同
...., expr.., ..expr范围相同
..=expr..=expr包含范围相同
..Type(x, ..)忽略剩余字段相同概念,Auto 用 () 不用 {}
/expr / expr除法相同
/=var /= expr除法赋值相同
:ident: type类型注解Auto 字段用空格:name Type
==expr == expr等于相同
=>pat => expr匹配分支仅 Rust;Auto 用 ->
@ident @ pat模式绑定相同
^expr ^ expr按位异或相同
|pat | pat模式选择相同
||expr || expr逻辑或相同
?expr?错误传播Rust: expr? 后缀;Auto: expr! 后缀
~~expr, ~T蓝图运算符仅 Auto:创建/转换蓝图

Auto 特有运算符 ​

运算符示例描述
~~5, ~T蓝图创建/类型操作符
~race~race(a, b)第一个完成的蓝图获胜
~join~join(a, b)等待所有蓝图完成
~spawn~spawn(() => {})在后台运行蓝图
~yield~yield将控制权交还运行时
~sleep~sleep(ms)非阻塞睡眠
!expr!错误传播(后缀)
??T可选类型(类型前缀)

关键语法差异:Auto vs Rust ​

特性AutoRust
匹配分支pat -> exprpat => expr,
错误传播expr!expr?
可选类型?TOption<T>
错误类型!TResult<T, E>
蓝图类型~Timpl Future<Output = T>
类型声明type Name { }struct Name { }
方法块ext Name { }impl Name { }
规范/Traitspec Name { }trait Name { }
模式匹配ismatch
不安全sys { }unsafe { }
可变变量var x = 5let mut x = 5
字符串格式化f"${x}"format!("{}", x)
打印print(x)println!("{}", x)
断言相等assert_eq(a, b)assert_eq!(a, b)
派生#derive[Debug]#[derive(Debug)]
字段分隔符name Type(空格)name: Type(冒号)
枚举访问Enum.VariantEnum::Variant
模块路径use.mod Nameuse mod::Name;

非运算符符号 ​

符号解释Auto 与 Rust 差异
"..."字符串字面量相同
'c'字符字面量相同
f"..."格式化字符串Auto: f"${expr}";Rust: format!("{}", expr)
|...| expr闭包相同语法
_忽略的模式绑定相同
()单元类型/空元组相同
.方法调用/字段访问相同
#属性前缀Auto: #derive[...];Rust: #[derive(...)]

附录 C:可派生规范 ​

在书中多个地方,我们讨论了 #derive[] 属性,你可以将其应用于 type 或 enum 定义。#derive[] 属性生成代码,在你标注的类型上实现带有默认实现的规范。

这是 Auto 中 Rust #[derive(...)] 属性的等价物。

Debug 用于程序员输出 ​

Debug 规范启用调试格式化。在 Auto 中,在格式字符串中使用 {:?}:

auto
print(f"{my_value:?}")
rust
println!("{:?}", my_value);

Debug 是 assert_eq 所需的,它在断言失败时打印值。

Eq 用于相等比较 ​

Eq 规范(等同于 Rust 的 PartialEq + Eq)启用 == 和 != 的相等比较:

auto
#derive[Eq]
type Color {
    r int
    g int
    b int
}

fn main() {
    let c1 = Color(r: 255, g: 0, b: 0)
    let c2 = Color(r: 255, g: 0, b: 0)
    assert(c1 == c2)
}
rust
#[derive(PartialEq, Eq)]
struct Color {
    r: i32,
    g: i32,
    b: i32,
}

fn main() {
    let c1 = Color { r: 255, g: 0, b: 0 };
    let c2 = Color { r: 255, g: 0, b: 0 };
    assert!(c1 == c2);
}

当在类型上派生时,两个实例仅在_所有_字段相等时才相等。当在枚举上派生时,每个变体等于自身,不等于其他变体。

Ord 用于排序比较 ​

Ord 规范启用比较运算符 <、>、<=、>=:

auto
#derive[Ord]
enum Priority {
    Low
    Medium
    High
}
rust
#[derive(PartialOrd, Ord)]
enum Priority {
    Low,
    Medium,
    High,
}

当在枚举上派生时,先声明的变体被认为小于后声明的变体。

Clone 用于复制值 ​

Clone 规范允许显式深拷贝一个值:

auto
#derive[Clone]
type Config {
    name String
    value int
}

fn main() {
    let original = Config(name: "test", value: 42)
    let copy = original.clone()
}
rust
#[derive(Clone)]
struct Config {
    name: String,
    value: i32,
}

fn main() {
    let original = Config { name: "test".to_string(), value: 42 };
    let copy = original.clone();
}

Hash 用于映射到固定大小值 ​

Hash 规范允许将类型用作 HashMap 或 HashSet 中的键:

auto
#derive[Hash, Eq]
type UserId {
    id int
}

fn main() {
    let mut scores = HashMap<UserId, int>()
    scores.insert(UserId(id: 1), 100)
}
rust
use std::collections::HashMap;

#[derive(Hash, PartialEq, Eq)]
struct UserId {
    id: i32,
}

fn main() {
    let mut scores = HashMap::new();
    scores.insert(UserId { id: 1 }, 100);
}

Default 用于默认值 ​

Default 规范为类型提供默认值:

auto
#derive[Default]
type Config {
    host String    // 默认为 ""
    port int       // 默认为 0
    debug bool     // 默认为 false
}

fn main() {
    let config = Config.default()
    // 覆盖特定字段
    let config = Config(host: "localhost", ..Config.default())
}
rust
#[derive(Default)]
struct Config {
    host: String,
    port: i32,
    debug: bool,
}

fn main() {
    let config = Config::default();
    // Override specific fields
    let config = Config { host: "localhost".to_string(), ..Config::default() };
}

可派生规范速查表 ​

Auto 规范Rust 等价物启用功能
DebugDebug{:?} 格式化
EqPartialEq + Eq==、!= 运算符
OrdPartialOrd + Ord&lt;、&gt;、&lt;=、&gt;= 运算符
CloneClone.clone() 方法
CopyCopy赋值时隐式复制
HashHash用作 HashMap/HashSet 键
DefaultDefault.default() 方法

Auto 使用 Eq 作为单一规范,而 Rust 分为 PartialEq + Eq。同样,Auto 的 Ord 覆盖了 Rust 的 PartialOrd + Ord。这种简化是可行的,因为 Auto 不需要以相同方式处理 NaN 边缘情况——浮点类型在语言中有特殊的内置处理。

派生语法比较 ​

特性AutoRust
属性#derive[Debug, Eq]#[derive(Debug, PartialEq, Eq)]
多个[] 中逗号分隔() 中逗号分隔
自定义派生#apply[comptime_fn]独立的过程宏 crate

附录 D:Auto vs Rust — 完整映射 ​

本节提供了书中涵盖的 Auto 和 Rust 概念之间的综合映射。

类型系统 ​

概念AutoRust
定义类型type Name { field Type }struct Name { field: Type }
定义枚举enum Name { Variant }enum Name { Variant }
方法ext Name { fn method() {} }impl Name { fn method(&self) {} }
接口spec Name { fn method() }trait Name { fn method(&self); }
实现规范spec Name for Type { }impl Name for Type { }
泛型fn name&lt;T&gt;(x T)fn name&lt;T&gt;(x: T)
规范约束fn name&lt;T Spec&gt;(x T)fn name&lt;T: Trait&gt;(x: T)
可选?TOption&lt;T&gt;
结果!TResult&lt;T, E&gt;
蓝图~Timpl Future&lt;Output = T&gt;
Never 类型!!
类型别名type Alias = Typetype Alias = Type;

控制流 ​

概念AutoRust
模式匹配ismatch
匹配分支pat -&gt; exprpat =&gt; expr,
条件解构if letif let
错误传播expr!expr?
恐慌panic("msg")panic!("msg")

并发 ​

概念AutoRust
并发单元Actor线程
定义actor Name { }thread::spawn(|| { })
发送消息actor.tell(Msg)tx.send(msg)
接收on Msg(data) { }rx.recv()
异步类型~Timpl Future&lt;Output = T&gt;
等待on bp as v { }bp.await
竞争~race(a, b)tokio::select!
连接~join(a, b)tokio::join!(a, b)

面向对象 ​

概念AutoRust
组合is Type手动嵌入
委托has Type手动委托
动态派发dyn Specdyn Trait

元编程 ​

概念AutoRust
派生#derive[Spec]#[derive(Trait)]
编译期comptime fn过程宏
条件编译#if[debug]#[cfg(debug)]
不安全sys { }unsafe { }

附录 E:Auto 包工具 ​

automan vs cargo ​

命令Auto(automan)Rust(cargo)
新建项目automan new namecargo new name
构建automan buildcargo build
运行automan runcargo run
测试automan testcargo test
检查automan checkcargo check
添加依赖automan add pkg添加到 Cargo.toml
发布构建automan build --releasecargo build --release
包文件auto.tomlCargo.toml
源码目录src/src/
入口点src/main.atsrc/main.rs

Auto 转译为 C,因此 automan build 最终通过系统的 C 编译器生成原生二进制文件。这意味着 Auto 程序可以直接调用 C 库,无需额外的 FFI 绑定。

基于 MIT 许可发布。