30个版本 (1个稳定版)
1.0.0 | 2024年1月5日 |
---|---|
0.6.1 | 2024年1月4日 |
0.5.2 | 2023年12月29日 |
0.5.0 | 2023年11月24日 |
在Rust模式中排名第775
每月下载119次
在4个crate中使用(直接使用3个)
57KB
1K SLoC
Chandeliers-Sem
Candle语言的语义。
Candle
Candle是一种宏语言,模仿Lustre编程语言的构造。
尽管在src/tests/impl/
下提供了Candle代码的手写示例,但Candle并非真正为人类使用而设计的语言,许多构造的使用难度从困难到不人机。
相反,Candle的主要目的是成为Lustre程序的编译目标,即在结构相似性的前提下,从Lustre到Candle的自动化翻译应该是容易的。
除了下面的示例之外,你可以在src/candle.rs
中阅读Candle的完整规范,因为它包含所有宏定义,所以它指定了Candle的语法和语义。
示例:计算输入中的true
的数量
规范
- 输入:一组
bool
- 输出:一组
int
- 在任何时候,输出都是到目前为止在输入中看到的
true
的数量。
一个典型的Lustre实现可能如下所示
node counter(i: bool) returns (n : int);
let
n = (0 fby n) + (if i then 1 else 0);
tel;
在Candle中,我们会定义等效的逻辑如下
use chandeliers_sem::macros::*;
use chandeliers_sem::traits::*;
#[allow(non_camel_case_types)]
#[derive(Default)]
pub struct counter {
__clock: usize,
__trace: bool,
n: ty!(int+),
__nodes: (),
}
impl Step for counter {
type Input = bool;
type Output = i64;
pub fn step(&mut self, i: ty!(bool)) -> ty!(int) {
node_trace!(self, "(i={}) => counter(n={})", i, self.n);
let n = binop!(+;
later!(self <~ 0; lit!(0), var!(self <~ 1; n)),
ifx!((var!(self <~ 0; i)) then { lit!(1) } else { lit!(0) })
);
update!(self, n);
tick!(self);
node_trace!(self, "counter(n={}) => (n={})", self.n, self.n);
n
}
}
从这个简单的例子中,你应该立即看出Candle比Lustre更冗长和复杂,但如果你仔细观察程序,那么很明显,Lustre程序的结构在Candle的翻译中被非常忠实地复制。
更多示例(具有不同程度的解释)可以在src/tests/impl/
中找到,特别是fib.rs
实现了斐波那契序列,而counters.rs
围绕整数计数器的主题有各种示例。
依赖关系
~27KB