SMathML是一种"标记语言". 顾名思义, 其可以用Scheme来表达MathML. 然而, 实际上其是一个嵌入Racket/Scheme的DSL, 可以用来表达HTML和MathML. 当前SMathML的主要用途是编写本人的博客, 其他用途尚不可知. {注记: Scheme是Lisp方言, Racket是Scheme方言.}
和TeX/LaTeX类似的是, SMathML也需要编译. 而且, 同样类似的是, 为了生成引用, 实际上也需要多趟编译. 然而, 和TeX/LaTeX不同的是, SMathML将排版任务转移给了浏览器, 所以说编译过程更接近于以不同的等价形式表达本质相同的东西 (某种意义上的抽象句法树). 当然, 其中也涉及一些本质性的计算和变换. 然而, 根据个人经验来看, 整体的编译速度是相当之快的 (个人从未进行任何优化). 你可以期望在1秒钟以内编译完成长达1000页的数学笔记.
实际上, 正如名字所暗示的, SMathML可以视为对于MathML(和HTML)的浅层包装. 这里我采用的记号类似于Oleg Kiselyov的SXML. 然而, 有一点关键性的不同, 就是我为属性预留了位置. 这算是一种取舍, 但是我认为这里并不存在本质性的优劣. 另外, SMathML中的一般性变换也在很大程度上模仿了Oleg Kiselyov的SXSLT. 不过, 和SXML不同的是, 虽然SXML可以视为XML的Scheme记号, SXSLT则和XSLT完全不同. SXSLT和XSLT只是用途类似, 都可以对于XML进行变换, 然而从语义上来说可以视为两种截然不同的语言. 实际上, W3C标准里有一个叫做DSSSL的东西, 可以视为对于Scheme的R4RS标准的扩展, 亦可用于处理XML/SGML. 但是, 除了DocBook格式之外, 应该没有使用DSSSL的项目.
Lisp和标记语言有着很深的渊源. 例如, HTML的雏形可以在Lisp机器中所使用的文档格式中看到. 而且, 本质上来说Lisp的句法S-exp和XML/HTML结构是差不多的. 许多项目都使用S-exp作为特定的DSL的句法 ("外观"), 而且往往都嵌入某种Lisp方言来使用. 我们可以举相当多的例子, 例如顽皮狗使用Racket进行脚本配置, Square制作最终幻想: 灵魂深处时使用Scheme作为脚本语言, ... 实际上, Lisp和图形学也有很深的渊源, 不过那就是另外一个主题了.
Lisp格式用于文档处理也有着很长时间的历史了, 例如Interleaf使用了Common Lisp, 其可以用于扩展文本编辑器的功能, 并且文档本身也有一些通过Common Lisp (虽然其被称为Interleaf Lisp, 但是大体上算是对于Common Lisp的扩展) 实现的动态元素. Interleaf已经死了, 但是它的精神还活在如今的TeXmacs之中. (当然了, 它们出现的时间相当接近, 以至于这种说法并不非常准确. 然而, Interleaf死透了却是事实.) TeXmacs可以使用Scheme进行扩展, 并且其格式在某种意义上也是S-exp的翻版 (尽管并不是S-exp). 程序化的文档格式在目前并非主流, 但是或许我希望读者知道, 曾经PostScript格式也是桌面出版领域的绝对霸主, 这也是Adobe公司的立业之本. PostScript可以视为一种Forth方言, Forth是一种语序和日语差不多的古怪语言.
实际上, 以上的内容基本上都是离题万里, 而且在某种意义上可以算是虚张声势. 我并不认为文档格式的最优解一定就是程序化和S-exp, 而且我也知道绝大多数人都无法习惯Lisp和S-exp. 相比于这种古怪的句法, Markdown和LaTeX之类的受众甚至要广阔许多, Typst也可以包括在内.
然而, 这种格式的确具有优点, 也就是其强迫编写者理解文档的结构, 没有任何含糊的余地. 因为, 毕竟SMathML格式是一种程序, 程序必须精确, 不然往往会产生明显可知的错误. DrRacket编辑器的使用也可以帮助SMathML的使用者排除相当多的明显错误, 并且具有相当多实用的功能, 例如输入希腊字母. 不过, SMathML最大的优点还是用户可以创建自己的抽象. 并且, 因为SMathML嵌入于Racket之中, 所以说用户创建的抽象使用起来和Racket和SMathML自带的各种抽象并无区别. 这是相当重要的一点, 因为它使得编写文档的复杂度增长尽可能接近于线性.