这篇文章基于之前构建的仅基于消息调度的最小面向对象语言,进一步展示了语言语义的灵活性以及可添加额外阶段的特性。
主要阶段及功能:
- 宏阶段(macro phase):在回复处理程序定义、名称绑定中引用正确的内容,并通过引用右侧实现短路布尔运算符的支持。程序员无需手动引用。
- 优化阶段(opt phase):应用一些基本优化,如评估常量子表达式、删除不必要的包装等。
- 运行阶段(run phase):按照既定语义处理表达式。
示例及解释:
- 对于算术表达式,如
1 + 2
,宏阶段无操作,优化阶段评估为3
,运行阶段接收3
并输出3
。 - 对于比较操作,如
1 > 2
,宏阶段无操作,优化阶段输出()
,运行阶段输出()
。 - 对于字符串连接,如
"hello " + "joe"
,宏阶段无操作,优化阶段连接为"hello joe"
,运行阶段输出"hello joe"
。 - 对于复杂表达式,如
(1 + 2) : 3
,优化阶段先评估内部表达式,再进行后续操作。 - 对于条件表达式,如
()? 1 : 2
,宏阶段将非Later
的主体用@
包裹,优化阶段根据条件值进行相应处理。 - 对于短路布尔操作,如
() and 1
,宏阶段包裹右侧,优化阶段根据左侧值进行处理。
- 对于算术表达式,如
代码结构及注意事项:
- 代码基于特定提交
[7302325](https://github.com/marianoguerra/mclulang/tree/730232579ff66fead161efb97634d51300b54174)
,仓库代码可能会变化。 - 模块导入自
[fatter.js](https://github.com/marianoguerra/mclulang/blob/730232579ff66fead161efb97634d51300b54174/fatter.js)
,其错误处理更好且Frame
有额外方法getSendHandler
。 - 各阶段的
eval
函数实现不同,宏阶段扩展可扩展内容,优化阶段减少可优化内容,运行阶段处理已知操作。
- 代码基于特定提交
额外说明:
- 这两个阶段可以在每次执行前“即时运行”,也可以在“构建时”运行一次并存储优化结果。
- 没有抽象语法树和中间表示,“树”是运行时值类型的组合,各阶段输入输出类型相同。
- 为将各阶段的输入输出转换为字符串,有额外的阶段。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。