q 和 k 中的收敛(定点)语法差异

Converge (fixed point) syntax difference in q and k

我们在奉承列表中的所有级别时应该使用方括号:

q)b:(1 2;(3 4;5 6);7;8)
q)raze/[b]               / flatten all levels
1 2 3 4 5 6 7 8
q)raze/b
'/
  [0]  raze/b

但为什么有人被迫使用 raze/[b] 作为 Converge 语法而不是简单的 raze/b

为什么此语法在 k 中有效,例如 {x+y}/1 2 3 但在 q 中无效?

我假设它是为了防止在使用 / 副词而不是 % 时出现 qbies 错误。我认为在某些开发频道中可能有关于它的讨论,但我目前只在 https://groups.google.com/forum/#!forum/shaktidb 找到了 Shakti 讨论组,并且 kx.com 也关闭了社区维基,所以我不知道在哪里可以找到更多信息 - 在此处询问

/k 中也相当过载:参见(虽然不是官方参考)https://github.com/JohnEarnest/ok/blob/gh-pages/docs/Manual.md#over - overfixedpointforwhile。和 q 里的差不多吧?但是为什么解释器 'ban' q 上下文中的 k 语法,- 是否有技术原因导致 q 无法识别用户意图 k是吗?

这里不一定需要方括号。你可以使用

(raze/)b

如果您不想在 b 周围使用方括号。如果您没有指定累加器的初始值,则在 b 周围没有括号的情况下使用 over ( 或 /) 的方式需要 raze/b 周围的括号。这是因为 q 解释器需要知道您正在将 raze/ 应用于列表 b 而不是首先将 / 应用于列表(这就是 '/ 错误的原因抛出)然后 raze 之后(从右到左阅读代码)。

可在此处找到有关使用 / 的更多信息:https://code.kx.com/q4m3/6_Functions/#676-over-for-accumulation

cos/1k 而不是 q 的原因是 q 没有矛盾心理。也就是说,所有 q 运算符都没有在化合价上重载,如 q4m.

中第 6.1.2 节所述

与任何q的副词(每个:',超过:/扫描:\,优先::,每个权利: /:, eachleft:\:) 结果导数函数被 q 解释为二元函数,除非你使用 [] 专门传递一个参数。

对于上面的示例,qcos/ 解释为 do rather than converge,因此需要左侧参数指定迭代次数(请注意 0 cos/ 11 cos/ 12 cos/ 1 等)。首选的解决方法是使用 [] 的:cos/[1].

(cos/) 1 起作用是因为用户定义的函数永远不能使用中缀表示法,所以表达式会自动解释为单子应用。这也是 2 (cos/) 1 失败的原因。要解决此问题,您将不得不再次使用 []:(cos/)[2;1].