May 06, 2011 18:09
Одна из самых изящных конструкций в языке J, на мой взгляд, это форк. Работает он так. Пусть x и z -- монадные глаголы (в J функции называются глаголами, которые могут быть монадными, то есть от одного аргумента, и диадными -- от двух), а y -- диадный глагол. Тогда форк (x y z) вычисляется как:
(x y z) a = (x a) y (z a)
Такая конструкция позволяет сэкономить много ненужных повторов и промежуточных переменных. Классический пример -- вычисление среднего:
(+/ % #) 1 2 3 4
2.5
Здесь три глагола: +/ -- складывает элементы вектора (строго говоря, это глагол '+' и наречие '/' -- "вставка"), % -- деление, и # -- число элементов.
Просто и понятно.
Другая похожая конструкция -- hook или "крючок" -- менее наглядна. Она раскрывается как:
(x y) a = a x y a
Например, вычислим нормированный вектор, используя те же самые глаголы:
(% +/) 1 2 3 4 5
0.0666667 0.133333 0.2 0.266667 0.333333
j,
программирование