Отличительная черта языка J — это возможность написания итеративных алгоритмов без явного использования циклов и рекурсии. К примеру, сумма всех элементов массива решается так "
Различные обзоры J уже не раз публиковались на Хабре. Например в этой статье и в этой.
J — язык с 30-летней историей и он все еще развивается и совершенствуется. Однако оставалось в J одно «белое пятно» — итеративные алгоритмы с остановкой по условию. Для этого предлагалось использовать конструкцию while. в паре c break. и continue.
Использование while. в J выглядит избыточным и неуклюжим. А, кроме того, серьезно проседает по скорости в сравнении с тацитными формами.
И вот в 9й версии языка добавили новый союз F (названый так по первой букве слова «fold»).
Для сравнения решим задачу с использованием while. и с использованием нового союза
Условие простое: получить из исходного массива новый массив, который содержит удвоенные значения элементов. Длина нового массива задается извне и может быть меньше исходного.
Сначала с использованием while.
А теперь решение с использованием нового союза F. Добавим, что условие выхода из цикла проверяется с помощью глагола Z:
В документации обещают, что F. будет не только удобнее, но и быстрее while. В конце концов, J становится ближе к людям!
P.S. Знающие люди могут заметить, что эта задачка легко решается без использования как цикличных, так и новых конструкций. Достаточно извлечь подмассив нужной длины и потом в тацитной форме его обработать. Однако в реальных задачах часто бывает, что длина подмассива заранее неизвестна и условие останова вычисляется в процессе работы алгоритма.
+/
", а среднее всех элементов массива так "+/%#
". Различные обзоры J уже не раз публиковались на Хабре. Например в этой статье и в этой.
J — язык с 30-летней историей и он все еще развивается и совершенствуется. Однако оставалось в J одно «белое пятно» — итеративные алгоритмы с остановкой по условию. Для этого предлагалось использовать конструкцию while. в паре c break. и continue.
Использование while. в J выглядит избыточным и неуклюжим. А, кроме того, серьезно проседает по скорости в сравнении с тацитными формами.
И вот в 9й версии языка добавили новый союз F (названый так по первой букве слова «fold»).
Для сравнения решим задачу с использованием while. и с использованием нового союза
Условие простое: получить из исходного массива новый массив, который содержит удвоенные значения элементов. Длина нового массива задается извне и может быть меньше исходного.
Сначала с использованием while.
t =: dyad define
c =. 0
i =. i.x
z =. $0
while. -. c = y
do.
z =. z , (+: (c { i))
c =. >: c
end.
z
)
10 t 5
0 2 4 6 8
А теперь решение с использованием нового союза F. Добавим, что условие выхода из цикла проверяется с помощью глагола Z:
COUNT =: 6
v=: dyad define
_2 Z: -.* COUNT =: <: COUNT
x
)
'' +: F:. v (i.10)
0 2 4 6 8
В документации обещают, что F. будет не только удобнее, но и быстрее while. В конце концов, J становится ближе к людям!
P.S. Знающие люди могут заметить, что эта задачка легко решается без использования как цикличных, так и новых конструкций. Достаточно извлечь подмассив нужной длины и потом в тацитной форме его обработать. Однако в реальных задачах часто бывает, что длина подмассива заранее неизвестна и условие останова вычисляется в процессе работы алгоритма.
javax
Ну классно, наконец то появился язык, на котором можно писать понятные итеративные алгоритмы с остановкой по условию.
basp Автор
И при том, заметьте, вместо маргинального while — такой удобный F:.