Size: a a a

Clojure — русскоговорящее сообщество

2021 April 05

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Lämppi Lütti
Спекулятивные, вот вопрос: есть условный рпц-запрос с полями method, data, по хорошему для него надо написать супер-спеку:
(s/def ::request (s/or ::add ::delete))
или сделать обычный or:
(or (s/valid? ::add req) (s/valid? ::delete req)) (красиво всё это обмакросить)?
Проблема в общем как проще доставать данные из (s/explain-data), за одно узнать как спеку правильнее написать
S/or, но учесть, что confirm добавит ключ метки
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
И после confirm поправить структуру
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Vadim
Как вы думаете? Почему несмотря на долгую историю clojure, бизнес не замечает ее преимуществ? И вакансий по ней по прежнему практически нет. При этом многие новые технологии (например react) обретают широкую популярность мгновенно.
Честно говоря, если вот хорошенько подумать, я и не могу сказать, чем кложа сильно лучше, чем альтернативы. Мне профит видится в том, насколько сам язык хорош, насколько у него хорошая экосистема, интероп с основными платформами и высокое качество коммьюнити. Как язык кложа мне кажется просто одна из лучших инкарнаций динамических языков. Казалось бы, макросы это отличительная киллер фича, но все понимают, что надо их пореже использовать и в целом они редко используются.
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Так как язык и многие инструменты для него хороши и удобны, но язык все же немейнстримный, то привлекает к себе в основном энтузиастов, которые ищут the better way
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Думаю, что все прибавки продуктивности засчет 1) хороших либ и абстракций 2) интерактивная разработка 3) кодит энтузиаст, а не выпускник курсов по js на зарплате
источник

LL

Lämppi Lütti in Clojure — русскоговорящее сообщество
Ivan Grishaev
И после confirm поправить структуру
Не понял
источник

LL

Lämppi Lütti in Clojure — русскоговорящее сообщество
Если это про то что я не правильно написал s/or то это да
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Завтра подробно отпишу
источник

LL

Lämppi Lütti in Clojure — русскоговорящее сообщество
А вот как с s/or потом искать в чём ошибка, ведь оно все саб-спеки выводит в s/explain-data
Типо вот три проблемы, две из которых с delete
{:problems
 ({:path [:add :data],
   :pred clojure.core/map?,
   :val 1,
   :via
   [:server.spec/req
   :server.spec/add
   :server.spec/data],
   :in [:data]}
  {:path [:delete :method],
   :pred #{"delete"},
   :val "add",
   :via
   [:server.spec/req
    :server.spec/delete
    :delete/method],
    :in [:method]}
  {:path [:delete :data],
   :pred clojure.core/map?,
   :val 1,
   :via
   [:server.spec/req
    :server.spec/delete
    :server.spec/data],
    :in [:data]}),
:spec :server.spec/req,
:value {:method "add", :data 1}}
источник

LL

Lämppi Lütti in Clojure — русскоговорящее сообщество
Вот спека
(s/def ::data map?)
(s/def :add/method #{"add"})
(s/def ::add (s/keys :req-un [:add/method ::data]))
(s/def :delete/method #{"delete"})
(s/def ::delete (s/keys :req-un [:delete/method ::data]))
(s/def ::req (s/or :add ::add :delete ::delete))

(s/explain-data ::req {:method "add" :data 1})
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Anton Chikin
Единственное что хоть как-то рядом лежит - это Real World App у которого в кложа имплементации в 4 раза меньше строк чем в эльме
Где-то я читал про то, что единственная более-менее доказанная корреляция в программировании — это увеличение числа багов с ростом числа строк.
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Vadim
Php вроде очень быстро обрёл популярность.
Выбор в тот момент был не слишком большой. Были варианты, но популярных было очень мало.
источник

AC

Anton Chikin in Clojure — русскоговорящее сообщество
Mikhail Borisov
Честно говоря, если вот хорошенько подумать, я и не могу сказать, чем кложа сильно лучше, чем альтернативы. Мне профит видится в том, насколько сам язык хорош, насколько у него хорошая экосистема, интероп с основными платформами и высокое качество коммьюнити. Как язык кложа мне кажется просто одна из лучших инкарнаций динамических языков. Казалось бы, макросы это отличительная киллер фича, но все понимают, что надо их пореже использовать и в целом они редко используются.
иммутабельные структуры данных, язык и его стандартная библиотека хорошо заточены для работы с данными.
источник

MB

Mikhail Borisov in Clojure — русскоговорящее сообщество
Anton Chikin
иммутабельные структуры данных, язык и его стандартная библиотека хорошо заточены для работы с данными.
Да, я это общими словами и описал, можно вдаваться в детали)
источник

V

Vadim in Clojure — русскоговорящее сообщество
Anton Chikin
иммутабельные структуры данных, язык и его стандартная библиотека хорошо заточены для работы с данными.
Примерно такие же доводы и у сторонников reasonml ) у них только нет такого репла. Но они на эту чашу весов кладут развитую типизацию )
источник
2021 April 06

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Lämppi Lütti
Вот спека
(s/def ::data map?)
(s/def :add/method #{"add"})
(s/def ::add (s/keys :req-un [:add/method ::data]))
(s/def :delete/method #{"delete"})
(s/def ::delete (s/keys :req-un [:delete/method ::data]))
(s/def ::req (s/or :add ::add :delete ::delete))

(s/explain-data ::req {:method "add" :data 1})
мне кажется, спека усложнена. Отличается же только метод? Может, вот так?

(s/def ::method #{"add" "delete"})
(s/def ::data map?)
(s/def ::req (s/keys :req [::method ::data]))
источник

LL

Lämppi Lütti in Clojure — русскоговорящее сообщество
На самом деле я сделал это чтобы не писать много кода в чате. В большой спеке не для примера data тоже отличается. Мне интересно есть ли какие-то удобные способы определения ошибки потому что при например (s/explain-data ::req {:a 1})
Вывод:
{:problems
({:path [:add],
  :pred
  (clojure.core/fn
    [%]
    (clojure.core/contains? % :method)),
  :val {:a 1},
  :via [:server.spec/req :server.spec/add],
  :in []}
 {:path [:add],
  :pred
  (clojure.core/fn
    [%]
    (clojure.core/contains? % :data)),
  :val {:a 1},
  :via [:server.spec/req :server.spec/add],
  :in []}
 {:path [:delete],
  :pred
  (clojure.core/fn
    [%]
    (clojure.core/contains? % :method)),
  :val {:a 1},
  :via [:server.spec/req :server.spec/delete],
  :in []}
 {:path [:delete],
  :pred
  (clojure.core/fn
    [%]
    (clojure.core/contains? % :data)),
  :val {:a 1},
  :via [:server.spec/req :server.spec/delete],
  :in []}),
:spec :server.spec/req,
:value {:a 1}}
Меня смущает что здесь в списке :path повторяется по нескольку раз
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
да, вывод получается шумный. Как вариант -- посмотреть мульти-спеку. Она работает как мультиметод, в твоем случае диспатч будет по методу.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
ну или в коде сделать case -- если метод add, то взять такую спеку, если delete -- то другую. И отдельным шагом проверить данные
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
что по сути мультиспека и делает
источник