Size: a a a

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

2021 March 24

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Ivan Grishaev
блин, ничего не понять
я пошёл макроэкспандить, ага
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
wtf is going on
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
(if-some
 [[_ lang attr] (re-matches #"\A(\w\w)\$(.+)" field)]
 {:kind :translation, :lang (keyword lang), :attr (keyword attr)}
 (if-some
   [[_ tag attr] (re-matches #"\A(es|vs)#(.+)" field)]
   {:kind :nested, :tag (keyword tag), :attr (keyword attr)}
   (if (re-matches #"[^\$#]+" field)
     {:kind :root, :attr (keyword field)}
     (throw (ex-info "Unexpected field format" {:field field})))))
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
ну т.е. мы выигрываем пачку пробелов :D
источник

DS

Denis Shilov in Clojure — русскоговорящее сообщество
самые лютые лесенки у меня были когда я писал код для работы с железяками через ком-порт,. там можно в принципе было какой-то макрос прикрутить, или через экспешны переписать, но я не стал. Решил до конца уж идти.
источник

DS

Denis Shilov in Clojure — русскоговорящее сообщество
У человека глаз заточен на определенные паттерны, а все эти кастомные стрелки сразу все восприятие ломают
источник

DS

Denis Shilov in Clojure — русскоговорящее сообщество
выглядит как будто первый раз в жизни кложа-код открыл )
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
(defn- parse-field [field]
 (<<-
  (if-some [[_ lang attr] (re-matches #"\A(\w\w)\$(.+)" field)]
    {:kind :translation
     :lang (keyword lang)
     :attr (keyword attr)})
  (if-some [[_ tag attr] (re-matches #"\A(es|vs)#(.+)" field)]
    {:kind :nested
     :tag  (keyword tag)
     :attr (keyword attr)})
  (if (re-matches #"[^\$#]+" field)
    {:kind :root
     :attr (keyword field)})
  (throw (ex-info "Unexpected field format" {:field field}))))
а вообще это выглядит как явный `cond`
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
а вообще это выглядит как явный `cond`
нет, там if-some, а он делает local-binding, cond это не умеет и не должен
источник

DS

Denis Shilov in Clojure — русскоговорящее сообщество
вся эта погоня за краткостью кода идет сильно в ущерб читаемости, как и погоня за DRY
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
(defn- parse-field [field]
 (<<-
  (if-some [[_ lang attr] (re-matches #"\A(\w\w)\$(.+)" field)]
    {:kind :translation
     :lang (keyword lang)
     :attr (keyword attr)})
  (if-some [[_ tag attr] (re-matches #"\A(es|vs)#(.+)" field)]
    {:kind :nested
     :tag  (keyword tag)
     :attr (keyword attr)})
  (if (re-matches #"[^\$#]+" field)
    {:kind :root
     :attr (keyword field)})
  (throw (ex-info "Unexpected field format" {:field field}))))
если ничего не напутал:
(defn- parse-field [field]
 (or (when-some [[_ lang attr] (re-matches #"\A(\w\w)\$(.+)" field)]
       {:kind :translation
        :lang (keyword lang)
        :attr (keyword attr)})
     (when-some [[_ lang attr] (re-matches #"\A(\w\w)\$(.+)" field)]
       {:kind :translation
        :lang (keyword lang)
        :attr (keyword attr)})
     (when (re-matches #"[^\$#]+" field)
       {:kind :root
        :attr (keyword field)})
     (throw (ex-info "Unexpected field format" {:field field}))))
источник

AK

Azamat Kalimoulline in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
он simple, но использовать let (и прочие аналогичные формы) в тредмакросах - зло
А почему?
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Azamat Kalimoulline
А почему?
выше стюарта процитировал даже со скрином
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Sergey Trofimov
если ничего не напутал:
(defn- parse-field [field]
 (or (when-some [[_ lang attr] (re-matches #"\A(\w\w)\$(.+)" field)]
       {:kind :translation
        :lang (keyword lang)
        :attr (keyword attr)})
     (when-some [[_ lang attr] (re-matches #"\A(\w\w)\$(.+)" field)]
       {:kind :translation
        :lang (keyword lang)
        :attr (keyword attr)})
     (when (re-matches #"[^\$#]+" field)
       {:kind :root
        :attr (keyword field)})
     (throw (ex-info "Unexpected field format" {:field field}))))
да, я не тот пример дал, тут нет зависимости по переменным и можно так сделать
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
еще раз
я не про то, обычный код VS <<-
я про cond-let, let-else VS <<-
вы не то сравниваете
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
да, я не тот пример дал, тут нет зависимости по переменным и можно так сделать
тут можно и не только так сделать, можно запилить хэшмапу {регулярка обработчик} и по ней пройтись, всяко проще будет. или на мультиметодах
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
еще раз
я не про то, обычный код VS <<-
я про cond-let, let-else VS <<-
вы не то сравниваете
let-else читабельней
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
let-else читабельней
для его расширения тебе нужно что-то делать
<<- работает с чем угодно
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
для его расширения тебе нужно что-то делать
<<- работает с чем угодно
а мне не нужно его расширять
источник

AK

Azamat Kalimoulline in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
(defn- parse-field [field]
 (<<-
  (if-some [[_ lang attr] (re-matches #"\A(\w\w)\$(.+)" field)]
    {:kind :translation
     :lang (keyword lang)
     :attr (keyword attr)})
  (if-some [[_ tag attr] (re-matches #"\A(es|vs)#(.+)" field)]
    {:kind :nested
     :tag  (keyword tag)
     :attr (keyword attr)})
  (if (re-matches #"[^\$#]+" field)
    {:kind :root
     :attr (keyword field)})
  (throw (ex-info "Unexpected field format" {:field field}))))
Слишком много смыслов в одной фкнкции.
источник