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 也关闭了社区维基,所以我不知道在哪里可以找到更多信息 - 在此处询问
- Upd2
/
在 k
中也相当过载:参见(虽然不是官方参考)https://github.com/JohnEarnest/ok/blob/gh-pages/docs/Manual.md#over - over
、fixedpoint
、for
和 while
。和 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/1
在 k
而不是 q
的原因是 q
没有矛盾心理。也就是说,所有 q
运算符都没有在化合价上重载,如 q4m.
中第 6.1.2 节所述
与任何q
的副词(每个:'
,超过:/
扫描:\
,优先::
,每个权利: /:
, eachleft:\:
) 结果导数函数被 q
解释为二元函数,除非你使用 [] 专门传递一个参数。
对于上面的示例,q
将 cos/
解释为 do rather than converge,因此需要左侧参数指定迭代次数(请注意 0 cos/ 1
、1 cos/ 1
、2 cos/ 1
等)。首选的解决方法是使用 [] 的:cos/[1]
.
(cos/) 1
起作用是因为用户定义的函数永远不能使用中缀表示法,所以表达式会自动解释为单子应用。这也是 2 (cos/) 1
失败的原因。要解决此问题,您将不得不再次使用 []:(cos/)[2;1]
.
我们在奉承列表中的所有级别时应该使用方括号:
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 也关闭了社区维基,所以我不知道在哪里可以找到更多信息 - 在此处询问
- Upd2
/
在 k
中也相当过载:参见(虽然不是官方参考)https://github.com/JohnEarnest/ok/blob/gh-pages/docs/Manual.md#over - over
、fixedpoint
、for
和 while
。和 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/1
在 k
而不是 q
的原因是 q
没有矛盾心理。也就是说,所有 q
运算符都没有在化合价上重载,如 q4m.
与任何q
的副词(每个:'
,超过:/
扫描:\
,优先::
,每个权利: /:
, eachleft:\:
) 结果导数函数被 q
解释为二元函数,除非你使用 [] 专门传递一个参数。
对于上面的示例,q
将 cos/
解释为 do rather than converge,因此需要左侧参数指定迭代次数(请注意 0 cos/ 1
、1 cos/ 1
、2 cos/ 1
等)。首选的解决方法是使用 [] 的:cos/[1]
.
(cos/) 1
起作用是因为用户定义的函数永远不能使用中缀表示法,所以表达式会自动解释为单子应用。这也是 2 (cos/) 1
失败的原因。要解决此问题,您将不得不再次使用 []:(cos/)[2;1]
.