Fork me on GitHub
#clojure-russia
<
2016-06-06
>
mike_ananev08:06:24

Всем привет!

mike_ananev08:06:59

Кто-нибудь может объяснить почему в clojurescript наблюдается вот такое поведение?

mike_ananev08:06:23

(def b (atom {:a 1 😛 2})) (swap! b inc) => "{:a 1, 😛 2}1"

mike_ananev08:06:12

где exception?

savelichalex10:06:12

похоже что твой атом к строке привелся

artemyarulin10:06:41

в кложуре ок ClassCastException clojure.lang.PersistentArrayMap cannot be cast to java.lang.Number clojure.lang.Numbers.inc (Numbers.java:112)

artemyarulin10:06:04

странно ага

niwinz10:06:51

(inc {:a 1})
WARNING: cljs.core/+, all arguments must be numbers, got [cljs.core/IMap number] instead. at line 1 <cljs repl>
"{:a 1}1"

niwinz10:06:16

(core/defmacro ^::ana/numeric +
  ([] 0)
  ([x] x)
  ([x y] (core/list 'js* "(~{} + ~{})" x y))
  ([x y & more] `(+ (+ ~x ~y) ~@more)))

niwinz10:06:53

вот так он имплементиран

niwinz10:06:35

по этому такои behavior

niwinz10:06:28

в ноде:

niwinz10:06:33

> ({"a":1} + 1)
'[object Object]1'

fl00r11:06:24

> @maxp [6:52 PM] > подскажите, уважаемые, правильный красивый спобоб инвертировать мапы я решал через редьюс редьюс, @prepor предложил вариант поэлегантнее (defn iiiii! [m] (into {} (mapcat (fn [[k v]] (map vector v (repeat k))) m)))

maxp11:06:17

ага ничего так

niwinz11:06:10

И почему нет map-invert ?

maxp11:06:02

да и так вроде ничего

maxp11:06:51

кстати, если кого интересует телеграм-бот на кложе, то можете меня спрашивать, там есть разные не сразу понятные моменты.

mike_ananev12:06:37

@artemyarulin: так я и ждал такого же поведения как в clojure. обидно было что у меня демка была и я показывал коллегам как все неплохо с figwheel и defcard. а вот такое поведение clojurescript немного демку омрачило.

artemyarulin12:06:32

@mike1452: ух, несвезло да. Ну что тут скажешь - жс же, там грусть-печаль с этим. Я счас PureScript начал копать, там конечно этого бы не произошло - компилятор бы не дал. Но! Если представить что все будет покрыто clojure.spec - то и эти проблеме уйдут в никуда. У меня (да и у многих как я понимаю) большие надежды на это

mike_ananev12:06:43

жду clojure.spec тоже. особенно юзкейсов

mike_ananev13:06:49

@artemyarulin: кстати, а у тебя уже есть идеи, исходя из текущего гайда по спеке, как это в коде надо представлять? допустим я пишу на реагенте. некий стейт в виде мапы представлен в реагенте как r/atom. и вот кто-то пытается в эту мапу послать (swap! my-state inc). где в этом случае должна быть спека? в виде прослойки между мапой и остальным миром?

artemyarulin13:06:22

@mike1452: Сам жду чтоб кто-нить написал и показал как оно в реальности (у самого времени все нет). Я тут кидал статейку Нолена http://swannodette.github.io/2016/06/03/tools-for-thought и вот еще понравился гист для ом-некста: https://gist.github.com/swannodette/c1444684bc2a8236634e4e110c654fe5

artemyarulin13:06:23

как это запускать все, или как сделать чтоб юзеры моей либы это запускали я вот все еще хз

a.espolov13:06:38

@artemyarulin: отдельно репозитарий со спеками к приложению деплоить на clojars? но это плюс одна зависимость

artemyarulin13:06:32

@a.espolov: Да вот хз я ей богу, там много наверняка нюансов. Я мечтаю чтоб Ричи провел какой воркшоп на тему как/почем/куда, да вот пока не видел полных примеров. Можно поспрашивать в #C1B1BB2Q3 наверно

mike_ananev13:06:16

ага я только что вопрос задал туда

mike_ananev13:06:56

я тоже прочитал гайд, туториалы, заметки в блогах - вроде все в общем понимаю, но блин голова не соображает пока как это притулить.

mike_ananev14:06:11

получил ответ из канала clojure-spec

artemyarulin14:06:13

дак оно в рантайме получается, хм. А перформанс не страдает? Или можно отрубить когда в прод выпускаешь?

dragoncube15:06:14

так весь спек про рантайм

dragoncube15:06:37

это ж не core.typed

artemyarulin15:06:56

дада, просто я думал он как-бэ, эм, сбоку чтоль. А тут вот в этом примере они оборачивают inc, т.е. inc будет работать медленнее жеш.

vadim-tt15:06:16

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

artemyarulin16:06:55

аааа, тогда как надо в либах юзать?

dragoncube16:06:03

ну так это пример

dragoncube16:06:12

оборачивать inc смысла мало

dragoncube16:06:26

видимо только достаточно крупные куски

dragoncube16:06:31

We don’t (and couldn’t) live in a world where we can’t make mistakes. Instead, we periodically check that we haven’t. Amazon doesn’t send you your TV via a UPS<Trucks<Boxes<TV>>>. So occasionally you might get a microwave, but the supply chain isn’t burdened with correctness proof. Instead we check at the edges and run tests.

dragoncube16:06:53

вот это ключевой посыл: Instead we check at the edges and run tests.

artemyarulin16:06:35

хм, ну почему-же нет смысла - я надеялся(=надеюсь) что спека пофиксит другую проблему кложуры заодно: Сообщения об ошибках. Как былоб круто заместо 100 строк что-что-то-не-импелеменит-IFn получить нормальное сообщение что (a b) содержит ошибку ибо тип b не соответсвует нужному.

vadim-tt16:06:13

если хочется ошибок, то тогда можно юзать всякие :pre :post

dragoncube16:06:32

ну ничего не мешает иметь два набора спек

dragoncube16:06:47

обязательный для production кода

dragoncube16:06:10

и тот который только в тестах/во время девелопмента используется

dragoncube16:06:00

прекондишены сложнее включать/отключать

dragoncube16:06:33

вернее они сильнее код “зашумляют"

artemyarulin16:06:32

хотелось бы иметь это в core (интересно почему нету кста)

vadim-tt16:06:19

да, про :pre :post тоже верно)

vadim-tt16:06:30

надо выбирать, заранее бояться instrument-а пожалуй что не стоит, обычно проблемы с performance-ом вылазят в других местах

artemyarulin16:06:07

ну вот о том и говорю - понятно, что ничего не понятно 🙂

mike_ananev16:06:14

@artemyarulin: ничего что медленее будет работать. пользователи подождут. а будут сопротивляться отключим газ

artemyarulin16:06:32

ну мож действительно можно отрубить для прода. Надо зайти в канал спеки и попросить Ричи митап устроить 🙂