9次发布

使用旧的Rust 2015

0.1.8 2023年5月8日
0.1.7 2023年3月3日
0.1.5 2023年2月22日

#201 in 编程语言

35 每月下载量

MIT 许可证

1MB
7K SLoC

Oters

Oters (Oxidized Temporal RStreams) 是一种函数式响应式编程语言,设计用于根据 Patrick Bahr 的类型系统直观地构建GUI。

语言文档可以在 这里 找到。


特性

  • 类型推断 - 类型完全推断,因此您无需显式编写类型。
  • 解释型 - 虽然语言是解释型的,但静态类型检查确保在运行前程序是安全的。
  • 导入Rust代码 - 可以通过单个宏将Rust函数导入到您的Oters代码中。
  • 无空间或时间泄漏 - 程序的大小和计算在启动后保持不变。

依赖项

Oters依赖于macroquad crate 来实现其GUI功能。这个crate需要某些系统依赖项。特别是在Linux上

# ubuntu system dependencies
apt install pkg-config libx11-dev libxi-dev libgl1-mesa-dev libasound2-dev

# fedora system dependencies
dnf install libX11-devel libXi-devel mesa-libGL-devel alsa-lib-devel

# arch linux system dependencies
 pacman -S pkg-config libx11 libxi mesa-libgl alsa-lib

使用方法

Oters作为一个Rust库使用,所以必须像其他依赖项一样将其包含到您的Rust项目中

[dependencies]
oters = "0.1.2"

运行Oters文件需要在主函数中调用一个宏

fn main() {
    let config = oters::WindowConfig {
        title: "My Oters App".to_string(),
        dimensions: (800, 600),
        resizable: true,
        fullscreen: false,
        icon: None,
    };
    oters::run!(vec!["./examples/demo/demo.otrs".to_string()], config,);
}

请注意,传递给 run! 宏的文件必须按依赖顺序排列。所以如果您有两个文件 main.otrslogic.otrs,并且前者依赖于后者,那么 logic.otrs 必须在 main.otrs 之前出现在 Vec 中。

将Rust函数导入Oters,也是通过单个宏调用来完成

#[export_oters]
fn print_message(s: String) {
    println!("This message is being printed from a Rust function: \n{s}");
}
// Can now call the function print_message from your Oters file

示例

以下是从 examples/demo/demo.otrs 中摘取的标记示例。

use std::stream::const
use std::stream::head
use gui::widget::*
use gui::color::*
use gui::shape::*

let ui = gui::frame ((100,50), (250, 100))

let (btn_id, btn_stream) = button ui (100, 50) (const "Click me!")

let counter = {
  let aux = fn n -> {
    let delta = if head btn_stream then 1 else 0;
    (n + delta) << @(aux (n + delta))
  };
  aux 0
}
let counter_string = std::int_to_string (head counter) << @counter_string

let (lab_id, lab_stream) = label ui (100, 50) counter_string 

let (grp_id, grp_stream) = hgroup 
  ui 
  (250,100) 
  (const [btn_id, lab_id]) 
  (Alignment::Top)

let _ = gui::attach_root (ui, grp_id)

let circle_color = 
  (if head counter % 3 == 0 then 
    red
  else if head counter %3 == 1 then
    green
  else 
    blue) << @circle_color

let circle = (draw_shape (Shape::Circle((200,200), 30, head circle_color))) << @circle

依赖项

~29MB
~396K SLoC