2016-05-12 19 views
7

TL; DR

Data una stringa contenente un verbo (valido), come faccio a ottenere quel verbo senza commettere a tutte le variabili? Ad esempio, supponiamo che eval sia quella funzione; dovrebbe funzionare in questo modo:valutare una stringa come un verbo in J

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

Ho solo bisogno di essere in grado di eseguire i verbi e restituirli, ma sarebbe bello avere un codice arbitrario essere eval'd. (Io non so "., BTW.)


Come un piccolo esperimento divertente, ho pensato "ehi, forse posso fare un verbo che trasformerà una serie di verbi in un treno di verbi!" So che posso usare ;: per "parola-Ify" la stringa in J-verbi, in questo modo:

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

Fin qui, tutto bene. Ora, ho appena ti primatively "join" loro con '@' utilizzando ,. ("articoli Ravel"):

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

Flattening questa rendimenti:

+ @>:@% @ 

E, infine, tagliando fuori la finale @ con }: produce + @>:@%, una versione più brutta di quello che voglio, + @ >: @ %.

Ora, questo è tutto a posto, eccetto per una cosa: è una stringa. Quasi lì! Ma non del tutto. Ho pensato a me stesso, "Oh! ". sarebbe perfetto per questo, è fondamentalmente eval." Per il mio sgomento, la documentazione leggere in tal modo (emph mio):

".y esegue la sentenza y. Se l'esecuzione risulta in un nome, il risultato di ".y è quel nome; se il risultato dell'esecuzione è un verbo, avverbio o congiunzione o se non vi è alcun risultato di esecuzione, il risultato di ".y è un vettore vuoto.

Beh, maledizione. Quello non funzionerà. Posso certamente incidere insieme definendo un verbo dal all'interno della stringa:

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

e questo è cosa buona e giusta, ma piuttosto goffo, soprattutto per J. Il colpo può essere ammorbidito un po 'con questo is verbo:

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

Ma funziona solo se si è disposti a commettere la funzione su una variabile.

Quindi, la mia domanda è la seguente: come convertire una stringa generica contenente un verbo in un verbo utilizzabile?

risposta

5

Evoke gerund (`:) è ciò che desideri. Si prega di fare riferimento a this short documentation per buoni esempi.E nel tuo caso:

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

Si consiglia di rivedere Tie (`) per capire questo. ;: restituisce gerundi nel nostro caso (rappresentazioni atomiche) e m `: 6 converte il gerundio m in un treno di verbi.

alternativa

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

si può anche provare monad o dyad se lo si desidera, ad esempio,

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

o per fare un treno, avvolgere str tra parentesi:

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