2016-05-12 4 views
7

TL; DR

Учитывая строку, содержащую (действующий) глагол, как я могу получить, что глагол без его совершения каких-либо переменных? Например, например, eval - это функция; она должна работать так:Оценить строку как глагол в J

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

Я только это нужно, чтобы быть в состоянии выполнить глаголы и вернуть их, но было бы здорово иметь произвольный код будет Эвальд. (Я знаю о "., BTW.)


Как забавный небольшой эксперимент, я подумал: «Эй, может быть, я могу сделать глагол, который преобразует строку глаголов в поезд глаголов!» Я знаю, что я могу использовать ;: чтобы «слово-римент» строку в J-глаголы, например:

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

До сих пор, так хорошо. Теперь, я просто буду primatively "присоединиться к" их с '@' помощи ,. ("Равель пункты"):

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

плющения это дает:

+ @>:@% @ 

И, наконец, отрубив концевую @ с }: дает + @>:@%, уродливую версию того, что я хочу, + @ >: @ %.

Теперь все это хорошо и хорошо, за исключением одного: это строка. Почти готово! Но не совсем. Я подумал про себя: «О! ". был бы идеален для этого, это в основном оценка». К моему ужасу, Документы прочитать таким образом (EMPH мой):

".y выполняет предложение y. Если выполнение приводит к существительному, результатом ".y является это существительное; , если результатом выполнения является глагол, наречие или конъюнкция или если нет результата выполнения, результат ".y - пустой вектор.

Ну, дарнит. Это не сработает. Я, безусловно, может взломать его вместе определяя глагол внутри строки:

]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 (`), чтобы понять это. ;: возвращает gerunds в нашем случае (атомные представления) и m `: 6 преобразует gerund 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 

 Смежные вопросы

  • Нет связанных вопросов^_^