Clojure является частью семейства языков LISP (обработка списков) и, по-видимому, является модным языком программирования наряду с Elixir, поскольку у него пока мало последователей. Это определенно похоже на то, что когда я столкнулся с некоторыми проблемами 4Clojure и зарегистрировался на сайте, я смог получить имя пользователя… priya! Никаких цифр после него, просто прия! Такого никогда не бывает. Несмотря на то, что LISP был изобретен в 1958 году Ричардом Хинкли, Clojure появился только в 2007 году, что является младенцем с точки зрения языка программирования.

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

(defn say-hello [name]
 (println (str "Hello, " name)))

В Clojure много скобок, но что действительно отличается, так это порядок выполнения функций. Они выполняются справа налево или наизнанку, что противоположно тому, к чему я привык в Java.

Анонимные функции можно записать несколькими способами:

1. ((fn add-two [x] (+ x 2)) 2))
2. ((fn [x] (+ x 2)) 2))
3. (#(+ % 2) 2))
4. ((partial + 2) 2))

Все это приводит к 4 и представляет собой разные способы написания анонимной функции.

Третий мне показался самым запутанным. # — это сокращение для функции, % — это сокращение для аргумента (выше 2), который передается функции. Остальная часть кода похожа на другие, где сначала задается операция, за которой следуют два аргумента.

Списки очень важны и в Clojure. Несмотря на то, что существует множество вариантов коллекций, тот факт, что вы всегда получаете новые данные для выполнения операций, отличается от объектно-ориентированного программирования.

Некоторое время состояние не сохраняется, просто на случай, если оно понадобится вам позже. Он тебе либо нужен, либо нет. Есть много схожих концепций, которые он разделяет с Elixir, что имеет смысл, поскольку они оба функциональны. Во-первых, вы всегда смотрите на начало коллекции, а затем имеете доступ к остальной части коллекции, что полезно для рекурсии. Это ближе к тому, как компьютер оценивает выражение. Одним из преимуществ этого является то, что это, вероятно, ограничивает количество способов, которыми вы можете что-то делать, поэтому, как только вы хорошо их поймете, у вас будет шаблон для поиска решения проблемы.

(head [3 4 5])            
;;=> (3)
(rest [3 4 5])            
;;=> (4 5)

Также можно отфильтровать элемент и использовать предикат, чтобы увидеть, хотите ли вы сохранить его или игнорировать, и вернуть список элементов, которые вы хотите сохранить.

(filter even? (3 4 5 6))
;;=> (4 6)

В Clojure немного синтаксиса, но есть много полезных типов, у которых есть методы, с которыми я все еще знакомлюсь. Коаны полезны для этого, но я думаю, что будет сложнее думать о том, как эффективно рекурсировать, чтобы получить нужные мне данные из функции. Надеюсь, в этом поможет решение дополнительных проблем 4Clojure.