Skip to content

Abrahum Link

Script languages in Rust

调查对比目前 Rust 实现的几种脚本语言,比较的标准并不统一,纯个人向,方向大概会包含脚本语言本身是否美观易用、与 Rust 的互操作是否方便、目前解释器的实现进度等。

入选的语言:

其他落选语言:

duckscript

duckscript 的目标是简单、可扩展的可嵌入脚本语言。

Example:

1# print the text "Hello World"
2echo Hello World
3# print the text "Hello World"
4echo "Hello World"
5# print the text 'hello "world"'
6echo "hello \"world\""
7
8out = set "Hello World"
9# This will print: "The out variable holds the value: Hello World"
10echo The out variable holds the value: ${out}
11# This will print: "To use the out variable just write: ${out}"
12echo To use the out variable just write: \${out}
13
14# Labels
15goto :good
16echo error!!!!
17:good echo yay!!!!
18
19# Function
20fn print_first_and_second_argument
21 echo ${1} ${2}
22 return printed
23end
24
25values = range 1 10
26for i in ${values}
27 for j in ${values}
28 echo i: ${i} j: ${j}
29 end
30end

语言观感上非常像 Haskell,基本没有多少小括号,语言非常精简,通过 Command 扩展整个语言体系。

一个 Command 扩展的例子:

1struct SetCommand {}
2
3impl Command for SetCommand {
4 fn name(&self) -> String {
5 "set".to_string()
6 }
7
8 fn run(&self, arguments: Vec<String>) -> CommandResult {
9 let output = if arguments.is_empty() {
10 None
11 } else {
12 Some(arguments[0].clone())
13 };
14 CommandResult::Continue(output)
15 }
16}

嵌入运行:

let mut context = Context::new();
duckscriptsdk::load(&mut context.commands)?;
runner::run_script_file(file, context)?;

总体来说 duckscript 似乎太过简易了一些,缺少 oop 的设计,对于一些简单的嵌入脚本可以胜任,但是语言本身并不能胜任复杂的需求。

gulon

静态类型(static type)、类型推断(type inference)、易于嵌入(simple embedding)、UTF-8、GC 小堆设计、线程安全

Example:

1let io = import! std.io
2io.print "Hello world!"
3
4// An identifier
5abc123_
6// An integer literal
742
8// A float literal
93.14
10// A string literal
11"Hello world"
12// A raw string literal
13r"Can contain newlines
14world"
15r#"With # as delimiters raw strings can also contain quotes without escaping `"` "#
16r###" "## "###
17// A character literal
18'e'
19
20// Function
21let factorial n : Int -> Int =
22 if n < 2
23 then 1
24 else n * factorial (n - 1)
25
26// Type
27type Op = | Add | Sub | Div | Mul
28type Expr = | Int Int | Binop Expr Op Expr
29
30let x = 1 + 2 in x // Returns 3

看语法基本就是跑在 Rust 构建的 Vm 上的 Haskell,模式匹配、函数式

todo