Выражения / приоритет оператора в Amend At и в параметрах функции - PullRequest
0 голосов
/ 30 апреля 2020

Я всегда думал, что в q и в k все выражения, разделенные ;, оцениваются слева направо, а приоритет оператора внутри справа налево.

Но потом я попытался применить этот принцип к Ament At параметров оператора. Может показаться, что он работает в противоположном направлении:

$ q KDB+ 3.6 2019.04.02 Copyright (C) 1993-2019 Kx Systems
q)@[10 20 30;g;:;100+g:1]
10 101 30

Тот же приоритет работает и в параметрах функции:

q){x+y}[q;10+q:100]
210

Так почему же это происходит - почему он сначала вычисляет последний один параметр и только потом первый? Это функция, которую мы должны избегать?

Upd : оценка против анализа. Могут быть и другие случаи: https://code.kx.com/q/ref/apply/#when -е-не-функция

q)@[2+;"42";{)}]
')
  [0]  @[2+;"42";{)}]
q)@[string;42;a:100] / expression not a function
"42"
q)a // but a was assigned anyway
100
q)@[string;42;{b::99}] / expression is a function
"42"
q)b // not evaluated
'b
  [0]  b
       ^

1 Ответ

3 голосов
/ 01 мая 2020

Точка с запятой является многоцелевым разделителем в q. Он может разделять операторы (например, a:10; b:20), в этом случае операторы оцениваются от слева направо , как и во многих других языках. Но когда он разделяет элементы списка, он создает выражение списка , которое (выражение) оценивается от справа налево , как и любое другое выражение q.

Как в этом примере:

q)(q;10+q:100)
110 100

Одна из многих перегрузок оператора точки (.) оценивает свой левый операнд в списке значений в своем правом операнде:

q){x+y} . (q;10+q:100)
210

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

Однако последнее - это просто еще один способ получения результат

{x+y}[q;10+q:100]

, который должен давать то же значение. И это так. Оценивая аргументы функции от справа налево , конечно!

Примечание. Пожалуйста, не смущайтесь условной оценкой утверждение $[a;b;c]. Несмотря на то, что это выглядит как выражение, на самом деле это оператор, который сначала оценивает a и только затем b или c. Другими словами a, b и c не являются аргументами некоторой функции $ в этом случае.

...