给定一个包含(有效)动词的字符串,如何获取该动词而不将其提交给任何变量?例如,假设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
但只有在你愿意将函数提交给变量时才有效。
所以,我的问题是:如何将持有动词的通用字符串转换为可用的动词?
答案 0 :(得分:5)
唤醒动名词(`:
)就是您想要的。有关好的示例,请参阅this short documentation。在你的情况下:
str=: '+ @ >: @ %'
(;: str) `:6
+@>:@%
您可能需要查看Tie(`
)以了解这一点。 ;:
在我们的案例中返回动名词(原子表示),m `: 6
将动名词m
转换为动词列车。
可选地
str =: '+ >: %'
g =: verb def (str,' y')
g 5
1.2
如果您愿意,也可以尝试monad
或dyad
,例如
2 (dyad def 'x * + % y') 5
0.4
或者制作火车,在括号中包裹str
:
2 (dyad def 'x (* + %) y') 5
10.4