Expressions/operator Amend At 和函数参数中的优先级

Expressions/operator precedence in Amend At and in function parameters

我一直认为在 qk 中所有表达式除法 ; 都是从左到右求值的,里面的运算符优先级是从右到左的。

但后来我尝试将此原则应用于 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-e-is-not-a-function

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
       ^

分号是q中的多用途分隔符。它可以分隔语句(例如 a:10; b:20),在这种情况下语句是从 从左到右 评估的,类似于许多其他语言。但是当它分隔列表的元素时,它会创建一个 list expression 与任何其他 q 一样,它(一个表达式)从 right-to-left表达式将是。

就像这个例子:

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,然后才计算 bc 的语句。换句话说,在这种情况下,abc 不是某些函数 $ 的参数。