9次发布
使用旧的Rust 2015
0.1.8 | 2023年5月8日 |
---|---|
0.1.7 | 2023年3月3日 |
0.1.5 | 2023年2月22日 |
#201 in 编程语言
35 每月下载量
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.otrs
和 logic.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