Оценить строку как глагол в 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