我已经在k
的早期版本中看到了可变范围向内部函数的传播。参见eval: {[t;c]{x*t+y}/c}
中的[C0
但是如果我尝试在现代http://www.math.bas.bg/bantchev/place/k.html中执行相同的操作,则会收到错误消息:
k
那么为什么会发生此错误?这样的可变范围传播在现代KDB+ 3.6 2018.05.17 Copyright (C) 1993-2018 Kx Systems
q)\
{[k]{x*x}k}3
9
{[k]{x*x+k}k}3
'k
[2] k){x*x+k}
^
)
中是否被“禁止”?
确实,k4,由kx执行的k的最新实现不支持q
。实际上,您所引用的文章的确在“更改语言”一节中提到:
K4 / q是K3在许多重要方面的变化,例如:
...
- K4和q中的嵌套函数不能引用周围函数的局部变量。 (通常,可以通过以下方法来避免此功能的缺乏:利用功能投影。)
事实证明,并非总是缺乏对词法作用域的支持。尽管当今唯一官方记录的语言是q,但是仍然可以找到k2的参考手册,例如k的实现,大约在1998年:closures。第158页的“本地功能”部分显示为:
本地功能
假设函数g在另一个的主体内定义函数f并在其定义中使用变量x,其中x是局部变量到F。则x是g中的常数,而不是变量,其值为定义g时为当前值。例如,如果:
http://www.nsl.com/k/k2/k295/kreflite.pdff的值是局部函数g的值,结果是3,定义g时b的值,而不是后续值4。
f:{b:3; g:{b}; b:4; g[]}
(我强烈建议您阅读整个文档,]。
我不知道为什么不支持闭包,但我认为是由于性能原因,尤其是在进程间通信期间。