修改语言本身属于反射和元编程的范畴。它被称为行为反射。它不同于在应用程序级别(例如类、方法)而不是在语言级别运行的结构反射。对行为反思的支持因语言而异。
我们可以将语言变化大致分为两类:
- 修改语言本身的语义(即规则)的更改(例如重新定义方法查找算法),
- 修改语法的更改(例如,您的语法“1..4”来创建数组)。
对于案例 1,某些语言通过称为元对象的特殊对象将应用程序的结构(结构反射)及其实现的内部工作(行为反射)暴露给应用程序本身。元对象是其他隐含方面的具体化,然后变得可显式操作:应用程序可以修改元对象以重新定义其结构的一部分或语言的一部分。当涉及到语言更改时,重点通常是修改消息发送/方法调用,因为它是面向对象语言的核心机制。但同样的想法也可以应用于暴露语言的其他方面,例如字段访问、同步原语、foreach 枚举等,具体取决于语言。
对于情况 2,程序必须以合适的数据结构表示,以进行修改。对于 lisp 系列的语言,程序操作列表,程序本身可以表示为列表。这被称为同音性,对于元编程很方便,因此类 lisp 语言的灵活性。对于其他语言,它们的表示通常是 AST。在编译或类加载期间,可以使用宏、预处理器或挂钩来转换或重写程序的表示。
然而,1 和 2 之间的界限是模糊的。句法变化可能会修改语言的语义。例如,我可以使用适当的 getter 和 setter 重写所有字段访问,并在那里执行额外的逻辑,比如实现事务内存。我是对什么是字段访问进行了语义更改,还是仅仅更改了语法?此外,还有其他的构造落在线条之下。例如,代理和#doesNotUnderstand
陷阱是在一定程度上模拟消息发送的具体化的流行技术。
Lisp 和 Smalltalk 在元编程领域非常有影响力,我认为以下两个项目/平台对于每个项目/平台的代表都很有趣:
- Racket,一种类似 lisp 的语言,专注于从语言中发展语言
- Helvetia,一个 Smalltalk 扩展,通过利用宿主环境的 AST 将新语言嵌入宿主语言。
我希望你喜欢这个,即使我没有真正解决你的问题;)
您所需的更改需要修改创建文字的方式。这是 AFAIK 通常不暴露给应用程序。我能想到的封闭工作是Virtual Values for Language Extension,它处理了 Javascript。