0

我在以前版本的k. 见http://www.math.bas.bg/bantchev/place/k.htmleval: {[t;c]{x*t+y}/c} _

但是如果我尝试在 modern 中做同样的事情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}
              ^
  )

那么为什么会发生这个错误呢?这种可变范围传播在现代是否被“禁止” q

4

1 回答 1

1

实际上,k4,kx 对 k 的最新实现不支持闭包。实际上,您所指的文章确实在名为“更改语言”的部分中提到了这一点:

K4/q 在许多重要方面是对 K3 的改变,例如:

...

  • K4 和 q 中的嵌套函数不能引用周围函数的局部变量。(通常,可以通过使用函数投影来规避这种能力的缺乏。)

事实证明,缺乏对词法作用域的支持并非总是如此。虽然现在唯一官方记录的语言是 q,但仍然可以找到 k2 的参考手册,这是 1998 年左右的 k 实现,例如:http ://www.nsl.com/k/k2/k295/kreflite.pdf . 第 158 页的“局部函数”部分内容如下:

局部函数

假设函数 g 定义在另一个函数 f 的主体中,并在其定义中使用变量 x,其中 x 是 f 的局部变量。那么 x 是 g 中的一个常数,而不是变量,它的值是定义 g 时的当前值。例如,如果:

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

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

  f[]
3

(顺便说一句,我强烈建议您阅读整个文档)。

我不知道为什么放弃了对闭包的支持,但我认为这是因为性能原因,尤其是在进程间通信期间。

于 2020-02-28T09:54:29.343 回答