Вышел clojure-1.7.0-alpha5

Зарелизился Clojure 1.7.0-alpha5.

Попробовать можно:
- скачав jar
- через Leiningen: [org.clojure/clojure "1.7.0-alpha5"]

Несколько нововведений в alpha5:

Все остальных изменения помечены в общем списке ниже как (alpha5).

Изменения с 1.6.0

Новое и улучшенное

Трансдьюсеры

Трансдьюсеры - это новый способ отделить логику алгоритмических преобразований от их применения в конкретном случае, это функции, которые изменяют поведение функций, основанных на reduce, чтобы составить общий план по применению всех трансформаций разом.

Подробнее можно почитать тут: http://clojure.org/transducers

Множество существующих функций над коллекциями теперь могут принимать другой набор агрументов (на один меньше чем ранее). Такой набор будет возвращать трансдьюсер, который оборачивает логику преобразования, но независим от ленивой обработки коллекции. Эти функции включают в себя:

Также добавлены новый функции-трансдьюсеры:

А “completing” функция может использовать для маркирования конечной трансформации.

Следующие функции могут использоваться для применения трансдьюсеров разными способами:

Также сделано несколько внутренних изменений для поддержки трансдьюсеров:

А также несколько других исправлений во время разработки этой функциональности:

Создание keyword и symbol

В ответ на CLJ-1439 были сделаны следующие изменения:

Предупреждение о “упакованной” математике

Одной из причин снижения скорости на арифметических операциях было оперирование “упакованными” значениями.
Чтобы сделать обнаружение такого рода проблем проще, введен параметр *unchecked-math*, который будучи равен :warn-on-boxed,
сгенерирует предупреждение об этом.

Например:

user> (defn plus-2 [x] (+ x 2))  ;; нет предупреждения об "упаковке"
#'user/plus-2
user> (set! *unchecked-math* :warn-on-boxed)
true
user> (defn plus-2 [x] (+ x 2)) ;; включаем предупреждение
Boxed math warning, NO_SOURCE_PATH:10:18 - call: public static java.lang.Number
clojure.lang.Numbers.unchecked_add(java.lang.Object,long).
#'user/plus-2
user> (defn plus-2 [^long x] (+ x 2)) ;; используйте подсказку для избежания "упаковки"
#'user/plus-2

update - как update-in для первого уровня

update - новая функция для update-in поведения над ключами верхнего уровня:

(update m k f args...)

Например:

user> (update {:a 1} :a inc)
{:a 2}
user> (update {:a 1} :a + 2)
{:a 3}
user> (update {} :a identity)  ;; отсутствующий ключ будет иметь значение nil
{:a nil}

См. CLJ-1251

Улучшения

Сообщения об ошибках

Документация

Производительность

Другие улучшения

Фиксы