вторник, 29 мая 2012 г.

Clojure. Метаданные для значений.

В документациии clojure по работе с метаданными написано, что их можно использовать для коллекций или символов(clojure/metadata). Поэтому если вы заходите добавить метаданные к значению, то получите ошибку:


user=> (def a (with-meta 2 {:a "test metadata"}))
java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IObj
user=>

Однако можно добавлять метаданные к var переменным. Это делается так:


user=> (def #^{:a "metadata"} a 2)
#'user/a
user=> (meta #'a)
{:ns #, :name a, :file "NO_SOURCE_PATH", :line 27, :a "metadata"}
user=> ((meta #'a) :a)
"metadata"
user=>

суббота, 5 мая 2012 г.

Параметры по умолчанию в функциях clojure

Один из вариантов параметров по умолчанию в clojure - это использование отображений(maps) в параметрах функции. Пример:


(defn test-add [a & {:keys [b] :or {b 0}}]
    (+ a b))

Использование:


user=>(test-add 1)
=> 1
user=>(test-add 1 :b 5)
=> 6

Разделитель в выражениях clojure

В clojure можно использовать запятую в качестве разделителя для упращения чтения кода:


(+ 1, 2, 3, 4)
(def a {:test1 5, :test2 6})
(def b [1, 2, 4])
;; эквивалентно
(+ 1 2 3 4)
(def a {:test1 5 :test2 6})
(def b [1 2 3])