smlSML Soup Markup Language

{ ❄ } · 声明式数据/配置格式,JSON/YAML 的替代品

是什么

SML(Soup Markup Language,读作 "snow-mell")是 Soup 生态的声明式数据/配置格式,定位为 JSON / YAML 的替代品。Logo 为 { ❄ }:黑花括号表示语法骨架(块的边界),蓝色雪花表示精确的取值点。

与 JSON/YAML 相比

改进点说明
引号可选裸词即字符串(state: NY);含空格才加引号
块冒号可省address { }address: { }(更接近 Caddyfile)
数组分隔灵活[ a b c ]、每行一个、{..}, {..} 逗号可选
片段继承@name { ... } 定义,&name 引用(比 YAML anchor 直观)
环境变量内联$env.VAR 在裸词或引号串内均展开
注释# 行注释(JSON 不支持)
类型自识别true/false→bool,null→nil,数字→number(1e3/.5 均支持),其余→string

语法示例

firstName: John
age: 27
isAlive: true
address:
{
    streetAddress: "21 2nd Street"
    state: NY
}
phoneNumbers:
[
    { type: home, number: "212 555-1234" }
    { type: office, number: "646 555-4567" }
]
children: []
spouse: null

# 片段定义与引用
@base {
    region: cn-north-1
    zone: a
}
server web {
    &base
    port: 8080
}

实现与多语言库

SML 已落地为多种语言库,任选其一解析:

语言说明
Soup / Lualib/sml.soup(分发为 sml.sar原生实现,sml.load() / sml.dump(),零依赖
Soup 构建系统soupmake 内嵌解析器LanTuFile.sml 声明式构建配置
Rustsml-rs(规划/孵化)crate,parse() / to_string()
Clibsml.h(规划/孵化)C-ABI,sml_parse() / sml_dump()
JavaScriptsml.js(规划/孵化)ESM,parse() / stringify()

在 BamZap 中使用

BamZap 的声明式部署文件 HetuFile.sml 即用 SML 书写:

pool greeter {
    source: "./greeter-v2.soup"
    register: true
}
remote origin {
    backend: "https"
    root: $env.SOUPKG_HTTPS_ROOT
}
deploy app {
    ref: "greeter"
    target: "./deploy/"
    mode: "copy"
    run_args: "Alice"
}
verify greeter {
    chain: true
}

执行:soupx bamzap.sar apply HetuFile.sml

在 soupmake 中使用(LanTuFile.sml)

构建配置也可用 SML 书写(LanTuFile.smllantu.sml),与 Soupfile 等价:

name: myapp
entry: app.sky
lang: [ c rust soup ]

target "build" {
    cmd: "soupack pack . myapp.sar --entry app.sky"
}
target "clean" {
    cmd: "del /Q *.sar 2>nul"
}

执行:soupmake build(找不到 Soupfile 时自动尝试 LanTuFile.sml)。

相关链接

← 返回首页