2016-12-29 58 views
3

我想了解的是與下面的語句發生的事情:KDB - 請問該怎麼做「其中」功能的工作

sum(til 100) where 000011110000b 

該行的計算結果爲22,我想不通爲什麼。 sum(til 100)4950where 000011110000b返回列表4 5 6 7。 kdb參考頁似乎沒有解釋這個用例。爲什麼上面的行評估爲22?

而且,爲什麼在錯誤的下面一行結果

4950 where 000011110000b 

回答

3

方括號用於函數調用的參數,而不是括號。因此,上述被解釋爲:

sum[(til 100) where 000011110000b] 

,現在就可以大概明白爲什麼會評估爲22,也就是說,它是第5,第6,第7,列表til 100,即第八值(總和0 ... 99),因爲where被索引到til 100使用布爾列表000011110000b

q)til[100] where 000011110000b 
4 5 6 7 

正如你可能已經注意到,你可以調用函數時省略方括號;但是當你這樣做時,你需要確保它將按照預期被解析/解釋。一般來說,代碼評估從右到左因此在這種情況下,(til 100) where 000011110000b首先被評估,並且結果被傳遞到sum函數。

關於4950 where 000011110000b - 再次,如果我們認爲從右到左,解釋器試圖將where 000011110000b的結果傳遞給函數4590。儘管4590不是kdb中的命名函數 - 這是用於IPC的格式,即通過TCP在其他kdb進程上執行命令。因此,您正在告訴kdb使用操作系統文件描述符編號4590(幾乎肯定不會對應於有效的TCP連接)來運行命令where 000011110000b。有關更多詳細信息,請參閱此處的「消息格式」部分: http://code.kx.com/q/tutorials/startingq/ipc/