在J中将字符串评估为动词

Con*_*ien 7 string eval function j

TL; DR

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

   eval '+ @ >: @ %'
+@>:@%
   eval '+'
+
Run Code Online (Sandbox Code Playgroud)

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


作为一个有趣的小实验,我想"嘿,也许我可以制作动词,将一串动词转化为一系列动词!" 我知道我可以使用;:"word-ify"将字符串转换为J-verbs,如下所示:

   ]str =: '+ >: %'
+ >: %
   ;: str
????????
?+?>:?%?
????????
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.现在,我只是'@'通过使用,.("ravel items")来主动"加入"它们:

   '@' ,.~ > ;: str
+ @
>:@
% @
Run Code Online (Sandbox Code Playgroud)

展平这个产量:

+ @>:@% @
Run Code Online (Sandbox Code Playgroud)

最后,@}:收益率砍掉尾随+ @>:@%,这是我想要的更丑陋的版本+ @ >: @ %.

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

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

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

]verb =: , }: , '@' ,.~ > ;: str
+ @>:@% 
   'ret =: ' , verb
ret =: + @>:@% 
   ". 'ret =: ' , verb
   ret
+@>:@%
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Dan*_*Oak 5

Evoke gerund(`:)就是你想要的.有关示例,请参阅此简短文档.在你的情况下:

   str=: '+ @ >: @ %'
   (;: str) `:6
+@>:@%
Run Code Online (Sandbox Code Playgroud)

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

另外

   str =: '+ >: %'
   g =: verb def (str,' y')
   g 5
1.2
Run Code Online (Sandbox Code Playgroud)

您也可以尝试monad或者dyad如果您愿意,例如

    2 (dyad def 'x * + % y') 5
0.4
Run Code Online (Sandbox Code Playgroud)

或者制作火车,str用括号括起来:

   2 (dyad def 'x (* + %) y') 5
10.4
Run Code Online (Sandbox Code Playgroud)