我想了解的是與下面的語句發生的事情:KDB - 請問該怎麼做「其中」功能的工作
sum(til 100) where 000011110000b
該行的計算結果爲22,我想不通爲什麼。 sum(til 100)
是4950
。 where 000011110000b
返回列表4 5 6 7
。 kdb參考頁似乎沒有解釋這個用例。爲什麼上面的行評估爲22?
而且,爲什麼在錯誤的下面一行結果
4950 where 000011110000b
我想了解的是與下面的語句發生的事情:KDB - 請問該怎麼做「其中」功能的工作
sum(til 100) where 000011110000b
該行的計算結果爲22,我想不通爲什麼。 sum(til 100)
是4950
。 where 000011110000b
返回列表4 5 6 7
。 kdb參考頁似乎沒有解釋這個用例。爲什麼上面的行評估爲22?
而且,爲什麼在錯誤的下面一行結果
4950 where 000011110000b
方括號用於函數調用的參數,而不是括號。因此,上述被解釋爲:
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/