k的可变范围传播

问题描述 投票:0回答:1

我已经在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} ^ ) 中是否被“禁止”?

kdb k
1个回答
0
投票

确实,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.pdf

f的值是局部函数g的值,结果是3,定义g时b的值,而不是后续值4。

  f:{b:3; g:{b}; b:4; g[]}

(我强烈建议您阅读整个文档,]。

我不知道为什么不支持闭包,但我认为是由于性能原因,尤其是在进程间通信期间。

© www.soinside.com 2019 - 2024. All rights reserved.