Оценить строку как глагол в J

TL;DR

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

   eval '+ @ >: @ %'
+@>:@%
   eval '+'
+

Мне нужно только, чтобы он мог выполнять глаголы и возвращать их, но было бы здорово, чтобы произвольный код был eval'd. (Я знаю о ". Кстати.)


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

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

Все идет нормально. Теперь я просто присоединюсь к ним '@' используя ,. ("Равельские товары"):

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

Сглаживание это дает:

+ @>:@% @

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

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

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

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

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

И это все хорошо, но довольно неуклюже, особенно для J. Удар может быть немного смягчен с этим is глагол:

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

Но работает, только если вы хотите передать функцию в переменную.

Итак, мой вопрос стоит: как мне преобразовать общую строку, содержащую глагол, в годный к употреблению глагол?

1 ответ

Решение

Вызвала герунд (`:) это то, что вы хотите. Пожалуйста, обратитесь к этой короткой документации для хороших примеров. И в вашем случае:

   str=: '+ @ >: @ %'
   (;: str) `:6
+@>:@%

Вы можете рассмотреть 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
Другие вопросы по тегам