需要说明 kdb/q 保存分区的脚本 table

Need to explain the kdb/q script to save partitioned table

我试图从以下来源理解这段代码:

https://code.kx.com/q/kb/loading-from-large-files/

自己定制(e.x按小时、分钟、滴答数等划分):

$ cat fs.q
\d .Q

/ extension of .Q.dpft to separate table name & data
/  and allow append or overwrite
/  pass table data in t, table name in n, : or , in g
k)dpfgnt:{[d;p;f;g;n;t]if[~&/qm'r:+en[d]t;'`unmappable];
 {[d;g;t;i;x]@[d;x;g;t[x]i]}[d:par[d;p;n];g;r;<r f]'!r;
 @[;f;`p#]@[d;`.d;:;f,r@&~f=r:!r];n}

/ generalization of .Q.dpfnt to auto-partition and save a multi-partition table
/  pass table data in t, table name in n, name of column to partition on in c
k)dcfgnt:{[d;c;f;g;n;t]*p dpfgnt[d;;f;g;n]'?[t;;0b;()]',:'(=;c;)'p:?[;();();c]?[t;();1b;(,c)!,c]}

\d .

r:flip`date`open`high`low`close`volume`sym!("DFFFFIS";",")0:
w:.Q.dcfgnt[`:db;`date;`sym;,;`stats]
.Q.fs[w r@]`:file.csv

但是我找不到任何资源来给我详细解释。例如:

if[~&/qm'r:+en[d]t;'`unmappable];

参数d有什么作用?

(将其提升为答案,因为我认为它有助于回答问题)。

根据评论链:为了将 k 代码翻译成 q 代码(或者只是为了理解 k 代码),您有几个选择,none 其中有特别详细的记录违背了 q 语言的目的——成为掩盖 k 语言的包装器。

选项 1 是检查 .q 命名空间中的内置函数

q).q
          | ::
neg       | -:
not       | ~:
null      | ^:
string    | $:
reciprocal| %:
floor     | _:
...

选项 2 是检查创建上述命名空间的 q.k 脚本(注意不要 edit/change 这个):

vi $QHOME/q.k

选项 3 是在 code.kx 网站上查找一些重要的文档,例如 https://code.kx.com/q/wp/parse-trees/#k4-q-and-qk and https://code.kx.com/q/basics/exposed-infrastructure/#unary-forms

选项 4 是 google 为 k 的 other/similar 版本搜索参考 material,例如 k2/k3。他们往往是相似的。

最后要注意的一点是,在大多数这些示例中,您会在原语之后看到一个冒号 (:)...此冒号在 q/kdb 中是必需的,以使用原语的单子形式(大多数都严重超载)而在 k 中不需要显式强制 monadic 形式。这就是为什么 where 在 q 参考中显示为 &: 但在实际 k 代码中通常只是 &