Переменная область распространения в к - PullRequest
0 голосов
/ 28 февраля 2020

Я видел распространение переменной области на внутреннюю функцию в предыдущих версиях k. См. eval: {[t;c]{x*t+y}/c} в 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}
              ^
  )

Так почему эта ошибка случается? Является ли такое распространение переменной области "запрещено" в современной q?

1 Ответ

1 голос
/ 28 февраля 2020

Действительно, k4, самая последняя реализация k с помощью kx не поддерживает замыкания . Фактически, в статье, на которую вы ссылаетесь, упоминается, что в разделе «Изменения в языке»:

K4 / q - это изменение по сравнению с K3 по ряду важных способов, таких как:

...

  • Вложенные функции в K4 и q не могут ссылаться на локальные переменные окружающей функции . (Часто недостаток этой способности можно обойти, используя проекцию функции.)

Оказывается, что нехватка поддержки лексической области видимости не всегда имела место. Хотя в настоящее время единственным официально документированным языком является q, все еще можно найти справочное руководство для k2, например, реализацию k около 1998 года: 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, значением b, когда g определено, а не последующим значением 4.

  f[]
3

(кстати, я настоятельно рекомендую прочитать весь документ).

Не знаю, почему была прекращена поддержка замыканий, но Я думаю это было связано с производительностью, особенно во время межпроцессного взаимодействия.

...