在J

时间:2016-05-12 03:08:51

标签: string function eval j

TL; DR

给定一个包含(有效)动词的字符串,如何获取该动词而不将其提交给任何变量?例如,假设eval是该函数;它应该像这样工作:

   eval '+ @ >: @ %'
+@>:@%
   eval '+'
+

我只需要能够执行动词并返回它们,但是任意代码的评估都很酷。 (我确实知道".,BTW。)

作为一个有趣的小实验,我想“嘿,也许我可以制作动词,将一串动词变成一连串的动词!”我知道我可以使用;:将字符串“if-ify”变成J-verbs,如下所示:

   ]str =: '+ >: %'
+ >: %
   ;: str
┌─┬──┬─┐
│+│>:│%│
└─┴──┴─┘

到目前为止,这么好。现在,我只是通过使用'@'(“ravel items”)将,.与他们联系起来:

   '@' ,.~ > ;: str
+ @
>:@
% @

扁平化这会产生:

+ @>:@% @

最后,用@切断尾随的}:会产生+ @>:@%,这是我想要的更加丑陋的版本+ @ >: @ %

现在,这一切都很好,除了一件事:它是一个字符串。差不多了!但并不完全。我心想,“哦!".对于这个来说是完美的,它基本上是eval。”令我沮丧的是,这些文档因此而读(我的):

  

".y执行句子y。如果执行结果是名词,".y的结果就是名词; 如果执行结果是动词,副词或连词,或者如果没有执行结果,则 ".y的结果为空矢量。

好吧,darnit。那不行。我可以通过在字符串中定义一个动词来一起破解它:

]verb =: , }: , '@' ,.~ > ;: str
+ @>:@% 
   'ret =: ' , verb
ret =: + @>:@% 
   ". 'ret =: ' , verb
   ret
+@>:@%

这一切都很好,但相当笨拙,特别是对于J.这个is动词可以稍微软化一下:

   is =: ".@(,&'=:'@,@[,}:@,@('@',.~>@;:)@])
   'G' is '+>:%'
   G
+@>:@%
   G 5
1.2

但只有在你愿意将函数提交给变量时才有效。

所以,我的问题是:如何将持有动词的通用字符串转换为可用的动词?

1 个答案:

答案 0 :(得分:5)

唤醒动名词`:)就是您想要的。有关好的示例,请参阅this short documentation。在你的情况下:

   str=: '+ @ >: @ %'
   (;: str) `:6
+@>:@%

您可能需要查看Tie`)以了解这一点。 ;:在我们的案例中返回动名词(原子表示),m `: 6将动名词m转换为动词列车。

可选地

   str =: '+ >: %'
   g =: verb def (str,' y')
   g 5
1.2

如果您愿意,也可以尝试monaddyad,例如

    2 (dyad def 'x * + % y') 5
0.4

或者制作火车,在括号中包裹str

   2 (dyad def 'x (* + %) y') 5
10.4