KDB "value "范围作为局部变量

问题描述 投票:0回答:3

是否可以在函数中传递一个字符串作为命令,而函数能够识别其局部变量?例如,在下面的例子中 value "a+:1"; 认不出 a 是函数内部的一个局部变量。

.th.f:{[a]
   iterations: (1+ til 4);
   while[count (iterations);
      value "a+:1";
      iterations: 1_iterations
   a};

test: .th.f[5];
test //gives 5 instead of 10 ...[1 + 2 + 3 + 4]

我需要的是 value "a+:1"; 知道 a 确实是函数内部的一个局部变量。

我目前正在处理一个更复杂的问题,其中传递字符串作为q命令是唯一的解决方法。

kdb
3个回答
1
投票

虽然我很难接受传递这样的字符串是解决这个问题的唯一方法,我也不推荐使用这个解决方案......这样的方法也许能帮到你。

local_context:([]());
.th.f:{[a;v;f] n:?[local_context;();();`$v];
    it:1+til 4;
    while[count it;n:f n;it:1_it];
    n};

q).th.f[5;"a";{x+1}]
9
q).th.f[10;"a";{x+1}]
14
q).th.f[10;"a";{x+2}]
18

我在这里拆开了... "a+:1" 纳入变量 "a" 和功能 {x+1}. 如果你还坚持认为必须是 "a+:1" 那么你可以想办法翻译成 "a+:1" 纳入变量 "a" 和功能 {x+1}.

这种方法还可以扩展到其他变量。

local_context:([]());
.th.f:{[a;b;v;f] n:?[local_context;();();`$v];
    it:1+til 4;
    while[count it;n:f n;it:1_it];
    n};

q).th.f[5;100;"a";{x+1}]
9
q).th.f[5;100;"b";{x+1}]
104
q).th.f[10;100;"a";{x+1}]
14
q).th.f[10;100;"b";{x+2}]
108

但如果你退一步,一定会有更好的方法来解决你的问题。


0
投票

你可以使用join来构建字符串,并将字符串应用到你的参数上,而不是将你的参数放在一个字符串中作为一个字符来处理。因此,我们可以不使用

func:{[a] value "a+1"}

你可以做。

func:{[a] value string[a],"+1"}

0
投票

所以你必须保留代码中的 "a+:1 "部分,或者这是你的解决方案?如果可以更改,但必须是一个字符串,我会选择。

f:{[a;strFunc]
    itrs:5;
    while[itrs;
        a:value strFunc,string a;
        itrs-:1];
    a};
f[5;"1+"] /Returns 10
© www.soinside.com 2019 - 2024. All rights reserved.