Con*_*ien 7 string eval function j
给定一个包含(有效)动词的字符串,如何获取该动词而不将其提交给任何变量?例如,说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)
但只有在你愿意将函数提交给变量时才有效.
所以,我的问题是:如何将持有动词的通用字符串转换为可用的动词?
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)