| Lazy Cjow Rhrr ( @ 2005-12-20 08:50:00 |
| Current mood: |
Новые, неизведанные глубины в 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 конечно хорошо, но мало.