代码拉取完成,页面将自动刷新
XScript是语法类似于TypeScript的脚本语言。在XPL中可以通过<c:script>
标签来引入XScript脚本。XScript采用了TypeScript语法的一个子集。
语法定义文件参见 XLangParser.g4
prototype
相关的部分。为简化与Java的互操作,只允许使用Java中已经存在的类型,不能新建类型.undefined
,只使用null
。generator
和async
语法。import
语法,仅支持导入类和标签库,目前不支持导入其他xscript文件。===
相关的语法,禁止==
进行类型转换。while((x=f() != 0))
这种语法是不允许的#{expr}
的形式表示在编译期执行的宏表达式,执行的结果会成为抽象语法树的一部分。例如 // 执行编译期表达式
let x = #{ a.f(3) }
<c:script>
// 执行xpl标签
let y = xpl('my:MyTag',{a:1,b:x+3})
</c:script>
xpl
是一个宏函数,它支持三种调用形式。
result = xpl `<my:MyTag a='${1}' b='${x+3}' />`
result = xpl('my:MyTag',{a:1,b:x+3})
result = xpl('my:MyTag',1, x+3)
第三种形式要求参数顺序和标签库中定义的参数顺序相同
ReflectionManager.instance().registerHelperMethods(List.class, ListFunctions.class, null);
ReflectionManager.instance().registerHelperMethods(String.class, StringHelper.class, "$");
ReflectionManager.instance().registerHelperMethods(LocalDate.class, DateHelper.class, "$");
平台内置为List
增加了ListFunctions
上定义的扩展方法,为String
增加了StringHelper
上定义的扩展方法。所以可以在XScript中使用如下语法
str.$capitalize() // 相当于调用 StringHelper.capitalize(str);
为了避免与Java类上已经定义的方法名冲突,一般扩展方法注册时都增加$
前缀。
ListFunctions
为List
增加了push
/pop
等JavaScript中Array
对象的方法,为了尽量和JavaScript语法接近,这些扩展方法没有增加$
前缀。
$
为前缀的变量名保留为系统变量名,无法在XScript脚本中声明或者设置以$
为前缀的变量。禁止访问System
, Class
等敏感对象。在XScript中可以使用的全局变量和全局函数通过EvalGlobalRegistry
类进行管理。目前主要是注册了GlobalFunctions
类中定义的方法。
在调试模式下,通过前端REST请求可以获知当前系统中注册的所有全局变量和全局函数
/r/DevDoc__globalFunctions
/r/DevDoc__globalVars
其他调试信息参见debug.md
codeGenerator
: XCodeGenerator
类型,precompile
目录下的代码生成模板中可用__dsl_root
:XNode
类型,在x:gen-extends
和x:post-extends
这样的元编程处理段中可用此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。