This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2015-11-12
Channels
- # admin-announcements (3)
- # beginners (13)
- # boot (52)
- # cbus (1)
- # cider (13)
- # cljs-dev (70)
- # cljsjs (16)
- # cljsrn (124)
- # clojure (129)
- # clojure-austin (3)
- # clojure-boston (2)
- # clojure-russia (238)
- # clojure-sg (3)
- # clojurescript (119)
- # cursive (18)
- # datomic (22)
- # editors-rus (2)
- # events (1)
- # hoplon (160)
- # jobs (1)
- # jobs-rus (8)
- # ldnclj (31)
- # ldnproclodo (1)
- # lein-figwheel (4)
- # leiningen (8)
- # off-topic (3)
- # om (335)
- # onyx (29)
- # re-frame (15)
- # reagent (12)
- # robots (1)
- # yada (19)
ну первая мысль ex-with-info и ex-extract-info например, тоже не оч, но хотя бы понятно что оно делает )
Кхм, пацаны, а как канонично хэндлить ошибки?
Ну например в джаве и питоне есть ыксепшоны
@lowl4tency: Так же, как в java
Я вот дергаю апишечку, через https://github.com/owainlewis/twilio а как мне захэндлить если оно пошло не так
оу, пойду ка почитаю, не знал что есть try catch
Можешь еще https://github.com/scgilardi/slingshot добавить
У меня агрессивный путь погружения в кложу.
ещё был какая-то либа для erlang-стайл обработки ошибок, понравилась, но особо нигде не заюзал, ща найду
Есть задача, нет знаний, но уже почти закончил, не понимаю почему на локалхосте работает, а в лямбде не работает
О, либа майкла
Это же крутой чувак из onyx-team
мне кажется причины больше социальные, тупо не хочется тащить в проект то, что у других вызывает необходимость сменить парадигму в голове у себя, так сказать
думаю мне пока хватит обычного try catch
а вообще я хочу обрабатывать ошибки с помощью системы типов) правда наверное тоже будет чужеродно выглядить, но всё же надо попробывать
не знаю каким, много по сторонам смотрел, но ничего более, так сказать, сбалансированого по требования не нашёл
Мне лично хватает https://github.com/Prismatic/schema
Ну и руки не дошли https://github.com/clojure/core.typed попробовать
Есть еще https://github.com/marick/structural-typing из новинок
постишь код, снизу справа есть ссылочка create snippet
Жмешь, появляется pop-up
@lowl4tency: мне кажется, что он у тебя синтаксис не распознал
Думаю когда больше одной тсроки
кхм, а я кложуру не нашел в списке
Плохо искал )
MARKDOWN
@lowl4tency: пару стилевых советов дать? 😄
malch: да, конечно
malch: я вчера первый раз писал что-то на кложе дальше репла
oxgrouby:
Просто второй аргумент слишком длинную строку делает, поэтому подумал что бы опнятнее было сделать в три строки )
malch: а разницы с (-> config :phones) нету?
меня если честно стрелочки в ступор немного вогнали
-> ->> map-> и тд
эм, нафига оно тогда нужно )
Ок, перепилю на твой вариант
О, спасибо
я даже не знал что он существует )
@lowl4tency: Ну а так твой код должен работать 😉
malch: спасибо за ревью и советы
Осталось понять почему оно не работает на лямбде
Такое ощущение что лямбда тупо игнорит мой хттп реквест
надо еще запилить review-rus канал
Я бы не сказал что try/catch это канонично в ФП. В кложуре они есть по причине интеропа в жаву
ну и конечно асинхронный код try/catch не покроешь
...а разве фп описывает хоть какие-то каноны по обработке ошибок? ортогональные вещи по идее
а что канонично в фп?
как понять что пошло не так без ыксепшонов?
в статичных языках дело конечно решеное - Result<Error,Value>, Maybe, Optional, etc.
@artemyarulin: atom тоже не канонично в фп. Clojure никогда и не пытался быть чисто функциональным языком
Не забивай @lowl4tency голову
в динимаческих сложнее - лично я возвращаю либо Error либо значение, либу с монадами тянуть не охота
Просто академический интерес )
ну почему-же не забивать голову - это вполне себе важная проблема
просто стандартная clojure.core не кидает эксепшенов - прикиньте если бы кидала все время? бррр
ну это давний холивар exception|return err object на сколько я помню :)))
Like Java, Clojure provides a couple of forms for throwing and catching runtime exceptions: throw and catch, respectively. Although throw and catch map almost directly down to Java and JavaScript, they’re considered the standard way of dealing with error handling. In other words, even in the absence of interoperability, most Clojure code uses throw and catch to perform error handling.
о, спасибо
(if ( != err nil)
(when-not тогда уж
ну вообще сейчас пытаюсь вспомнить когда мне нужно было заюзать try|catch и не помню. Не со стандартной либой кложуры, ни с другими либами
artemyarulin: ну вот я вызываю хттп апи реквест, как понять без трай кетч что не случилось чего-то плохого
ну например вдруг апи недоступно, или сеть упала
для этого есть статус в реквесте же
да тыща вариантов на самом деле. Если не тошнит от коллбеков то можно передать on-success, on-error Есил core.async (а мы же говорит об асинхронной операции?) то можно либо 2 канала вернуть с ошибками и рузультатами, или один и внутрь класть либо значение либо объект ошибки
HTTP status не будет если сети то нету
на самом деле в этом случае как раз try|catch работать не будет вообще ибо асинк
ну если конечно не юзать спец хелперы как когда-то Нолен описал
если кому интересно
ну или по хардкору подключить cats либу с монадами и заюзать оттуда магию. У меня мозгов не хватило понять:)
cats клёвый, но вся беда такая же как у core.typed -- в сторонних либах их нету, поэтому полной уверености что все ситауции обработал тоже нет
ну этого не будет никогда ибо динамик тайпс. Если хочется гарантий - то rust|scala|Java lol
я в последнее время игрался с rust - очень понравился. Но веб стек в зародыше - есть один http сервер но го активно пилят, перформанс не ах. Через год может выстрелит. А счас да - кложура наше все
java.nio или ты о rust/mio?
эт да, рановато в общем пока
А где можно ссылочки посмотреть с последнего хенгаута?
кхм, а еще глупый вопрос, у меня есть функция, (defn blabla [] (do snth)) а как сделать чтобы она что-то вернула или получить результат выполнения?
(println blabla) напечатает этот результат?
блин скобочки мне взрывают мозг, сраные смайлики ))
не скобочки норм, лучше чем отступы
но вот мозг взрывается с непривычки
{:message (str (get-in event ["Records" 0 "Sns" "Message"]))})
а вот это можно переписать через ключи?
типа как (:a mymap)
(:Records 0 :Sns :Message event)
event это распаршенный джейсон
теже яйца )
ну вот у меня было (vals (-> config :phones)
а можно было просто (vals (:phones config)
смотрится приятнее
о прикольно
Джесон же
и, кстати, ты можешь дёрнуть как функцию ассоциативную структуру - хешмап и вектор например, типа ([1 2] 0) == 1, ({:q "w"} :q} == "w"
подытожывая, у тебя должно быть типа (->> event :records 0 :sns :message str (hash-map :message))
или даже лучше не ->>, а some->>, чтобы не словить нулпоинтерэксепшн внезапно, неловко было бы
как говорилось, единственный интуитивно-понятый интерфейс - женская грудь, остальному надо учится
Эээ, два раза вызвал одно и тоже, а выхлоп в репле разный
я же питоноеб
прям как я ._.
oxgrouby: а что использовать чтобы функцию натравить на массив
про мап знаю
но я не знаю как натравить мап на функцию у которой два аргумента
сайдэфект это вызов функции?
точнее наоборот, вызов функции это сайд эфект?
> но я не знаю как натравить мап на функцию у которой два аргумента // врапер сделать например\
ну вот например, (map (blabla arg1 arg2)) я хочу чтобы функция выполнилась для каждого элемента массива arg2 но arg1 должен быть в каждом вызове один и тот же
я вчера пытался нагуглить, надломил свою извилину
@lowl4tency: replace for
with doseq
nicola: уже зареплейсил
спасибо
Всем привет, подскажите корректно ли не использовать проверку 0 при вычислении average-length
Смотрите как интересно))) http://www.lispcast.com/solid-principles-in-clojure Не было еще такого?
лично меня больше радует http://dev.clojure.org/jira/browse/CLJ-1562 и расширение clojure.string )
(defn func [x] (+ x 10)) (def y func) (def z #'func) (y 5) (z 5) подскажите, я правильно понимаю - после переопределения func , например, (defn func [x] (+ x 15)) y продолжает ссылаться на старую функцию func , а z всегда при вызове будет резолвить текущее значение символа?
@thickprogrammer: По эффектам - да, по смыслу - нет.
(def y func)
складывает в переменную y
функцию func
.
(def z #'func)
складывает в переменную z
переменную func
.
boot.user=> (defn func [x] (+ x 10))
#'boot.user/func
boot.user=> (type func)
boot.user$func
boot.user=> (def y func)
#'boot.user/y
boot.user=> (type y)
boot.user$func
boot.user=> (def z #'func)
#'boot.user/z
boot.user=> (type z)
clojure.lang.Var
boot.user=>
Почему это работает? clojure.lang.Var
резолвится в значение переменной, когда его трогают (через @
или на первом месте в исполняемой форме).
не совсем понял. что означает - "складывает в переменную y
функцию func
" - ссылку на функцию ? если так , то я не понимаю - почему "по смыслу нет". т.к. в "у" у нас ссылка на старую функцию, а в "z" ссылка на "func" , при резолве которого, получаем ссылку на новую функцию.