clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
achikin 2018-03-11T11:59:01.000063Z

Такая задачка вчера всплыла.

achikin 2018-03-11T11:59:20.000065Z

В case можно передавать листы вот таким образом

achikin 2018-03-11T12:00:38.000029Z

Теперь предположим у нас есть вектор из этих c,d,e. Как пропихнуть этот вектор в case вместо листа?

dottedmag 2018-03-11T12:05:19.000009Z

@achikin The test-constants are not evaluated. They must be compile-time literals, and need not be quoted.

dottedmag 2018-03-11T12:06:02.000080Z

Так что можно сделать макро, которое заменит вектор на список, если сильно хочется.

👍 1
dottedmag 2018-03-11T12:06:23.000028Z

Если значения не константы, то вместо case нужно использовать cond.

👍 1
achikin 2018-03-11T12:13:40.000081Z

@dottedmag спасибо!

y.khmelevskii 2018-03-11T16:30:08.000042Z

приветствую! подскажите как спекой описать атом, который содержит булевый тип?

dottedmag 2018-03-11T16:56:43.000074Z

Спекой атом не описать. Спекой описываются данные, а не места для данных.

y.khmelevskii 2018-03-11T17:35:16.000006Z

@dottedmag у меня в компонент передается реагентовский атом, например open?. Компонент покрыт спекой и валидируеться через instrument. Получается, что я пропсу open? не могу провалидировать?

dottedmag 2018-03-11T17:35:43.000038Z

Атом — нет. Содержимое — да. Но на содержимое тогда нужна отдельная спека.

y.khmelevskii 2018-03-11T17:36:27.000006Z

а можно пример как содержимое атома покрыть?

dottedmag 2018-03-11T17:52:46.000043Z

Если булевый тип, то просто bool? ?

y.khmelevskii 2018-03-11T17:58:40.000059Z

вот так

(s/def ::open? boolean?)
выдает ошибку https://www.dropbox.com/s/4ccir98okcisk3o/Screenshot%202018-03-11%2019.58.17.png?dl=0

misha 2018-03-11T18:03:33.000127Z

ну ты же атом на булин проверяешь :kappa:

y.khmelevskii 2018-03-11T18:04:25.000123Z

да я понимаю, я не понимаю как это переписать. спеку пересмотрел, погугл - не помогло. пришел сюда

misha 2018-03-11T18:07:50.000099Z

#(instance? clojure.lang.IAtom %)

misha 2018-03-11T18:10:13.000088Z

(s/def ::a (s/and 
             #(instance? clojure.lang.IAtom %)
             #(boolean? @%)))

(s/explain ::a (atom true))
Success!

(s/explain ::a true)
val: true fails spec: ::a predicate: (instance? clojure.lang.IAtom %)
=> nil

(s/explain ::a (atom 1))
val: #object[clojure.lang.Atom 0x335eae96 {:status :ready, :val 1}] fails spec: ::a predicate: (boolean? (deref %))
=> nil

igrishaev 2018-03-11T18:11:31.000067Z

Спека — это комбо из предикатов. Поэтому можно проверить, что это атом, и внутри него бул. Технически это возможно, но неверно с точки зрения дизайна.

misha 2018-03-11T18:12:37.000097Z

покрывать реакт компоненты спекой - как-то попахивает

dottedmag 2018-03-11T18:23:42.000018Z

если у компонента есть состояние, то почему бы и нет?

misha 2018-03-11T18:35:03.000106Z

я бы выносил логику, и её и покрывал.

y.khmelevskii 2018-03-11T19:36:59.000004Z

@misha спасибо, это то, что нужно. По поводу попахивания: мне кажется удобно описать пропсы компонента, особенно если у компонента есть пропсы массивы/объекты/перечисляемые типы. Такое себе документирование компонента. И да, это у меня из-за того что я много использовал реактовские PropTypes, и как-то привык.