2016-05-12 18 views
7

TL; DR

eine Zeichenfolge ein (gültig) Verb enthält, Bedenkt man, wie ich das Verb erhalten, ohne es zu irgendwelchen Variablen zu begehen? Zum Beispiel, sagen wir eval ist diese Funktion; es sollte wie folgt funktionieren:auswerten eine Zeichenfolge als Verb in J

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

Ich brauche es nur in der Lage sein, Verben auszuführen und bringt sie, aber es wäre cool, beliebiger Code hat eval'd werden. (Ich weiß über "., BTW.)


Als lustiges kleines Experiment, dachte ich: „Hey, vielleicht kann ich ein Verb machen, die eine Reihe von Verben in eine Folge von Verben verwandeln!“ Ich weiß, dass ich ;: verwenden kann, um "Wort-ify" die Zeichenfolge in J-Verben, etwa so:

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

So weit, so gut. Nun, ich will nur primatively "join" sie mit '@' von ,. mit ("Ravel Artikel"):

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

Abflachen Dies ergibt:

+ @>:@% @ 

Und schließlich die hintere @ mit }: Abhacken Erträge + @>:@%, eine hässlichere Version von dem, was ich will, + @ >: @ %.

Nun, das ist alles gut und gut, bis auf eine Sache: Es ist eine Zeichenfolge. Fast dort! Aber nicht ganz. Ich dachte mir: "Oh! ". wäre perfekt dafür, es ist im Grunde Eval." Zu meiner Bestürzung, lesen Sie die Dokumentation so (emph von mir):

".y führt den Satz y. Wenn die Ausführung ein Substantiv ergibt, ist das Ergebnis von ".y das Substantiv; Wenn das Ausführungsergebnis ein Verb, ein Adverb oder eine Konjunktion ist, oder wenn es kein Ausführungsergebnis gibt, ist das Ergebnis ".y ein leerer Vektor.

Nun, darnit. Das wird nicht funktionieren. Ich kann es auf jeden Fall hacken zusammen durch ein Verb aus der Zeichenfolge zu definieren:

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

Und das ist alles schön und gut, aber eher unbeholfen, vor allem für J. kann der Schlag leicht mit diesem is Verb weich gemacht werden:

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

Aber funktioniert nur, wenn Sie bereit sind, die Funktion an eine Variable zu übergeben.

Meine Frage lautet also: Wie konvertiere ich eine generische Zeichenfolge, die ein Verb enthält, in ein verwendbares Verb?

Antwort

5

Evoke gerund (`:) ist, was Sie wollen. Bitte beachten Sie this short documentation für gute Beispiele.Und in Ihrem Fall:

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

Sie möchten Tie (`) überprüfen, dies zu verstehen. ;: kehrt Gerundien in unserem Fall (atomare Darstellungen), und m `: 6 konvertiert Gerundium m zu Verb-Zug.

Alternativ

str =: '+ >: %' 
    g =: verb def (str,' y') 
    g 5 
1.2 

Sie auch monad oder dyad versuchen können, wenn Sie es wünschen, zum Beispiel

2 (dyad def 'x * + % y') 5 
0.4 

Oder einen Zug zu machen, wickeln str in Klammern:

2 (dyad def 'x (* + %) y') 5 
10.4