This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-12-20
Channels
- # admin-announcements (1)
- # bangalore-clj (4)
- # beginners (176)
- # boot (38)
- # cider (9)
- # clara (1)
- # clojars (9)
- # clojure (290)
- # clojure-belgium (25)
- # clojure-berlin (2)
- # clojure-dusseldorf (10)
- # clojure-italy (1)
- # clojure-russia (141)
- # clojure-sg (1)
- # clojure-spec (40)
- # clojure-uk (38)
- # clojurebridge (19)
- # clojurescript (148)
- # code-reviews (37)
- # community-development (7)
- # cursive (27)
- # datomic (71)
- # editors-rus (3)
- # events (1)
- # heroku (1)
- # hoplon (16)
- # jobs (5)
- # lambdaisland (3)
- # lein-figwheel (211)
- # luminus (3)
- # off-topic (52)
- # om (18)
- # onyx (49)
- # overtone (3)
- # pedestal (48)
- # protorepl (7)
- # rdf (2)
- # re-frame (61)
- # reagent (3)
- # timbre (2)
- # untangled (69)
@nicola Мне кажется будет хорошей идеей тебе подглядывать в чат YT-live если там будут появляться вопросы - и озвучивать раз в 10-15 мин
Запости в канале спеке, но спрошу еще заодно тут. У меня есть
(s/def ::user #{"user1" "user2"})
(s/def ::pwd #{"pwd1" "pwd2"})
(s/def ::acc (s/keys :req [::user ::pwd]))
Хочется генератор который бы возвращал {::user “user1” ::pwd “pwd1”}
т.е. валидную пару. Дефолтный генератор вернет просто рандомный юзер и парольможет есть возможность как из связать?
ага, рандом как и должно быть
>(gen/sample (s/gen ::acc) 3)
(#:zerol.model-test{:user "user2", :pwd "pwd2"}
#:zerol.model-test{:user "user1", :pwd "pwd1"}
#:zerol.model-test{:user "user1", :pwd "pwd2”})
первые 2 норм, третий для меня не валиден
ну можно то можно, но это не так легко сделать - у меня индексов то нету. Т.е. если я сделаю кастомный генератор для ::acc и скажу дай мне юзера то найти соответсвующий пароль я легко не смогу, т.е. маппинга нету
а ок, сам ответил себе - если маппинга нету то ничего не поможет и надо его сделать, ок спасиб 🙂
ага, так и делаю в итоге
начал спекать свое приложение - крутая штука спека блин. Я и раньше property based testing любил и юзал иногда, но со спекой это просто супер
(def credentials {"user1" "pwd1" "user2" "pwd2"})
(s/def ::credentials (-> credentials seq set))
(s/def ::user (-> credentials keys set)})
(s/def ::pwd (-> credentials vals set)})
но тут динамичность появляется, если креденшелы из базы, так что хз как оно будет на деле
а кто нибудь emacs на маке юзает? @artemyarulin ? какие биндинги юзаете, мож ergoemacs? не меняли ли C на Cmd?
ага я на маке, да хз - все стандартное, обычный стоковый емакс
че даже C-n C-p стандартные?)
ээ, а чо в них плохого?:)
ну и точнее чо есть лучше? ну окромя вим-мода ессно
ну и ниче хорошего)) ну я вот думаю ErgoEmacs, но хотел сначала узнать есть ли положительный опыт у кого)
@ponimas а Super?
@ponimas погоди, а RET тогда у тебя на чем? 🙂
я вот думаю что caps с шифтом наверно не оч
или ты шифт вообще не юзаешь?
а, все, сорян, я че то шифтом херню гоню)
наверно так же и сделаю, спасиб)
что за карабинер?
загуглил, вроде пишут уже работает)
ну и на https://pqrs.org/osx/karabiner/ большое красное поле по центру
@savelichalex Я менял на маке Caps Lock -> Control, больше ничего для мака не менял, только выключил несколько биндингов Cmd+<буква>.
Когда я пользовался линуксом, то у меня было чёткое разделение: Super для оконного менеджера, Ctrl/Alt - для приложений, а теперь всё как-то слилось. Cmd для всего.
Если уметь мозг переключать между контекстами "в емаксе" и "вне емакса", то да. Но у меня мозг слишком тупой для этого.
А как сделать хром как в емаксе? Ctrl-{bpnf} он понимает, но C-x C-f уже как-то нет.
Господа, а вот как бы сделать идиоматично следующую штуку: есть у меня поток событий двух видов: {заголовок_уровень: N}
и "контент"
. Это такое распластанное представление дерева (разобранный markdown). Хочется из него собрать обратно дерево. Дубовое решение - держать стек заголовков, и контент с того момента, когда пришёл последний и когда приходит новый - дампать новый узел с контентом и чистить стэк. Но это как-то императивненько.
Мм, первым делом надо прилепить контент к предыдущему заголовку. Значит задача упрощается до потока событий вида {заголовок_уровень: N}
.
@misha Почему? Можно считать, что не стрим, а коллекция. Т.е. никто с другой стороны не сидит и не пишет markdown быстрее, чем я его процессю :) Это конечный документ.
test.check
рулит. Сделал для прилепления контента к заголовку трансдюсер с состоянием, написал пропертю, запустил тест.чек, нашёл, где налажал. Если бы не написал пропертю - никогда бы не нашёл.
@dottedmag через схему или просто либу заюзал?
@artemyarulin В этот раз просто либу. Я же сделал просто трансдюсер, какой к нему спек?
хм, давно не трогал трансдюсеры. Там разве какие есть проблемы покрыть спекой?
это функция да, все равно ж есть логика, какие данные могет, какие нет, 3 разных arity
Как покрыть спекой такой инвариант? "На выходе будут элементы в том же порядке, что и на входе, но при этом разбитые на подпоследовательности во всех точках, где данная функция выдаёт на элементе истинное значение"
(s/def ::x any?)
@malch Ну вот @artemyarulin пытается это на спек натянуть.
Я не хочу проверять свойство на одном вызове функции, это глупо. Я хочу прогнать весь массив через (transduce)
и проверять результаты.
А писать спеку на левую функцию, которая вызовет transduce
на моём sut/split-by
бессмысленно.
Можно сделать arity sut/split-by
, которая будет принимать коллекцию (как map
может вернуть трансдюсер, а может и ножичком по горлу и применить коллекцию к функции) и её потестить.
Не то, чтобы сложно - наоборот, проще, потому что инварианты проще. Но эти инварианты ничего толком не говорят о том, что функция делает.
а подскажите заодно как мапу с одним ключом задестрактить проще всего, сейчас делаю
(let [[k v] (first {:a :b})]
[k v])
короче ничо нету?
неа, я название ключа не знаю
*значение
ну вот выбрал так в моем дслчике что у меня вектор и внутри кейворды означают одно, а если мапа из одного ключа это другое типа (model ::user ::pwd ::email {:req ::req})
нужно просто 2 сущности разных, кейворды и символы обычно берут (как в оме например), но меня бесит все эти ‘ (sym), поэтому героически буду решать проблемы которые себе сделал 🙂
а по спеке еще
(s/def :io.http/method #{"GET" "POST" "HEAD" "OPTIONS"})
(s/def :io.http/headers map?)
(s/def :io.http/url string?)
а как мне указать валиданые хеадеры для :io.http/headers? Их может 20 штук разных какое мое приложение посылает. Делать 20 s/def это перебор, можно как-нить попроще?А у меня библиотека, которая возвращает эвенты именно в виде мапы с одним ключом, хаха.
отвечаю сам себе (s/def :io.http.headers (s/map-of #{:k1 :k2 :k3} string?)
M-x el-get-install cider
, M-x cider-jack-in
. Всё вроде бы работает, но REPL не появляется.
В Wiki CIDER написано Never-the-less, installing from MELPA is the recommended way of obtaining CIDER, as the master branch is normally quite stable and "stable" (tagged) builds are released somewhat infrequently.
@artemyarulin тебе k, v или оба из {k v}?
может и удобнее, пока оставлю так - работает уже и ок
случайно кста нашел ifn?
, мож кто тоже не знал
>(fn? +)
true
> (fn? {})
false
> (ifn? +)
true
> (ifn? {})
true