2016-05-12 76 views
7

TL; DR

給定一個包含(有效)動詞的字符串,如何獲取該謂詞而不將其提交給任何變量?例如,說eval是那個函數;它應該像這樣工作:在J中評估一個字符串作爲動詞

eval '+ @ >: @ %' 
[email protected]>:@% 
    eval '+' 
+ 

我只需要它能夠執行動詞和回報他們,但是這將是很酷的任意代碼eval'd。 (我不知道".,順便說一句。)


作爲一個有趣的小實驗,我想:「嘿,也許我可以做一個動詞,將改變動詞的字符串轉換成動詞的一列火車!」我知道,我可以使用;:爲「字IFY」串入J-動詞,就像這樣:

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

到目前爲止,一切都很好。

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

扁平化這一收益率:

+ @>:@% @ 

最後,用}:斬去後@現在,我只是將primatively與'@'使用,.( 「拉威爾項目」) 「加盟」 他們產量+ @>:@%,我想要的醜陋版本,+ @ >: @ %

現在,這一切都很好,除了一件事:它是一個字符串。差不多了!但不完全。我心想,「噢!".對此很完美,它基本上是eval。」令我沮喪的是,文檔閱讀這樣(EMPH礦):

".y執行判決y。如果執行結果爲名詞,則".y的結果是該名詞; 如果執行結果是動詞,副詞或連詞,或者如果沒有執行結果,".y的結果是一個空向量。

恩,darnit。這是行不通的。我可以從字符串內限定動詞肯定破解它在一起:

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

而這一切都很好,但相當笨拙,尤其是對J.這一擊可以稍微與此is動詞軟化:

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

但只適用於你願意將該功能提交給變量。

所以,我的問題是:我如何將一個持有動詞的通用字符串轉換爲可用動詞?

回答

5

Evoke gerund`:)是你想要的。很好的例子請參考this short documentation。而在你的情況:

str=: '+ @ >: @ %' 
    (;: str) `:6 
[email protected]>:@% 

您可以查看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