89 个版本 (48 个破坏性更改)
使用旧 Rust 2015
0.49.1 | 2023 年 9 月 10 日 |
---|---|
0.48.1 | 2022 年 12 月 14 日 |
0.47.3 | 2022 年 3 月 20 日 |
0.46.0 | 2021 年 4 月 10 日 |
0.3.0 | 2016 年 3 月 19 日 |
#41 在 游戏开发
每月 249 次下载
用于 2 包
1MB
20K SLoC
迪昂
一种 Rust 动态类型脚本语言
fn main() {
println("hello world!")
}
迪昂脚本文件以 .dyon
结尾。
要安装迪昂 REPL,请输入
cargo install --example dyon dyon
然后,要运行迪昂 REPL,请输入
dyon
要从命令行运行迪昂脚本文件,请输入
cargo install --example dyonrun dyon
然后,要运行脚本文件,请输入
dyonrun <file.dyon>
编辑器插件
迪昂 for Atom
迪昂 for Vim
迪昂 for Visual Studio Code
功能列表
- 数组
arr := [a, b, c]
,具有查找arr[0]
和 具有索引数组的查找arr[[0, 0]]
- 对象
obj := {x: a, y: b}
- 数字 (f64)
n := 5.3
- 布尔值
t := true
- 链接
link { 1 2 "hi" false }
- 使用
Arc<Mutex<Any>>
创建自定义Rust对象 - 无返回值的函数
fn foo() { ... }
和有返回值的函数fn foo() -> { ... return x }
- 将函数视为数学表达式
f(x) = x / (x - 1)
- 具有共享别名的可选命名空间
ns program::example::test
- 生命周期检查器(不需要垃圾收集器)
fn foo(mut a, b: 'a) { a.x = b }
- 返回生命周期
fn id(x: 'return) -> { return x }
- 可变性检查器
fn foo(mut a) { bar(mut a) }
- 在修改变量时运行时检查类型
a = 2.0 // ERROR: Expected assigning to number
- 对象插入新键,使用
a.x := 0
并使用a.x = 0
检查存在性和类型 - 基于蛇形命名的命名参数语法,例如
foo(bar: b)
等于foo__bar(b)
- 表达式
a := if b < c { 0 } else { 1 }
- 循环语句
for i := 0; i < 10; i += 1 { ... }
- 短循环
for i 10 { ... }
和偏移量for i [2, 10) { ... }
- 从循环体中推断范围
for i { println(list[i]) }
- 打包循环
for i, j { println(list[i][j]) }
∑
/sum
,∏
/prod
,min
,max
,sift
,∃
/any
,∀
/all
循环- 从循环中推导出的秘密
why(any i { list[i] > 3 })
- 链接循环
- 无限循环
loop { ... }
- 无标签的break
loop { break }
和无标签的continueloop { continue }
- 带标签的break
'a: loop { break 'a }
和带标签的continue'a: loop { continue 'a }
- 使用
return
作为变量而不退出,例如:return = 8
- 动态模块
m := unwrap(load("script.dyon"))
然后call(m, "main", [])
- 导入模块预定义
m := unwrap(load(source: "script.dyon", imports: [window, graphics]))
- 添加自定义Rust函数使用
Module::add
- Option值使用
none()
或some(x)
- Result值使用
ok(x)
或err(x)
- 使用
?
操作符传播错误,例如:x := foo()?
,自动将option映射到result unwrap(x)
打印传播错误的跟踪信息functions()
返回模块中所有可用函数的排序列表- 可选类型系统
fn could(list: []) -> f64
- 临时类型
fn players() -> [Player str] { ... }
- 当前对象
fn render() ~ world { ... }
- 类似 Go 的协程使用
go
thread := go foo()
- 内联并发
receiver := in foo
结合 for-in 循环for x in a {print(x[0]}
- 闭包
(x) = x + 1
- 捕获表达式
(x) = (grab a) + x
- 延迟不变量
fn intersect(a: [] => [], b: [] => []) -> [] { ... }
- 简单精炼类型
(vec4) -> vec4
- 具有
f32 精度的 4D 向量
(x, y, z, w)
- 具有
f32
精度的 4D 矩阵mat4 {1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16}
- 4D 向量的 Un-loop
f(i)
- 解包 4D 向量
f(xy v)
- 4D 向量的 Swizzle
(yxz v, 1)
- HTML 十六进制颜色
#fab3ee
- 元解析
- 嵌入 Rust 的宏
dyon_fn!{fn say_hello() { println!("hi!"); }}
为什么叫 Dyon?
Dyon 是由物理学中几个大统一理论预测的一种假设粒子,它具有电和磁电荷。更多信息请见这个 维基百科文章。
Dyon 这个名字很适合,因为就像这个粒子一样,在语言设计方面还有许多东西尚未被发现。然而,这种语言并非源于一个宏伟的新愿景,而是通过探索和测试新想法的结果。
动机和目标
Sven Nilsen 于 2016 年初开始了这个项目。想法是创建一种简单但方便的脚本语言,该语言与 Rust 集成良好。
- 在编码的第一周,发现了一种在函数参数上进行生命周期检查的方法
- 通过添加动态加载模块的能力,探索了不同的代码组织方法
- 为了良好的错误处理,添加了选项、结果和
?
操作符 - 为了测试语言的设计,创建了一个交互式编码的演示
- 可变性检查以提高可读性
- 短 For 循环以提高可读性和性能
- 使用数学循环和Unicode符号来提高可读性
- 使用类似Go的协程来添加多线程支持
- 4D向量,带有解包和洗牌操作,使2D和3D编程更容易
- HTML十六进制颜色,使得从图像编辑器复制颜色成为可能
- 可选类型系统,有助于项目扩展
- 临时类型,增加类型安全性
- 当前对象,提高原型设计和定制环境
- 宏,使Rust嵌入更简单
- 从数学循环自动推导意义
- 可打印的闭包,使用当前对象和从闭包环境获取
- 对秘密的类型安全性,Dyon数据的加载/保存简单
- 链接循环,简化代码生成和模板
- 内类型,简化跨线程通信
- 延迟不变性、简单细化类型和二元运算符重载
主要目标
- 与Rust良好集成
- 灵活的代码组织方式
性能将针对循环进行优化
coding -> parsing -> running -> debugging -> coding
子目标
- 安全性
非目标
- Rust等效性能
- 用Rust构建库
- 与Rust以外的语言接口
许可证
许可方式为以下之一
- Apache License 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT),任选其一。
贡献
除非您明确声明,否则您提交的任何有意包含在作品中的贡献都应按照上述方式双重许可,不附加任何额外条款或条件。
依赖关系
~0.4–3.5MB
~78K SLoC