#candle #semantics #language #lustre #embedding #programming-language #input-stream

nightly chandeliers-sem

Candle的语义,Lustre在Rust中的浅嵌入

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

Download history 4/week @ 2024-04-21 8/week @ 2024-05-19 1/week @ 2024-05-26 13/week @ 2024-06-02 7/week @ 2024-06-09 3/week @ 2024-06-16 7/week @ 2024-06-23 2/week @ 2024-06-30 71/week @ 2024-07-07 9/week @ 2024-07-14 1/week @ 2024-07-21 38/week @ 2024-07-28

每月下载119
4个crate中使用(直接使用3个)

MIT/Apache

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