Fork me on GitHub
#clojure-russia
<
2017-07-17
>
misha04:07:33

(def x [^:test [1 2]])
x
;=> [[1 2]]
(meta x)
;=> nil
(meta (first x))
;=> {:test true}

(def x ^:test [1 2])
x
;=> [1 2]
(meta x)
;=> {:test true}

y.khmelevskii05:07:57

спасибо!

misha06:07:14

метадата для всяких штук, типа "это пришло из базы", "а это пришло из интернета", и что бы руками не выбрасывать такие поля перед сравнением данных.

misha06:07:39

или помечать объекты тем, какие шаги обработки они прошли, опять же, не засоряя сами данные такой инфой

misha06:07:15

(let [x ^{:foo 1} {:a 1}
      y ^{:bar 2} {:a 1}]
  [(= x y)
   x
   y
   (meta x)
   (meta y)])
;=> [true {:a 1} {:a 1} {:foo 1} {:bar 2}]

artemyarulin06:07:35

можно тесты писать прям в метадате, как в питончике:

>(defn example-fn
       {:test #(do
                 (assert (= (example-fn 1) 2))
                 (assert (= (example-fn -1) -2)))}
       [i] i)
> (example-fn 1)
1
> (test #'example-fn)
AssertionError Assert failed: (= (example-fn 1) 2)

y.khmelevskii18:07:41

круто, спасибо!

delaguardo18:07:19

я тут недавно узнал что deftest на самом деле как раз через мета тесты работает https://github.com/clojure/clojure/blob/2e0c0a9a89ede8221504edeb90e8c4ee6cce7e16/src/clj/clojure/test.clj#L621