低代码内容分享(七):低代码平台中的元编程(Meta Programming)

本文介绍了Nop平台中的元编程机制,包括宏函数、Xpl模板语言,以及差量生成和合并技术,展示了如何通过这些工具实现代码自动生成和DSL的灵活扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

宏函数

面向代码生成的Xpl模板语言

编译期表达式

自定义宏标签

编译得到AST

XDSL的差量生成与合并机制

数据驱动的差量化代码生成器


在众多的编程语言中,爷爷辈的Lisp语言一直是一个独特的存在,这种独特性有人把它总结为"Lisp是可编程的编程语言" 。这指的是Lisp具有强大的元编程能力,可以由程序员自主创造新的语法抽象。 编程通俗的说就是写代码, 而所谓的元编程指的是写生成代码的代码。 Lisp通过宏提供了元编程的能力,而Lisp宏本质上就是一种内嵌在语言中的代码生成器。除了Lisp语言之外,Scala和Rust这些比较现代的程序语言也提供了所谓的宏的设计,但是宏一般被看作是非常复杂的底层技术,很少进入普通程序员的工具箱。

Nop平台的XLang语言是实现可逆计算原理的核心技术之一,为了落实可逆计算理论所提出的 App = Biz x-extends Generator<DSL>这样一种面向DSL和差量编程的新的编程范式, XLang定义了一整套系统化的、覆盖应用系统开发方方面面的Generator方案。Lisp的宏仅仅是提供了生成Lisp AST的元编程机制,而XLang除了引入宏函数用于生成XLang AST之外,还提供了面向代码生成的Xpl模板语法, 生成的范围从局部的函数实现体,到单个模型文件,再到整个模块目录。特别是Nop平台中定义的所有DSL语言都内置了x:gen-extends这样的差量生成机制,可以在模型解析、加载的过程中动态生成模型差量再自动实现差量合并, 从而创造了一种新的软件结构复用手段,解决了很多在传统编程范式下难以处理的技术问题。在本文中,我将简单介绍一下Nop平台中所内置的这些元编程机制。

宏函数

XLang语言中也定义了类似Lisp宏的宏函数。所谓宏函数是在编译期执行,自动生成Expression抽象语法树节点的函数。

宏函数具有特殊的参数要求,并且需要增加@Macro注解。具体示例可以参见GlobalFunctions。

EvalGlobalRegistry.instance().registerStaticFunctions(GlobalFunctions.class) 会将类中的所有静态函数注册为XScript脚本语言中可用的全局函数

    @Macro
    public static Expression xpl(@Name("scope") IXLangCompileScope scope, @Name("expr") CallExpression expr) {
        return TemplateMacroImpls.xpl(scope, expr);
    }

宏函数的第一个参数必须是IXLangCompileScope类型,第二个参数必须是CallExpression类型,返回值必须是Expression类型。

编译宏函数的时候,会把函数调用所对应的AST作为CallExpression传入。例如

let result = xpl `<c:if test="${x}">aaa</c:if>`

编译xpl宏函数的时候CallExpression的第一个参数是TemplateStringLiteral,也就是上面调用中的XML文本 <c:if test="${x}">aaa</c:if>。 在宏函数中我们可以自行解析这个XML文本,然后构造出新的Expression对象返回。

利用宏函数机制,结合XScript语言中的TemplateStringLiteral,我们可以很容易的将不同语法格式的DSL嵌入到XScript语言中。例如,* *提供类似C# LinQ的SQL查询语法**。

let result = linq `select ff from myObject o  where o.value > 3`

目前在Nop平台中,内置了如下宏函数

函数名 说明
xml 解析XML文本得到XNode节点,并包装为LiteralExpression
xpl 解析Xpl模板文本得到Expression
sql 解析Xpl模板文本得到生成SQL语句的Expression
jpath 解析json path得到JPath对象,并包装为LiteralExpression
xpath 解析 XSelector文本得到XSeletor对象,并包装为LiteralExpression
selection 解析类似GraphQL Query的对象属性选择文本得到 FieldSelection对象,并包装为LiteralExpression
order_by 解析 order by语句片段,得到List对象,并包装为LiteralExpression
location 返回调用函数所在的源码位置,并包装为LiteralExpress
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之乎者也·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值