0

我一直认为 inq和 ink所有表达式中的划分;是从左到右计算的,而里面的运算符优先级是从右到左的。

但后来我尝试将此原理应用于 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

那么为什么会发生 - 为什么它首先计算最后一个参数,然后才第一个?这是我们应该避免的功能吗?

更新:评估与解析。可能还有其他情况: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
       ^
4

1 回答 1

3

分号是 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首先计算,然后才计算bor c。换句话说ab和在这种情况下c不是某些函数的参数。$

于 2020-04-30T22:22:26.627 回答