Сходимость (фиксированная точка) синтаксическая разница в q и k - PullRequest
0 голосов
/ 27 февраля 2020

Мы должны использовать квадратные скобки, чтобы льстить всем уровням в списке:

q)b:(1 2;(3 4;5 6);7;8)
q)raze/[b]               / flatten all levels
1 2 3 4 5 6 7 8
q)raze/b
'/
  [0]  raze/b

Но почему нужно использовать raze/[b] для сходящегося синтаксиса вместо простого raze/b?

  • Upd

Почему этот синтаксис работает в k, например {x+y}/1 2 3, но не работает в q?

Мое предположение, что он был сделан для предотвращения qbies ошибки при использовании / наречие вместо %. Я думаю, что об этом может быть обсуждение в каком-то канале разработчиков, но я нашел сейчас только группу обсуждения Shakti на https://groups.google.com/forum/#! Forum / shaktidb , и kx.com также закрыл вики сообщества, так что я не знаю, где найти дополнительную информацию - спрашиваю здесь

  • Upd2

/ тоже перегружен в k: смотрите (не Официальный исх.) https://github.com/JohnEarnest/ok/blob/gh-pages/docs/Manual.md#over - over, fixedpoint, for и while. Почти так же, как в q, верно? Но почему интерпретатор «запрещает» синтаксис k в контексте q, - есть ли техническая причина, по которой q не может распознать намерение пользователя, как это делает k?

Ответы [ 2 ]

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

Причина, скажем, cos/1 работает в q, но не k, заключается в том, что q не имеет двойственности. То есть все операторы q не перегружены валентностью, как отмечено в разделе 6.1.2 в q4m .

с любым из наречий q (каждый: ', поверх: / сканирование: \, ранее: :, каждое право: /:, каждый лево: \:) результирующая производная функция интерпретируется q как диади c, если только вы не используете [] для конкретной передачи одного аргумента.

Для приведенного выше примера q интерпретирует cos/ как do вместо сходящихся и поэтому требует левый аргумент, указывающий количество итераций (обратите внимание на результаты 0 cos/ 1, 1 cos/ 1, 2 cos/ 1, et c.). Предпочтительным способом разрешения является использование []: cos/[1].

(cos/) 1 работает, потому что пользовательские функции никогда не могут использовать инфиксную нотацию, поэтому выражение автоматически интерпретируется как монадическое применение. Это также, почему 2 (cos/) 1 терпит неудачу. Чтобы решить эту проблему, вам снова придется использовать []: (cos/)[2;1].

2 голосов
/ 27 февраля 2020

Вам не обязательно использовать квадратные скобки здесь. Вы можете использовать

(raze/)b

, если не хотите использовать квадратные скобки вокруг b. То, как вы используете over (или /) без скобок вокруг b, требует скобки вокруг raze/b, если вы не укажете начальное значение аккумулятора. Это связано с тем, что интерпретатору q нужно знать, что вы применяете raze/ к списку b, а не применяете сначала / к списку (именно поэтому выдается ошибка '/), а затем raze после ( читая код справа налево).

Более подробную информацию об использовании / можно найти здесь: https://code.kx.com/q4m3/6_Functions/#676 -на-накопления

...