分类 标签 存档 社区 订阅 搜索

duckscript

0 浏览0 评论

什么是 duckscript?

是一种类似 Shell 的脚本语言,但是嵌入在 cargo make 里。官网在:https://sagiegurari.github.io/duckscript。项目目录在:https://github.com/sagiegurari/duckscript


cargo make 是什么?

是一个 Rust 的任务运行器,以及构建软件。功能与 Gnu/Make 类似。项目目录在:https://github.com/sagiegurari/cargo-make


duckscript 的特点是?

简单,可扩展,内嵌。


如何安装?

用 cargo 安装,或者下载项目发布的二进制程序。


怎么写 Hello world?

# hello.ds
echo Hello world
$ duck hello.ds

duck 是 duckscript 的解释器。


echo 有几个参数?

两个,Helloworld。它们都是字符串。


如何创建变量?

out = set "Hello world!"

out 是一个变量,值是字符串 "Hello world!"


如何使用变量?

name = set Alice
echo Hello ${name}

set 是个特殊的语法吗?

不,它只是 duckscript 的 SDK 中的一个命令。是 std::var::Set 的别名。跟 echo 地位是一样的。


还有哪些常见的命令?

  • 控制流程:functionifforgoto
  • 文件系统:mvcpcatchmod
  • 数学运算:calc
  • 字符串:trimsplitreplacelengthequalconcat 等。
  • 数据结构:
    • 数组:arrayarray_getarray_pushis_array 等。
    • 字典:mapmap_getmap_putis_map 等。
    • 集合:set_newset_containsset_putis_set 等。
  • 进程控制:execexitspawn

详见:https://github.com/sagiegurari/duckscript/blob/master/docs/sdk.md


duckscript 除了命令还有什么?

有预处理过程。

  • !include_files <file1> <files2> ... 可以用来拆分脚本。
  • !print 在预处理过程中打印数据。

如何在 Rust 里内嵌 duckscript?

use duckscript::runner;
use duckscript::types::runtime::Context;

fn main() {
    // 新建上下文
    let mut context = Context::new();
    // 在此上下文加载 SDK
    let _ = duckscriptsdk::load(&mut context.commands);

    // 运行一个脚本
    //
    //   # hello.ds
    //   name = set Alice
    //   echo Hello, ${name}
    let result = runner::run_script_file("hello.ds", context);

    // 成功时返回运行后的上下文。
    let new_context = match result {
        Ok(context) => context,
        Err(error) => {
            eprintln!("duckscript error: {}", error);
            return;
        }
    };

    // 运行字符串,此时的上下文里已经有了 name 这个变量。
    let _ = runner::run_script("echo Name is ${name}", new_context);
}
Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
评论  
留下你的脚步
推荐阅读