q - while 循环中的内部状态
q - internal state in while loop
在 q 中,我试图在不满足某些条件时在递增参数 id
上调用函数 f
。
函数 f
创建一个 table 的随机长度(在 1 和 5 之间),其列 identifier
取决于输入 id
:
f:{[id] len:(1?1 2 3 4 5)0; ([] identifier:id+til len; c2:len?`a`b`c)}
从 id=0
开始,f
应该在 (count f[id])>1
时调用,即直到生成长度为 1 的 table。 id
应每步递增。
用 "repeat" 副词我可以做 while 条件和起始值:
{(count x)>1} f/0
但是我怎样才能继续递增 id
?
不完全确定这是否会解决您的问题,但我能够通过在函数内部递增 id
并在每次迭代时返回它来使其工作:
q)g:{[id] len:(1?1 2 3 4 5)0; id[0]:([] identifier:id[1]+til len; c2:len?`a`b`c);@[id;1;1+]}
在这种情况下,id
是一个 2 元素列表,其中第一个元素是您要返回的 table(最初是 ()
),第二个元素是 id
.通过修改退出条件,只要输出 table 的计数为 1:
,我就可以让它停止
q)g/[{not 1=count x 0};(();0)]
+`identifier`c2!(,9;,`b)
10
如果你只需要 table 你可以 运行 first
上面表达式的输出:
q)first g/[{not 1=count x 0};(();0)]
identifier c2
-------------
3 a
函数 f
的问题在于,当使用 over 并扫描输出时,如果每次迭代都成为下一次的输入。在您的情况下,您的函数正在处理第二次传递的数值,它将通过 table.
在 q 中,我试图在不满足某些条件时在递增参数 id
上调用函数 f
。
函数 f
创建一个 table 的随机长度(在 1 和 5 之间),其列 identifier
取决于输入 id
:
f:{[id] len:(1?1 2 3 4 5)0; ([] identifier:id+til len; c2:len?`a`b`c)}
从 id=0
开始,f
应该在 (count f[id])>1
时调用,即直到生成长度为 1 的 table。 id
应每步递增。
用 "repeat" 副词我可以做 while 条件和起始值:
{(count x)>1} f/0
但是我怎样才能继续递增 id
?
不完全确定这是否会解决您的问题,但我能够通过在函数内部递增 id
并在每次迭代时返回它来使其工作:
q)g:{[id] len:(1?1 2 3 4 5)0; id[0]:([] identifier:id[1]+til len; c2:len?`a`b`c);@[id;1;1+]}
在这种情况下,id
是一个 2 元素列表,其中第一个元素是您要返回的 table(最初是 ()
),第二个元素是 id
.通过修改退出条件,只要输出 table 的计数为 1:
q)g/[{not 1=count x 0};(();0)]
+`identifier`c2!(,9;,`b)
10
如果你只需要 table 你可以 运行 first
上面表达式的输出:
q)first g/[{not 1=count x 0};(();0)]
identifier c2
-------------
3 a
函数 f
的问题在于,当使用 over 并扫描输出时,如果每次迭代都成为下一次的输入。在您的情况下,您的函数正在处理第二次传递的数值,它将通过 table.