柯里化不直接装载解析器,而是将公式解析逻辑拆解为可配置、可复用、可延迟执行的函数链,实现按需动态装配;它通过封装初始化过程、配合配置驱动注册表、支持嵌套条件切换,并作为胶水层桥接第三方引擎,达成零感知延迟的解析行为组装。

柯里化本身不直接“装载”解析器,但它能帮你把公式解析逻辑拆解成可配置、可复用、可延迟执行的函数链,从而实现按需动态装配——关键不是加载代码,而是组装行为。
把解析器变成可参数化的函数工厂
低代码平台中,公式解析器常需适配不同语法(如 JS 表达式、SQL 片段、自定义 DSL)。与其硬编码多个解析器实例,不如用柯里化封装其初始化过程:
- 定义基础解析函数:parse(source, grammar, context),接收原始字符串、语法规则、运行时上下文
- 柯里化后得到:const parseJS = parse('js')('default') → 返回一个只等
source的函数 - 再进一步:const parseWithUser = parseJS.bind(null, { user: currentUser }),预置上下文
这样,每个表单字段绑定的“解析行为”,实际是一个已预设好语法和环境的轻量函数,无需在渲染时重复初始化解析器引擎。
配合配置驱动,实现运行时动态选型
低代码页面配置中,字段可声明 "formulaType": "math" 或 "formulaType": "sql-aggregate"。平台据此查表调用对应柯里化后的解析器:
- 维护一个注册表:
const parsers = { math: curry(parse)(‘math’), sql: curry(parse)(‘sql’) } - 字段配置生效时:
const resolver = parsers[config.formulaType] || fallbackParser - 该
resolver已携带语法信息,只需传入当前数据即可执行:resolver(data)
整个过程无 new 实例、无 import 动态加载、不触发模块重载——只是从缓存函数池中取出一个已预制好的函数,真正做到了“按需”且“零感知延迟”。
支持嵌套依赖与条件切换
复杂场景下,公式类型可能由上游字段决定(例如:选择“统计模式”→启用 SQL 解析;选“实时计算”→切回 JS 表达式)。柯里化天然支持这种链式推导:
- 写一个高阶函数:
const getParser = (mode) => mode === 'sql' ? parsers.sql : parsers.js - 再柯里化它:
const parserForMode = curry(getParser) - 最终绑定为:
const fieldParser = parserForMode(config.mode)(data)
当 mode 变更时,parserForMode 重新求值,返回新解析函数——旧函数自动被 GC,新函数立即可用,无需刷新组件或重建上下文。
与 OneCode 表达式引擎协同工作
OneCode 的表达式系统本身基于解释器模式,其 ExpressionParser 接口支持插件化扩展。柯里化可作为胶水层,把第三方解析能力“包装”成符合其签名的执行器:
- 假设某客户引入了自研的风控公式引擎
RiskFormula.eval() - 用柯里化桥接:
const riskParser = curry(RiskFormula.eval)(context).bind(null, options) - 注册进 OneCode:
ExpressionParser.register('risk', riskParser)
后续所有标记 type: 'risk' 的表达式,都会被这个预置好上下文的函数处理——既复用了原有引擎,又不侵入核心框架,也不增加运行时判断分支。











