是否可以在函数中传递一个字符串作为命令,而函数能够识别其局部变量?例如,在下面的例子中 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命令是唯一的解决方法。
虽然我很难接受传递这样的字符串是解决这个问题的唯一方法,我也不推荐使用这个解决方案......这样的方法也许能帮到你。
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
但如果你退一步,一定会有更好的方法来解决你的问题。
你可以使用join来构建字符串,并将字符串应用到你的参数上,而不是将你的参数放在一个字符串中作为一个字符来处理。因此,我们可以不使用
func:{[a] value "a+1"}
你可以做。
func:{[a] value string[a],"+1"}
所以你必须保留代码中的 "a+:1 "部分,或者这是你的解决方案?如果可以更改,但必须是一个字符串,我会选择。
f:{[a;strFunc]
itrs:5;
while[itrs;
a:value strFunc,string a;
itrs-:1];
a};
f[5;"1+"] /Returns 10