Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
(use 'clojure.java.io)
(with-open [rdr (reader "/tmp/test.txt")]
(let [lines (line-seq rdr)]
(println "Строк" (count lines))
(println "Символов" (reduce + (map count lines)))
(println "Слов" (count (mapcat #(re-seq #"\w+" %) lines)))))
(defn- make-fib
([] (concat [0 1] (make-fib 0M 1M)))
([a b] (lazy-seq (cons (+ a b) (make-fib b (+ a b))))))
(def fibs (make-fib))
; считаем 500е число
(time (println (nth 500) fibs))
; числа уже просчитаны, и хранятся в виде односвязного списка
(time (println (nth 500) fibs))
map принимает список. Но для Haskell это совершенно не проблема ввиду тотальной ленивости. А вот, скажем, для других Lisp-ов уже вызывает некоторые неудобства. Там cons-ячейка строго определенная мутабельная структура. Для Clojure это любой объект, который реализует Java-интерфейс с 4 методами.Еще вопрос об interopobillity. Это конечно здорово что язык JVM-ный и что можно использовать многие JVM библиотеки, но согласитесь, лучше всегда иметь idiomatic обертку, а не пулять null-и направо и налево. А поскольку язык, по понятным причинам, не на широкого пользователя, то такие обертки придется писать Вам самому, на каждый чих.
Тут мы явно указали компилятору, что переменная a должна быть динамической, т.е. хранится внутри ThreadLocal. Это увеличивает производительность, поскольку в реальности нам не нужно переопределять большинство ссылок, а ThreadLocal накладывает дополнительные расходы.
^:dynamic для переменной с именем *some-var-name* (т.е. со звездочками), то Clojure печатает в терминал предупреждение.Пока не будет у языка распространения на уровне флэша или 1СУ меня для вас плохие новости. И да, я знаю Clojure там занимает >50 место, просто не забываем про java interop.
Почему стоит изучить Clojure?