Уж не знаю, по какой причине мне вдруг захотелось познакомиться с Clojure. До этого я практически не работал с функциональными языками (несколько маленких программ на Scala не учитываются). Однако рано или поздно приходится переступить через это. Почему я не выбрал Haskell или Erlang? Потому что Clojure крепко дружит с JVM, а это значит, что код на Java доступен в Clojure и наоборот. С другой стороны, почему не Scala? Scala не является абсолютно-функциональным языком, а это значит, что имея в руках функциональный и объектно-ориентированый язык программирования, рано или поздно в силу сложившихся привычек перейдешь на чистое ООП, используя его даже там, где язык предлагает более изящное решение на “функциональщине”.
Hello World
Начну с самого простого и традиционного - “Hello, World!”. Так как Clojure имеет некоторый Lisp-синтаксис, нам придется свыкнуться с мыслью о том, что нас ожидает великое множество скобочек:
|
|
Что это за nil
? Как я понял, листая примеры, это значит, что функция println
ничего не вернула, а ничего - это nil
или null
в Java.
В целом, синтаксис вызова функции такой: (func arg1 arg2 .. argN)
. Так, выше func
это println
, а единственный аргумент представлен в виде строки "Hello, World"
Арифметика
После этого я решил глянуть, как обстоят дела с примитивной арифметикой - сложение, вычитание, деление, умножение. И тут меня ждал сюрприз:
|
|
Как видим, деление вернуло результат в виде рациональной дроби. А что, если попробовать так?
|
|
Если возможно провести целочисленное деление, язык делает это совершенно самостоятельно.
А как получить остаток от деления? В С или Java это %
, но тут это уже не работает. Мысленно перебирая варианты, пробую такие названия функций: mod
rem
. И каково мое удивление, эти оба варианта работают и выполняют одно и то же действие. Сказать, зачем это сделано, я не могу, потому просто будем использовать то, что первое придет в голову:
|
|
Строки
Строки в языке записываются также, как и в большинстве других языков - между двойных кавычек:
|
|
С поиском в строке вышло немного труднее - не имея представления о том, как нужно делать вызов функций из Java, я пытался получить indexOf
из java.lang.String
. Но, полазив по официальному сайту, нашел:
|
|
Другие типы данных
Давайте еще глянем на такие вещи, как списки, множества, вектора и карты:
|
|
Язык предлагает поддержку различных типов этих структур - сортированные, хеш-, неупорядоченные.
Заключение
Для первого достаточно, позже я рассмотрю управляющие операторы, функции, переменные. Конечно, можно писать и писать, однако мне кажется, что уже размер статьи стал несколько большим, потому продолжу знакомство в следующей статье.