形上谓之道,形下谓之器。欲求大道,先固小器。方今之世,程式盛行,盖为此信息世界 之中枢也。夫算法之深,可谓程式之道,而数据之广,可谓程式之器。虽以西学之源,中 文编程亦求索由久。昔有易语言、习语言,复有周蟒、中蟒,仅拟其形,未传其神。今有 文言编程,始信登堂入室,一呼百应。 承先人文字之精义,窥今世程式之奥秘,善莫大焉。然以完备语言之繁复,行外民众徒生 景仰而望之怯步。故效先贤之斧凿,择至简之子集以叙数据。虽为小器,举轻若重,尚其中 庸,堪为诸般风骚语言之所用,以通程式之道。是曰文言重器,惟愿同乘妙法,共筑此器。
受 wenyan-lang 的启发,并参考 json 从 javascript 取子集的做法,设计 wenyan-json ,用文言语法表达通用数据结构。标准语法尽量精简化、最小化。同时提出 分级语法的主张,高级语法允许更多的冗余以更符合自然语言的诵读语法。具体的编译实 现需要权衡。
wenyan-json 简称 wson
,也可称之为 Wide Unicode Based Json 。wson 与 json 一
样,有且只有六种数据类型:
- 两种基础标量,数(number)与言(string)
- 两种集合结构,列(array)与表(object)
- 两种特殊类型,爻(bool)只有两个值,阴(false)阳(true),空(null)类型只 有一个值,也就叫空(null)
json type | json value | wson type | wson value |
---|---|---|---|
number | 123 | 数 | 一二三 |
string | "string" | 言 | 『文字』 |
array | [ ] | 列 | 列也 |
object | { } | 表 | 表也 |
bool | true false | 爻 | 陽 陰 |
null | null | 空 | 空 |
注一:除列表外,其他类型名称不必出现在 wson 文档中。当前 wenyan-lang 对 object 译为“物”。
注二:wenyan-lang 只限定繁体汉字作关键字,wson 关键字很少,主要也只有“阴阳”二 值有简繁变体,可同时支持,或在实现中允许指定选项。
注三:wson 文档建议用 .wson
作为文件后缀名,或用 .文语
。但它本质上只是纯文
本文件,与后缀无关,但须用 utf-8 编码。
以示例介绍语法要点。
["李白", 701, 762, false]
此 json 数据对应 wson:
列曰『李白』曰七零一曰七六二曰阴也
{"诗人":"李白", "生年":701, "卒年":762, "在世":false}
此 json 数据对应 wson:
表之『诗人』曰『李白』之『生年』曰七零一之『卒年』曰七六二之『在世』曰阴也
也可缩进排版如下,但空白是忽略的:
列
曰『李白』
曰七零一
曰七六二
曰阴
也
表
之『诗人』曰『李白』
之『生年』曰七零一
之『卒年』曰七六二
之『在世』曰阴
也
列表可以任意嵌套表达需要的复杂数据结构,如:
表
之『生卒年』曰空
之『朝代』曰『唐』
之『诗人』曰『李白』
之『代表作』曰列
曰表
之『诗题』曰『静夜思』
之『诗文』曰『床前明月光,疑是地上霜。举头望明月,低头思故乡』
也
曰表
之『诗题』曰『望庐山瀑布』
之『诗文』曰『日照香炉生紫烟,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。』
也
也
之『尊号』曰『诗仙』
之『好友』曰列
曰『孟浩然』
曰『汪伦』
曰表
之『生卒年』曰空
之『朝代』曰『唐』
之『诗人』曰『杜甫』
之『代表作』曰列
曰表
之『诗题』曰『春望』
之『诗文』曰『国破山河在,城春草木深。感时花溅泪,恨别鸟惊心。烽火连三月,家书抵万金。白头搔更短,浑欲不胜簪。』
也
曰表
之『诗题』曰『春夜喜雨』
之『诗文』曰『好雨知时节,当春乃发生。随风潜入夜,润物细无声。野径云俱黑,江船火独明。晓看红湿处,花重锦官城。』
也
也
之『尊号』曰『诗圣』
之『好友』曰陰
也
也
也
以上示例 wson 文档其实是由如下 json 编码(encode)而成:
{ "诗人":"李白", "朝代":"唐", "尊号":"诗仙", "生卒年":null, "代表作":[ { "诗题":"静夜思", "诗文":"床前明月光,疑是地上霜。举头望明月,低头思故乡" }, { "诗题":"望庐山瀑布", "诗文":"日照香炉生紫烟,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。" } ], "好友":[ "孟浩然", "汪伦", { "诗人":"杜甫", "朝代":"唐", "尊号":"诗圣", "生卒年":null, "代表作":[ { "诗题":"春望", "诗文":"国破山河在,城春草木深。感时花溅泪,恨别鸟惊心。烽火连三月,家书抵万金。白头搔更短,浑欲不胜簪。" }, { "诗题":"春夜喜雨", "诗文":"好雨知时节,当春乃发生。随风潜入夜,润物细无声。野径云俱黑,江船火独明。晓看红湿处,花重锦官城。" } ], "好友":false } ] }
因表(object)的键名是顺序无关的,故而两者是同构的。
- 分别以“列也”与“表也”表示这两种数据结构,其他标量直接以字面量表达。一个 wson 文档一般以“列也”或“表也”起始与终止,但其他只有一个标量的字符串也是合法的 wson 。
- “列也”内部各项用“曰”引导各值。“表也”内部各项用“之”引导键名,用“曰”引导键值。
- 数字字面量,允许“一二三”与“一百二十三”两种表示法。
- 字符串的双引号,有繁体『』与简体“”两对。表内的名字也须用双引号括起。转义是程序
特有现象,为保持 wson 简洁性,直接按主流习惯用反斜杠转义
\
,主要用于转义引 号本身与换行符、制表符。一般用户用到的机率小,且以『』为引号时,内部的“”的不必转 义,反之亦然。 - 与标准 json 一样不允许注释,如有必要,可用“表之『注』曰『这是注释』……”表示。
- 结构关键字除简繁异体外只有
列表也阴阳空之曰
这几个,此外汉字数字有十数个。
- 兼容标准语法
- 允许标点符号,解析时忽略标点符号,主要包括
、。,;:!?……
- 允许用双破折号表示注释,如
wson字符流——这是注释——wson字符流
- 表之键名的双引号可省略,除非含有冲突关键字。
表之好友曰列:曰『孟浩然』、曰『杜甫』——就是人称诗圣那位——曰『汪伦』也也
{"好友":["孟浩然","杜甫","汪伦"]}
最接近 wenyan-lang 现有语法的提案。
- “物”“表”关键字通用。
- 结构结束关键字“也”可充斥为“是谓『某名』之物也”,“是谓『某名』之列也”,当列内 元素无名时,可用“是谓其物也”“是谓其列也”。这可增加结尾呼应感,且避免重复的“ 也”字粘连。
物之『好友』曰列
曰『孟浩然』、曰『杜甫』、曰『汪伦』
是谓『好友』之列也
是谓其物也
{"好友":["孟浩然","杜甫","汪伦"]}
- “列”可如“表”一样展开,如“列之一曰阴之二曰阳之三曰空也”,列项的名字即其索引, 列的索引从一开始。
- 列表内每项可包含三个关键部分的完整描叙,如“名之『某名』者,有数,其实曰三”。
- 每种类型的值,可统一用“实”字描叙,也可依不同类型使用对应的字,具体对应为“数 值”、“言语”、“列序”、“物形”、“表律”、“爻象”,即表示一个数时,可称“其值曰”, 但在标准简洁语法中只省略为“曰”。
- 表示一项的三个子句,“有”“名”“实”顺序可不限,只“有某类型”子句不能出在最后,其 他情况都是汉语通顺的。
- 在不影响自然语义的情况下,可充斥或省略非关键字以增加语感。
表
名之甲者,有数,其值曰三十;
名之乙者,有言,其语曰『如此甚好』;
名之丙者,有爻,其象曰陰;
名之丁者,有空,其实曰空——批注:直言曰空更简洁——
名之好友者,有列,其序曰:
『好友』之一曰『杜甫』;
『好友』之二曰『孟浩然』;
『好友』之二曰『汪伦』
是谓『好友』之列也
是谓其表也
虽然更自由,但也非完全自由,仍需遵循一定规范,戴着镣铐跳舞。
主要两个功能:
- 编码
encode
,将json
文本转换为wson
文本 - 解码
decode
,将wson
文本转换为json
文本
可额外提供选项指定语法级别,简繁异体及格式化缩进等需求。
目前笔者先尝鲜使用 viml 脚本语言实现了标准语法的编码与解码。其他主流与非主流语 言对 wson 标准语法的实现应该都是简单的,期望有更多的实现列于如下,尤其是 wenyan-lang 自举版:)
实现语言 | 支持 wson 语法级别 |
---|---|
viml | 标准语法 |