sml

SML { ❄ }

第 1 章:第一个 SML 文件

第 1 章:第一个 SML 文件

本章目标:写出一个能解析的 SML 文件,理解键值对、注释、标量类型

1.1 最简文件

新建 hello.sml

name: John
age: 27

就这。两行键值对,冒号分隔键和值。不需要引号、不需要花括号、不需要逗号。

在 SML 里,永远是裸词(字母数字下划线连字符);可以是裸词,也可以加引号。

1.2 注释

SML 支持三种行注释,随便用哪种都行:

# 井号注释(最常用)
-- 双横线注释(Soup / Lua 风格)
// 斜杠注释(C 风格)

name: John   # 行尾也能写注释

还有两种块注释(可跨多行):

/* 这是块注释
   可以写很多行 */
_* 这也是块注释,Soup 系习惯写法 *_

注意:字符串引号内部#-- 不会被当成注释,放心写。

1.3 标量类型

SML 会自动识别值的类型:

你写的 识别为 说明
John / NY 字符串 裸词即字符串
"21 2nd Street" 字符串 含空格 / 特殊字符才加引号
27 整数
0.75 浮点数
true / false 布尔
null 空值 等同于 JSON 的 null

动手试:

firstName: "John Doe"     # 含空格 -> 必须引号
state: NY                 # 单字 -> 裸词即可
age: 27                   # 整数
ratio: 0.75               # 浮点
enabled: true             # 布尔
note: null                # 空值
chinese: 中文无需引号      # 中文裸词也行

什么时候必须加引号? 值里含有空格、冒号、方括号 []、花括号 {}、井号 # 等"会干扰解析"的字符时,用引号包起来。拿不准就加引号,永远不会错。

1.4 字符串:裸词 vs 引号

这是 SML 最舒服的地方。对比:

# 下面两者在解析结果里完全等价,都是字符串 "NY"
state: NY
state: "NY"

但邮箱这种带 @ 的也能直接裸写(因为 @ 不在词首时只是普通字符):

email: alice@example.com     # 裸词,@ 在中间,安全
from: "SML Team <dev@mail.swebase.cn>"   # 含空格 -> 引号

1.5 动手试一试

写一个简单的"个人名片":

name: 张三
title: 工程师
city: 北京
age: 30
active: true

然后用任意语言的解析器读它,会得到一棵键值树。下一章我们会把键值组织成块和数组,那才是 SML 真正强大的地方。

第 2 章:块与嵌套

动手练习

读完本章,在下面的编辑器里直接修改 SML 并点“运行”,立刻看到解析结果或校验错误——有输出才能高效学习。

✍ 动手练习 用 SML 描述一个人:firstName("John Doe")、state(裸词 NY)、age(27)、ratio(0.75)、enabled(true)、note(null)。注意何时必须加引号。
💡 提示:把 firstName 的引号去掉,看裸词 NY 和引号串 "John Doe" 在结果里是否都是字符串——答案是:都是字符串,只是 NY 不需要引号。
✍ 自测考题:第 1 章自测:基础键值 得分 0 / 4
Q1. 下面哪一行在 SML 里会把 NY 解析成字符串(而不是报错)?
Q2. 判断:age: 27 解析后,27 是整数而不是字符串。
Q3. 下面哪个值是 SML 支持的标量类型?
Q4. 中文“你好”作为值,需要写成 "你好" 吗?