Clojure
Диалект языка программирования LispClojure — современный диалект Lisp, созданный Ричардом Хикки в 2007 году. Ориентирован на поддержку функционального и многопоточного программирования.
Как и в других диалектах, синтаксис Clojure основан на S-выражениях, и код рассматривается как данные. Тем не менее, программы на Clojure не совместимы с кодом на других диалектах.
Основная реализация Clojure компилирует исходный код в байткод и запускает его на JVM, что позволяет взаимодействовать с Java. Существуют также версии, компилирующие код Clojure для Microsoft Common Language Runtime и JavaScript.
Особенности:
- реализация многопоточности основана на неизменности значений и изменяемых ссылках на них, которые позволяют управлять параллельным доступом из разных потоков.
- функции являются объектами первого класса.
- поддержка множеств, векторов и словарей как встроенных структур данных.
- ленивая обработка последовательностей.
- акцент делается не на циклы с побочными эффектами, а на рекурсию и функции высшего порядка.
Логотип Clojure
Ссылки:
Примеры:
Hello, World!:
Пример для версий Clojure 1.0.0, Clojure 1.1.0(printf "Hello, World!")
Факториал:
Пример для версий Clojure 1.0.0, Clojure 1.1.0Используется рекурсивное определение факториала. Функция range
с одним аргументом генерирует список чисел от 0 включительно до этого числа исключительно. str
— функция конкатенации строк. Функция dec
эквивалентна (- x 1)
. doseq
— цикл for
в Clojure.
(defn factorial [x]
(if (< x 2)
1
(* x (factorial (dec x)))))
(doseq [i (range 17)]
(println (str (str i "! = ") (factorial i))))
Факториал:
Пример для версий Clojure 1.0.0, Clojure 1.1.0Для вычисления факториала числа создается интервал чисел от 2 до этого числа, и вычисляется произведение этих чисел (функция apply
).
(doseq [i (range 17)]
(println (str (str i "! = ") (apply * (range 2 (inc i))))))
Числа Фибоначчи:
Пример для версий Clojure 1.0.0, Clojure 1.1.0Используется рекурсивное вычисление чисел Фибоначчи.
(defn fibonacci [x]
(if (< x 2)
x
(+ (fibonacci (- x 1)) (fibonacci (- x 2)) )))
(doseq [i (range 1 17)]
(print (str (fibonacci i) ", ")))
(println "...")
Квадратное уравнение:
Пример для версий Clojure 1.0.0, Clojure 1.1.0(defn solve-quadratic [a b c]
(if (= a 0)
"Not a quadratic equation."
(let [D (- (* b b) (* 4 a c))
k1 (- 0 b)
k2 (* 2 a)]
(if (= D 0)
(str "x = " (/ k1 k2))
(if (> D 0)
(let [k3 (Math/sqrt D)]
(str (str "x1 = " (/ (+ k1 k3) k2) (str "\nx2 = " (/ (- k1 k3) k2)))))
(let [k3 (/ (Math/sqrt (- 0 D)) k2)]
(str (str (str (str "x1 = (" (/ k1 k2)) (str ", " k3)) ")\nx2 = (") (str (str (/ k1 k2) ", ") (str (- 0 k3) ")") ))
))))))
(import '(java.util Scanner))
(def scan (Scanner. *in*))
(def a (.nextInt scan))
(def b (.nextInt scan))
(def c (.nextInt scan))
(println (solve-quadratic a b c))
Комментарии
]]>blog comments powered by Disqus
]]>