1 个不稳定版本
0.1.0 | 2024年4月28日 |
---|
#103 在 #语义
7KB
133 行
SModel
SModel(语义建模)为Rust提供了一种使用动态分派和层次定义的竞技场来友好地描述语言语义符号的方法,该竞技场允许循环引用。
定义顺序
定义顺序很重要。在使用 struct
关键字时,在继承数据类型之后定义子类型。
如果您以任何顺序定义 struct
,则可能会得到一个 找不到 错误,这将终止宏。
示例
最基本的数据类型是第一个出现的类型。您可以根据自己的喜好命名它。通常可以将其称为 符号 或 东西(根据Microsoft Roslyn的工程师的说法,“符号”应该被称为“东西”)。
use smodel::smodel;
smodel! {
type Arena = Arena;
struct Thingy {
let x: f64 = 0.0;
let ref y: String = "".into();
pub fn Thingy() {
super();
println!("{}", self.m());
}
pub fn m(&self) -> String {
"".into()
}
pub fn m1(&self) {
println!("base");
}
}
struct Foo: Thingy {
pub fn Foo() {
super();
}
pub override fn m(&self) -> String {
"Foo".into()
}
pub override fn m1(&self) {
if true {
super.m1();
}
}
}
}
fn main() {
let arena = Arena::new();
let thingy = Foo::new(&arena);
println!("{}", thingy.m());
}
竞技场
竞技场的名称定义为第一个 type Arena = ArenaName1;
指令的右侧。
字段
字段(一个 let
声明)有一个可选的 ref
修饰符,表示是否使用 RefCell
或 Cell
。对于所有类型,在读取时都是克隆或复制。对于堆分配的资源,例如 String
,请使用 ref
。
字段有一对获取器(fieldname()
)和设置器(set_fieldname(value)
)。
对于可变哈希映射或向量,建议使用一个 共享容器(见下文),它通过引用而不是内容进行克隆。
字段始终在封装模块内部,因此没有属性;字段定义始终以 let
关键字开始,没有RustDoc注释。
建议字段始终以一个下划线 _
或一个私有前缀,例如 m_
开头,并相应地使用如 _x()
和 set__x(v)
或 m_x()
和 set_m_x()
的访问。
然后,您将实现可能被子类型在基类型中覆盖的方法,从而允许一个统一的数据类型支持操作多个变体的方法。
共享容器
这个包提供了两种通过引用复制的容器数据类型,分别是 SharedArray
和 SharedMap
,以及 shared_array!
和 shared_map!
文字。
SharedArray
是一个由引用计数管理的可变向量。SharedMap
是一个由引用计数管理的可变哈希表。
有关使用详情,请参阅包文档。
构造函数
构造函数是一个与其数据类型名称匹配名称的方法。参数列表中隐式地添加了 arena
参数。
构造函数被转换为静态 new
方法。
构造函数包含一个局部 self
变量,其数据类型是包围数据类型的实例。
子类型
symbol.is::<T>()
检查symbol
是否是T
子类型。symbol.to::<T>()
转换为T
子类型,返回Ok(m)
或Err
。它可能是一个协变转换。symbol.into()
是一个协变转换。
超表达式
super.f()
表达式通过预处理方法令牌序列并将其转换为另一段 Rust 代码得到支持;因此,它可以在实例方法的任何地方使用。
super.f()
按降序顺序在基数据类型的方程序列中进行查找。
继承文档
使用 #[inheritdoc]
属性来继承被覆盖方法的 RustDoc 注释。
#[inheritdoc]
pub override fn m(&self) {
// Action
}
方法参数
目前,被覆盖方法中方法参数的名称应与子类型方法的名称匹配,否则可能会发生宏卫生错误,指示参数不在子类型的方程序列中。
许可
Apache 2.0,版权所有 © Hydroper
依赖
~285–730KB
~17K SLoC