是的 Python 和 DolphinDB 的函数名称查找过程不同, 闭包的实现也不同
不过可以通过两种办法绕过
1. 部分应用
def f(argf){
g = def(arg){return arg()}{argf}
}
2. 采用 call 函数间接调用
def f(argf){
g = def(): call(argf)
}
另外可以看一下使用 DolphinDB 脚本实现的 z 组合子: (参考了 https://lptk.github.io/programming/2019/10/15/simple-essence-y-combinator.html)
def mkrec(f){ return f(f)}
mkrec_nice = def(g): mkrec(def(rec): call(g, def(y): rec(rec)(y)))
fact = mkrec_nice( def(rec){return def(x,rec){ if(x == 0) {return 1} else{return rec(x - 1) * x} }{, rec}})
fact(2)
fact(3)
fact(4)