Script languages in Rust
调查对比目前 Rust 实现的几种脚本语言,比较的标准并不统一,纯个人向,方向大概会包含脚本语言本身是否美观易用、与 Rust 的互操作是否方便、目前解释器的实现进度等。
入选的语言:
其他落选语言:
duckscript
duckscript 的目标是简单、可扩展的可嵌入脚本语言。
Example:
1 # print the text "Hello World"
2 echo Hello World
3 # print the text "Hello World"
4 echo "Hello World"
5 # print the text 'hello "world"'
6 echo "hello \"world\""
7
8 out = set "Hello World"
9 # This will print: "The out variable holds the value: Hello World"
10 echo The out variable holds the value: ${out}
11 # This will print: "To use the out variable just write: ${out}"
12 echo To use the out variable just write: \${out}
13
14 # Labels
15 goto :good
16 echo error!!!!
17 :good echo yay!!!!
18
19 # Function
20 fn print_first_and_second_argument
21 echo ${1} ${2}
22 return printed
23 end
24
25 values = range 1 10
26 for i in ${values}
27 for j in ${values}
28 echo i: ${i} j: ${j}
29 end
30 end
语言观感上非常像 Haskell,基本没有多少小括号,语言非常精简,通过 Command 扩展整个语言体系。
一个 Command 扩展的例子:
1 struct SetCommand {}
2
3 impl 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:
1 let io = import! std.io
2 io.print "Hello world!"
3
4 // An identifier
5 abc123_
6 // An integer literal
7 42
8 // A float literal
9 3.14
10 // A string literal
11 "Hello world"
12 // A raw string literal
13 r"Can contain newlines
14 world"
15 r#"With # as delimiters raw strings can also contain quotes without escaping `"` "#
16 r###" "## "###
17 // A character literal
18 'e'
19
20 // Function
21 let factorial n : Int -> Int =
22 if n < 2
23 then 1
24 else n * factorial (n - 1)
25
26 // Type
27 type Op = | Add | Sub | Div | Mul
28 type Expr = | Int Int | Binop Expr Op Expr
29
30 let x = 1 + 2 in x // Returns 3
看语法基本就是跑在 Rust 构建的 Vm 上的 Haskell,模式匹配、函数式
todo
21 August 2022