Fork me on GitHub
#clojure-russia
<
2016-12-06
>
rmuslimov08:12:22

а научите/посоветуйте пож-та howto как с exceptions быть. Строить ли свою иерархию классов? или вот такими вещами попуоярно пользоваться - https://github.com/scgilardi/slingshot

rmuslimov09:12:29

> Luckily, idiomatic Clojure code doesn't throw exceptions very much. I tend to view the throw and 'catch forms as interop forms, but try and 'finally are idiomatically useful for cleaning up after errors even if you never explicitly throw or catch in your entire program.

artemyarulin09:12:08

со второй линки не очень понимаю чо не нравится

(try X 
       catch #?(:cljs js/Object :clj Exception) e 
        (do-something-with-ex e)

artemyarulin09:12:36

аа, этому треду 3 года, тогда еще этого не было 🙂

artemyarulin09:12:34

хз, я как-то без эксепшенов обхожусь - тока если интероп

rmuslimov09:12:01

угу значит я ничего не пропустил

artemyarulin09:12:39

можно посмотреть всякие монады https://github.com/funcool/cats

artemyarulin09:12:06

промисы опять же, хотя таже монада

artemyarulin09:12:43

ну и если уже совсем развернуть то лист это тоже монада - есть айтемы, все ок, пустой список - error case

artemyarulin09:12:02

если речь идет про всякие UI - то опять же когда single application state то ошибки просто доп данные в нужном месте а ля {:err “Something went wrong, show in alert”}

rmuslimov09:12:10

нет, нет - у меня очень простой кейс, я бы в питоне сейчас нарубил эксепшенов

rmuslimov09:12:15

а тут просто nil верну

artemyarulin09:12:30

а в питоне разве принято эксепшены тоже кидать?

rmuslimov09:12:38

точнее это наверное не то, чтобы просто - просто кложур вей

rmuslimov09:12:47

да вроде

artemyarulin09:12:03

а ну ок, давно его не трогал

artemyarulin09:12:47

ага, лучше вернуть nil (или какой еще маркер ошибки хоть кейворд) а уж вызывающий код решит чо с ним делать

turtle10:12:23

Эксепшоны же это круто. Точнее, что-нибудь, что можно кинуть.

turtle10:12:40

Убирает очень много-много лапши.

andmed10:12:56

Как только берешь кложу после перерыва, lazyness снова бьет поддых. Вот есть такой недо-аристофановский алгоритм

(let [[x & xs] (range 2 10)]
  (when-some [rest (seq (remove #(= 0 (mod % x)) xs))]
    rest)) => (3 5 7 9)
ок. заворачиваю в функцию только и всего
(defn primes2 [seq]
  (let [[x & xs] seq]
    (when-some [rest (seq (remove #(= 0 (mod % x)) xs))]
      rest)))
получаю
(primes2 (range 2 10))
ClassCastException clojure.lang.LongRange cannot be cast to clojure.lang.IFn  how-to-design-and-program/primes2 (form-init6724239834526720383.clj:3)
ну. и что меняется от заворачивания в функцию в этой самой lazyness, если я эту функцию так и так дергаю.. ох

turtle11:12:32

Мне кажется, у тебя переменная законфликтовала и имя функции.

turtle11:12:47

seq которая. Хотя должен был зашадовить, по идее.

andmed11:12:50

ой, да

turtle11:12:04

ИМХО, баг кложуры. Хотя, если посмотреть иначе, может, и не должен такие вещи затенять.

turtle11:12:21

Я не могу определиться, попросим экспертов по дизайну ЯП.

andfadeev11:12:00

вроде довольно предсказуемо?

(defn some-f [seq]
              (seq 1 1))

(some-f +)
=> 2

turtle11:12:59

Получается затеняет только лукап функции.

turtle11:12:04

А лукап переменной нет.

andfadeev11:12:15

не совсем понял, что ты имеешь ввиду

andfadeev11:12:24

ты задал скоуп defn-ом внитри которого seq уже не seq из clojure.core

andfadeev11:12:43

а потом вызываешь seq

andmed11:12:47

это я задал Ж)

andfadeev11:12:47

хотя это уже не функция

turtle12:12:38

А не, всё правильно, затеняет.

turtle12:12:39

Просто @andmen юзает и функцию тоже.

leov12:12:55

всем привет

leov12:12:21

а может кто-нибудь здесь подсказать? при подключении датомика-фри репл не стартует а плюётся вот этим:

leov12:12:21

Caused by: java.lang.IllegalArgumentException: No matching ctor found for class clj_logging_config.log4j.proxy$org.apache.log4j.WriterAppender$ff19274a, compiling:(clj_logging_config/log4j.clj:37:18)

leov12:12:52

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

rkosenko13:12:11

@leov похоже у вас нет log4j в classpath, но ныне самый модный логгер - это logback (который через slf4j работает). Попробуйте в dependencies добавить:

[ch.qos.logback/logback-classic "1.1.7"]
а datomic подрубать с такими exclusions:
[com.datomic/datomic-pro "0.9.5530" :exclusions [org.slf4j/slf4j-nop
                                                    org.slf4j/slf4j-log4j12]]

leov14:12:30

гм. а не очень помогло: ошибка та же самая

leov14:12:35

причём она сохраняется если я закомменчиваю всё почти из dependencies

leov14:12:46

есть ли какой-то способ это отлаживать? смотреть classpath?

leov14:12:57

закомментил ring.middleware.logger - заработало. буду пытаться узнать, что там с чем подралось..

leov16:12:50

ААААА

leov16:12:04

В ДЖАВЕ ПОХОЖЕ И В КЛОЖЕ ЛОГГИРОВАНИЕ НАСТРАИВАЕТСЯ СНАРУЖИ

leov16:12:05

отдельно

leov16:12:13

господи я врубил логи И ОНО КАК ПОЛЕЗЕТ

leov16:12:25

майндфак номер два: я отключил библиотеку парсинга жсонов и хттп клиент МОЛЧА потерял возможность парсить жсоны. без единого писка.

leov16:12:30

ну каааак. кааак

ponimas16:12:20

google for logback.xml

leov16:12:33

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

ponimas16:12:09

ну как оно там внутри работает - это для меня история покрытая мраком

ponimas16:12:56

насколько помню, есть несколько стандартных джавовских логгингов

ponimas16:12:08

и все пользуются каким либо из них

ponimas16:12:21

+ есть адаптеры из каждого в каждый

ponimas16:12:31

в основном - это логбэк

leov16:12:58

я просто запутался в onelog timbre slf4j logback и log4j

leov16:12:03

почти столько же сколько реплов

ponimas16:12:22

конфиг они в виде кложи не жуют

ponimas16:12:27

есть обёрточка

leov16:12:33

и ещё каком-то. в руби есть только 1 логгер, и тот в хероку печатает в stdout. и как-то живут, не умерли

ponimas16:12:39

timbre, вроде бы называется а ну ты упоминал его

leov16:12:40

:grumpy:

ponimas16:12:01

ты подумай сколько лет руби и сколько лет jvm

leov16:12:08

да. ты прав.

leov16:12:54

кстати они вроде или ровесники или руби старше

leov16:12:56

рельсы моложе

ponimas16:12:05

вот есть такая штучка для тех кто не знаком с явовым логгингом https://github.com/stuartsierra/log.dev

ponimas16:12:50

омфг, они ровесники

leov16:12:12

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

leov16:12:26

блин. сорри за ворчание)

ponimas16:12:20

ну короч так сложилось, что логгинг в жаве неприятный

andmed16:12:34

@leov: кроме логгинга, проблем с запуском datomic не было?

leov16:12:41

пока не знаю

leov16:12:46

ещё вкручиваю

leov16:12:00

я пока датаскрипт осваиваю. он прельстив лицензией

leov16:12:37

хз. чем-то конечно сама идея очень манит. плюс Никита и его статьи делают это всё очень простым, но написать такое нифига не просто.

rmuslimov16:12:49

спасибо за тред про logback и логи, не ожидал от кложи такого 🙂