はJ

2016-05-12 8 views
7

TLでの動詞として文字列を評価し;(有効)動詞を含む文字列を考えるとDR

は、どのように私はすべての変数にそれをコミットすることなく、その動詞を取得していますか?たとえば、evalはその関数です。それは次のように動作するはずです:はJ

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

は、私は動詞を実行し、それらを返すことができるようにする必要がありますが、任意のコードがeval'dする持ってクールになります。 (私はところで、".について知っています。)楽しい小さな実験として


、私は思った「ねえ、多分私は動詞の列に動詞の文字列を変換します動詞を作ることができます!」私はそうのように、J-動詞に文字列を「単語IFY」に;:を使用できることを知っている:

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

これまでのところ、とても良いです。今、私はちょうど,.( "ラヴェル項目")を使用して'@'でそれらを "参加" primativelyます:

この利回りフラット化
'@' ,.~ > ;: str 
+ @ 
>:@ 
% @ 

+ @>:@% @ 

そして最後に、}:と末尾@をオフにチョッピングを私が欲しいものの醜いバージョンである+ @>:@%をもたらす。+ @ >: @ %

ここでは、1つのことを除いて、これはすべてうまくいきます。それは文字列です。ほぼそこに!しかし、それほどではない。私は自分自身に、 "ああ!".がこれには完璧だと思った、それは基本的にevalだと思った。私の狼狽に、ドキュメントが(EMPH鉱山)、読み取ら:

".yは、文yを実行します。実行結果が名詞になる場合、".yの結果はその名詞です。 実行結果が動詞、副詞または結合詞の場合、または実行結果がない場合".yの結果は空のベクトルです。

まあ、darnit。それは動作しません。私は確かに、文字列の中から動詞を定義することによって、それを一緒にハックすることができます

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

そして、これは打撃がこのis動詞で、わずかに軟化させることができる、特にJ.のため、すべてが順調と良いのではなく、不器用です:

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

しかし、変数に関数をコミットする場合にのみ機能します。

私の質問は、動詞を持つ一般的な文字列を使用可能な動詞に変換するにはどうすればいいですか?

答えて

5

エボークジェルンド`:)はあなたが望むものです。良い例はthis short documentationを参照してください。そして、あなたの場合:

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

あなたはこれを理解するために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