40 个版本
新版本 0.1.72 | 2024 年 8 月 24 日 |
---|---|
0.1.69 | 2024 年 7 月 30 日 |
0.1.49 | 2024 年 3 月 31 日 |
0.1.2 | 2023 年 12 月 23 日 |
0.0.16 | 2022 年 7 月 26 日 |
#68 在 编程语言 中
526 每月下载量
21KB
186 代码行
YAMLScript
给你的 YAML 文件添加逻辑
概述
使用 YAMLScript 加载 file.yaml
!yamlscript/v0/
# Get data from external sources:
=>:
names-url =:
"https://raw.githubusercontent.com/dominictarr/" +
"random-name/master/first-names.json"
name-list =: &first-names json/load(curl(names-url))
# Data object with literal keys and generated values:
name:: rand-nth(*first-names)
aka:: name-list.rand-nth()
age:: &num 2 * 3 * 7
color:: &hue qw(red green blue yellow)
.shuffle()
.first()
title:: "$(*num) shades of $(*hue)."
并获取
{
"name": "Dolores",
"aka": "Anita",
"age": 42,
"color": "green",
"title": "42 shades of green."
}
描述
YAMLScript 是一种具有清晰 YAML 语法的函数式编程语言。
YAMLScript 可以用于增强普通 YAML 文件,例如使用函数式操作
- 将其他 YAML 文件的(部分)导入到任何节点
- 字符串插值,包括函数调用
- 数据转换,包括您定义的
此 YAMLScript 库应成为您当前 YAML 加载器的即插即用替代品!
大多数现有的 YAML 文件已经是有效的 YAMLScript 文件。这意味着 YAMLScript 作为一个正常的 YAML 加载器运行,但如果需要,也可以评估函数表达式。
在底层,YAMLScript 代码编译成 Clojure 编程语言。这使得 YAMLScript 成为一个开箱即用的完整函数式编程语言。
尽管 YAMLScript 编译成 Clojure,而 Clojure 编译成 Java,但无需依赖 Java 或 JVM。YAMLScript 编译成原生共享库(libyamlscript.so
),任何可以加载共享库的编程语言都可以使用。
要查看 YAMLScript 编译成的 Clojure 代码,您可以使用 YAMLScript CLI 二进制文件 ys
运行
$ ys --compile file.ys
(def names-url
(+_ "https://raw.githubusercontent.com/dominictarr/"
"random-name/master/first-names.json"))
(def name-list (_& 'first-names (json/load (curl names-url))))
{"age" (_& 'num (*_ 2 3 7)),
"aka" (_-> name-list (list rand-nth)),
"color" (_& 'hue (_-> (qw red green blue yellow) (list shuffle) (list first))),
"name" (rand-nth (_** 'first-names)),
"title" (str (_** 'num) " shades of " (_** 'hue) ".")}
Rust 使用方法
创建一个新的 Rust 项目
$ cargo new --bin prog
$ cd prog
添加文件 src/main.rs
use std::fs::File;
use std::io::prelude::*;
use yamlscript::YAMLScript;
fn main() -> std::io::Result<()> {
let mut file = File::open("file.ys")?;
let mut input = String::new();
file.read_to_string(&mut input)?;
let ys = YAMLScript::new().unwrap();
let data = ys.load::<serde_json::Value>(&input).unwrap();
println!("{data:?}");
Ok(())
}
添加文件 file.ys
!yamlscript/v0
name =: "World"
=>::
foo: [1, 2, ! inc(41)]
bar:: load("other.yaml")
baz:: "Hello, $name!"
添加文件 other.yaml
oh: Hello
运行
$ curl https://yamlscript.org/install | bash
$ cargo add yamlscript
$ cargo add serde_json
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/prog`
Object {"bar": Object {"oh": String("Hello")}, "baz": String("Hello, World!"), "foo": Array [Number(1), Number(2), Number(42)]}
安装
您可以像安装任何其他 Rust 模块一样安装此模块
$ cargo add yamlscript
但您需要系统安装 libyamlscript.so
。
一种简单的方法是使用
$ curl https://yamlscript.org/install | bash
注意:上面的命令将安装 YAMLScript 命令行工具的最新版本
ys
和共享库libyamlscript.so
,分别安装到~/.local/bin
和~/.local/lib
。
有关更多信息,请参阅 https://github.com/yaml/yamlscript/wiki/Installing-YAMLScript。
另请参阅
作者
许可证 & 版权
版权 2022-2024 Ingy döt Net [email protected]
本项目采用 MIT 许可证条款。有关详细信息,请参阅LICENSE。
依赖项
~3MB
~67K SLoC