Lazy Cjow Rhrr ([info]_lcr_) wrote,
@ 2005-12-20 08:50:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Current mood: creative

Новые, неизведанные глубины в J
Читал вот статью "Functional programming and the J programming language". Какую однака штуку я обнаружил:

   pprod =: +/ /. @ (*/)
   1 2 pprod 1 3 1
1 5 7 2


Да. Всего-навсего. Это перемножение полиномов, заданных вектором коэффициентов. И что? Дальше интереснее. fndisplay выдаёт очевидно
   x (P Q@R) y
+-------------+
|x _P_ Q_ R_ y|
+-------------+
   NB. в данном случае (+/ это P, /. это Q, */ это R

Если мы это дело перепишем в виде (по-честному, со скобочками), получим линейкой по рукам:
   1 2 +/ (/. (*/) 1 3 1)
|syntax error
|   1 2+/(    /.(*/)1 3 1)


Коробочный вариант однако немного проясняет ситуацию:
   pprod
+----------+-+-----+
|+-----+--+|@|+-+-+|
||+-+-+|/.|| ||*|/||
|||+|/||  || |+-+-+|
||+-+-+|  || |     |
|+-----+--+| |     |
+----------+-+-----+

Из этой картинки следует, что у нас вилка, согласно определению вилки
   x (P Q R) y
(x _P_ y) _Q_ (x _R_ y)


x */ y даёт табличку, затем применяется (+/ /.) к этой табличке, а не к исходным аргументам (почему? возможно из-за @). Ну и полученный вектор выводится на экран.

Короче, парсинг строк с причастиями - это какой-то магический кристалл. Неужели предсказать поведение луча света в нём могут только маги? Где тот тайный манускрипт, который бы подробно и обстоятельно раскрыл механизм парсинга выражения J?

fndisplay конечно хорошо, но мало.



(Post a new comment)


[info]kmmbvnr
2005-12-20 08:43 am UTC (link)
Эмм.. сразу предупреждаю, нижеследующие строчки это мое личное мнение - могу ошибаться.

Фенечка в том что f@g - это не просто комбнация двух глаголов, которую можно съэмулировать скобочками - это полноценный неразрывный новый глагол. Причем в качестве f, как следует из твоего примера, может использоваться и причастие.

Смотрим сюда: pprod =: +/ /. @ (*/)

@ - связывает намертво правую и левую часть. /. причатстие связывающее +/, и то что справа. Т.е. никакой вилки и даже хука тут нет, это один неразрывный диадный глагол. Работает он как ты и описал - сначала срабатывает */, а потом поверх(atop) результата причастие /. подставляет +/

Интересно, а что будет если попытаться сязкой @ объединить два причастия ?)

(Reply to this)(Thread)

В догонку
[info]kmmbvnr
2005-12-20 08:45 am UTC (link)
fndisplay - не может эмулировать работу причастий. Так, что заменять /. на Q - не есмь правильно.

(Reply to this)(Parent)(Thread)

Да, дело в причастиях
[info]_lcr_
2005-12-20 09:30 am UTC (link)
действительно, эта конструкция есть (глагол причастие @ глагол), "глагол причастие" - это новый глагол, и тогда получается наконец

глагол @ глагол


Этот глагол можно представить в виде композиции f(g(??)), но только в простых случаях. Разные штуки типа появления нулей вносят своё импоссибле.

(Reply to this)(Parent)


Create an Account
Forgot your login?
Login w/ OpenID
English • Español • Deutsch • Русский…