主要观点:作者介绍了自己创建的 MiniJinja 模板引擎,包括其背景、特点、运行时值、枚举器与对象行为、构建虚拟机以及一些有趣的 API 等方面。
关键信息:
- 2024 年作者创建 MiniJinja,原本用于生成带 JavaScript 的 HTML,现在用于生成 YAML 等格式,近期用于 LLM 提示生成。
- MiniJinja 不用代码生成,有基于栈的 VM 和 AST 字节码编译器,核心对象模型是
Value
类型枚举。 - 枚举器用于描述对象内部内容,不同枚举类型决定迭代方式,
ObjectRepr
决定对象的显示和交互方式。 - 构建虚拟机时,AST 设计采用大型枚举加
Spanned<T>
,指令枚举种类多但参数少,VM 通过State
对象维护运行时状态。 - 宏在虚拟机中是有挑战的,通过 ID 动态查找指令,且要处理闭包导致的循环问题。
- 介绍了一些魔法般的 API,如通过 trait hackery 实现不同签名函数的注册和类型转换。
重要细节:
- MiniJinja 游乐场、API 文档、GitHub 项目及 crates.io 上的相关资源。
Value
类型中各种变体的作用及内存管理方式,如Arc
用于引用计数,SmallStr
用于存储短字符串。- 不同类型对象(如
BTreeMap
和Vec
)作为Object
的实现细节。 - 函数注册和类型转换背后的 trait 体系,包括
FunctionArgs
、ArgType
、Filter
和FunctionResult
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。