Fork me on GitHub
#clojure-russia
<
2016-07-29
>
artemyarulin04:07:46

@andmed: Это было 2(3?) года назад, я кложуру по 4clojure начал изучать, потом плюнул и пошел сразу на продакшене учиться trollface

artemyarulin04:07:35

очень рекомендую включить code golf (вроде так оно называется?) чтоб можно было сравнивать с самими короткими ответами других, прям очень полезно было по началу, хотя и сложно бывало понять однострочники

artemyarulin08:07:06

ОООО, ууу! Народ-народ, зацените - http://planck-repl.org/testing.html Planck умеет запускать юнит тесты с CLJS. Только-что проверил - реально lein + doo + phantomjs, cold start = 17s lein + doo + phantomjs, second run = 8s planck = 1.7s(!)

andmed08:07:05

на продакшене и я б пошел. но гдеж его взять, этот продакшн, чтоб согласился на такое))

lowl4tency08:07:19

чем-то мне перл это напоминает

artemyarulin08:07:00

а чо там?

rmuslimov08:07:26

@artemyarulin: так фантом полноценный браузер, а планк всего лишь репл, не?

artemyarulin08:07:55

@rmuslimov: Ага, но юнит тесты (которые без IO и на логику) он проверит в самый раз. А для чего побольше уже можно фантом да. Т.е. не замена конечно, а как дополнение

andre08:07:48

оффтоп, в последнее время много пишут про 4clojure тут, а я вот реально хорошо продвинулся на clojure в бою тут https://www.codingame.com, очень классный онлайн редактор много интересных реальных задач, также можно посоревноваться в скорости в кодинг битвах

andre08:07:24

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

andre08:07:46

порядка на питоне 50 символов. на кложе 100, и дальше пошли java , с итд , 200 и больше

andre08:07:33

ну там еще конечно у кложи неймспейс много занимает и если работать со строками , у питона ничего подобного нет, так что питон в этом плане еще выигрывает по компактности кода

andre09:07:40

там есть чувак https://github.com/TerjeNorderhaug , вот у кого решения всегда реально крутые, ты вроде все сделал круто, а смотришь его решение , чувак просто мыслит на фп

andre09:07:08

ну опять же анализируя чужие решения. очень сильно подтянулся в clojure

artemyarulin09:07:35

@andre: можешь кинуть пример его кода?

rmuslimov09:07:12

что-то я с настороженностью отношусь к тому что питон может быть короче кложи

andre09:07:45

(ns Player
  (:gen-class))
(defn -main [& args]
  (let [lightX (read) lightY (read) initialTX (read) initialTY (read)]
    (loop [x initialTX y initialTY]
      (let [remainingTurns (read)
            dx (compare lightX x) 
            dy (compare lightY y)]
        (println (str (case dy -1 "N" 0 "" 1 "S")
                      (case dx -1 "W" 0 "" 1 "E")))   
        (recur (+ x dx) (+ y dy)) ))))

andre09:07:53

но нужно знать контекст задачи

andre09:07:28

@rmuslimov: я думаю что дело конкретно вот в таких мини задачках, clojure для этого не очень подходит

andre09:07:52

@rmuslimov: если брать реальные проекты то там будет наверное совсем по другому, но для меня задача была именно продвинуться в clojure , даже если она не очень подходит для этого формата задач

rmuslimov09:07:10

видимо, не очень

andre09:07:54

т.е. там всякая работа со строками, очень тяжко это все идет, в питоне все это быстрей и короче

rmuslimov09:07:02

да, вот нет

andmed09:07:02

@andre: kmk этот UI как то отвлекает. на сортировке листа девятый вал нарисован, ткнул кнопку -- самолетики появились за заднем фоне, анимации. приколькно

rmuslimov09:07:19

зависит от того как ты пишешь

rmuslimov09:07:46

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

rmuslimov09:07:55

например то, что ты скинул

rmuslimov09:07:09

супер ugly с этим методом read

andre09:07:10

я узнал для себя compare

rmuslimov09:07:22

который стейт в себе хранит

rmuslimov09:07:33

или вот remainingTurns (read)

andre09:07:35

кстати read там у clojure преимущество repeadelty можно использовать 🙂

rmuslimov09:07:51

где он там используется дальше в let?

andre09:07:00

это условие было задачи такое

andre09:07:12

типа это первый этап решения задачи

andre09:07:21

в три этапа и в последующем эта переменная будет использоваться

rmuslimov09:07:32

ну я о том что тренажеры эти от лешего

andre09:07:11

ну я никому не навязываю, мне просто очень полезно было

andre09:07:26

в отпуске развлекался )

rmuslimov09:07:38

ты приведи тогда если не сложно

rmuslimov09:07:54

пример там где питон более краткий чем clojure

andre09:07:54

он всегда там был более краткий

andre09:07:10

я думаю специфика этого портала именно

andre09:07:19

у кложи всегда нагрузка в виде

(ns Player
  (:gen-class))
(defn -main [& args]
  (let 

andre09:07:23

у питона этого нет

andre09:07:28

там сразу код идет

andre09:07:32

скобочки опять же

andre09:07:38

у него нет

andre09:07:28

если нужно со строками работать то там сразу [clojure.string :as str] итд

andre09:07:59

а программки маленькие считай половина кода у кложи на скобочки и на вот это все

andre09:07:23

плюс когда интероп с джавой нужен для преобразования типов много уходит символов

comerc10:07:34

@dbushenko: про http://clojure.by/articles/2016-07/clojure-vs-null CoffeeScript: result = a?.b?.c or "sorry", Clojure: (-> a :b :c (or "sorry")) или (get-in a [:b :c] "sorry"). и нет проблемы 🙂

comerc10:07:53

> Проблема NPE в коде – это не проблема неотловленных исключений или ошибок в коде. Это проблема читабельности кода.

potapenko11:07:57

еще some->

comerc11:07:57

@dbushenko: удалили мою копипасту с Хабра http://clojure.by/articles/2016-07/why-not-haskell

lowl4tency12:07:07

artemyarulin: perl golf for example

lowl4tency12:07:19

а еще тоже есть любители использовать непонятные символы )

rmuslimov12:07:42

@comerc а зачем ты туда копипасту закинул

rmuslimov12:07:57

собственно чуть ли не первый пункт правил

comerc12:07:12

@rmuslimov: у меня тут вчера случился приступ "А давайте закидаем Хабр заманушными статьями про Clojure!"

maxp12:07:17

что-то вы странное про питон тут пишете

maxp12:07:29

у питона в начале всегда идет как минимум

maxp12:07:45

#!/usr/bin/env python

maxp12:07:59

# -- coding: utf-8 --

maxp12:07:07

и только потом с ним можно работать 🙂

rmuslimov12:07:12

неправда

rmuslimov12:07:18

первой строки может не быть

maxp12:07:24

это я говорю, как программист с 15 лет стажем на Питоне 🙂

andre12:07:42

ну я говорил про особенности конкретного онлайн проекта

maxp12:07:42

да я стебусь, конечно

maxp12:07:51

но нифига там не короче

maxp12:07:04

недавно перписал проектик небольшой

maxp12:07:11

но плотный по строкам

maxp12:07:18

с 1300 строк на 700

maxp12:07:23

с питона на кложу

maxp12:07:18

причем 1300 строк было в довольно функциональном стиле и без оболия комментов

maxp12:07:26

причем 1300 строк было в довольно функциональном стиле и без обилия комментов

comerc12:07:25

@rmuslimov: нужно дождаться перевода статьи на EN, чтобы сослаться на этот перевод. гы-гы.

andmed12:07:11

а это правда что в Беларусии кложа популярна (с чего вдруг?)

dbushenko12:07:03

я пару лет назад сильно популяризировал, проводил два раза курсы онлайн и в БГУ, много выступал с митапами

dbushenko12:07:27

потом малость надоело, и я на пару лет ушел в Haskell. Может после меня какая-то популярность и осталась...

comerc12:07:30

@andmed: переехал из Питера в Минск - заразился Clojure 🙂

comerc12:07:59

место тут гиблое

andmed12:07:56

@dbushenko: в плане реальных проектов? ваши айтишники вообще сейчас огого, если загранпроектов много, то и кложа должна быть. у нас по пальцам пересчитать

andmed12:07:24

@comerc: заразился -- это про себя?

dbushenko12:07:05

ну программу курсов можешь глянуть на http://clojurecourse.by, там Никита Прокопов выложил все материалы

dbushenko12:07:14

а проекты -- хз, тут кто на что горазд

dbushenko12:07:33

я сейчас пишу на кложе потому что заказчику надо jvm, но на конкретный язык -- пофиг

andmed12:07:48

ага, это удобно

artemyarulin12:07:13

@dbushenko: А у тебя самого к чему душа лежит - хаскель или кложура?

andmed12:07:28

вообще бэкэндовая кложа -- считай что редкость, если читать слак

dbushenko12:07:46

@artemyarulin: смотря для каких проектов

dbushenko12:07:07

если что-то околонаучное, ну там может компиляторы какие -- то Haskell или Idris

dbushenko12:07:15

все остальное быстрее делать на кложе

andmed12:07:29

о. idris мега

artemyarulin12:07:30

PureScript|Elm не смотрел?

dbushenko12:07:47

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

dbushenko12:07:11

я на Haskell/PureScript сделал два внутренних проекта на своей прошлой конторе, там до сих пор ими пользуются

dbushenko12:07:25

еще раз подтверждаю: писать на них -- медленно 🙂

artemyarulin12:07:34

тру( Я на PureScript решил уйти, разбрался со всеми профунктарами и прочими аппликатив наконец - но как начал писать понял что долго и вернулся

dbushenko12:07:52

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

dbushenko12:07:05

вот-вот 🙂

dbushenko12:07:17

теоркат -- это красиво, но не сильно практично 🙂

artemyarulin12:07:36

дада, я согласен. Т.е. может для медицины там, для финансов я бы взял хаскель/пуре заместо кложуры, т.е. для сфер где стоимость ошибки большая

dbushenko12:07:47

именно

dbushenko12:07:06

но, если по-честному, то в этих областях хаскелю тем более делать нечего

dbushenko12:07:18

потому что вся прочая обвязка, что не на хаскеле, она сильно забагованная

dbushenko12:07:43

любая интеграция с не-хаскелевой библиотекой почти наверняка содержит кучу ошибок, которые поправить самостоятельно очень сложно

artemyarulin12:07:12

а как тебе idris кста и вообще идея с dependent type system?

dbushenko12:07:39

ну мне нравится 🙂 но на практике я не знаю, есть ли смысл использовать в ближайшее время...

artemyarulin12:07:36

в кложуре спека ближайшая аналогия как мне кажется

andmed12:07:00

встречал чела с ethereum, они на нем тесты пишут, вроде как

dbushenko12:07:26

вот кстати да, очень-очень напоминает зависимые типы, там где fdef

comerc12:07:05

@andmed: заразился - это про себя, да

andmed12:07:30

прикольно. надо заехать будет

andmed12:07:48

аааафигеть... молочка, опять жеж классная)

comerc15:07:32

@potapenko: покажи на примере (-> a :b :c (or "sorry")), пажаласта. не втыкаюсь.

rmuslimov15:07:03

ребята, поругайте тут, это ведь нечитабельный код, да: https://github.com/rmuslimov/gdsconsole/blob/master/src/client/components/common.cljs#L21-L60

rmuslimov15:07:42

или норм?

rmuslimov15:07:55

или как писать большие компоненты с румом?

artemyarulin16:07:37

@rmuslimov: Может облегчить часть с разметкой хотябы? Вынести if повыше как let, onChange тоже функцию вынести и прочее. А то счас прям тяжело читается

comerc16:07:19

http://www.parens-of-the-dead.com/ - A screencast series of zombie-themed games written with Clojure and ClojureScript.

dbushenko17:07:16

@comerc: мне кажется, ты не понял основную мысль, которую я продвигал в статье. Сам nil - не настолько большая проблема, сколько проверки на nil там, где нельзя обойтись значением по умолчанию

dbushenko17:07:16

Эти проверки разветвляют код. Каждый if в коде в два раза ухудшает читабельность

dbushenko17:07:53

Поэтому, если нельзя воспользоваться дефолтным значегием, выполнение фугкции нужно каким-то образом прекратить

dbushenko17:07:02

@rmuslimov: у тебя получился спагетти-код, как у любителей PHP. Читай про способы борьбы со спагетти

dbushenko17:07:15

Не, точка выхода из функции тоже должна быть одна

artemyarulin18:07:45

А то раньше надо было руками жаву ставить, не айс

misha19:07:29

@rmuslimov: компонент же у тебя мелкий:

div
 div
  input
 ul
  li
   a

misha19:07:07

в let или даже вне компонента всю логику вынеси, и будет ок вообще

misha19:07:15

что бы "ниже" let'a осталось:

[:div {:class container-class}
     [:.input-group__inline-control
      [:input.borderless
       {:type "text" :placeholder placeholder :value the-value
        :onChange on-text-change
        :onKeyDown on-key-down}]]
     [:ul.dropdown-menu {:role "menu"}
      (for [[idx [k v]] things]
        [:li {:key k :role "presentation" :idx idx
              :className li-class
              :onClick on-li-click
         [:a {:role "menuitem"}
           [:span v]]])]]))
и странновато, что on-click - в li, а не в а, но то такое: "каждый др#### CSS как захочет"

misha19:07:10

@artemyarulin: вспомнил аргумент в пользу (:require-macros [foo.bar :as b]) vs. (:require [foo.bar :as b :include-macros true] ): мне так курсив не подчеркивает макросы как "cannot be resolved" kappa

artemyarulin19:07:20

бггг, да выкинь его нафег emacs

misha19:07:09

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

misha19:07:57

а спейсмакс чота тормозил адски, когда я его пробовал осенью, я и забил

artemyarulin19:07:31

а спейсмакс это вроде просто емакс + кастомный конфиг или там чо еще есть?

misha19:07:39

типа того вроде: чтобы с первого раза без возни запустить и пользоваться

comerc19:07:21

#C0D2M7JEN

comerc19:07:02

призываю заполнять все полочки в шкафчике! 🙂

rmuslimov20:07:24

@misha: а вот эти функции просто рядом с компонентом сложить?

rmuslimov20:07:15

мне нравилось в jsx что методы лежат в одном классе, какая явная связанность у этих методов возникала

misha20:07:03

ну в лет положи, там будет много, но зато в столбик, а не вразброс: 20-40 строк лета, 10 строк тагов

rmuslimov20:07:49

@misha: хорошо, спс

rmuslimov20:07:21

может даже в letfn

rmuslimov20:07:30

будет разумнее

misha20:07:33

вообще зарефактори, сравни с чем было, и выбери. тебе же потом с этим жить

rmuslimov20:07:57

конечно зарефакторю, мне еше js-никам этот код продавать

misha20:07:58

там не всё функции, и не все одноаргументные

rmuslimov20:07:26

пока не выглядит так чтобы купили

rmuslimov20:07:14

letfn можно не только одноаргументные

misha20:07:36

я почитал, не понял зачем он (или чем лучше let'a)

rmuslimov20:07:18

ну чтобы не писать (let [f1 (fn [x] …)])

rmuslimov20:07:33

вообще эта штука списана с flet из elisp

rmuslimov20:07:41

там это очень популярно

misha20:07:42

а как будет? (letfn [f1 [x] ...])?

misha20:07:25

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

rmuslimov20:07:26

большой лет это хорошо или плохо, мне пока непонятно

rmuslimov20:07:45

можно на создавать всего в let и сделать маленький body

rmuslimov20:07:48

и наоборот

rmuslimov20:07:58

в какой момент остановиться я для себя не могу понять

misha20:07:46

с точки зрения читаемости - даже 1 лет лучше, чем то, что у тебя, потому что у миллиона хендлеров отступ будет консистентный, и сразу видно "сколько всего штук". + отделены мозги от разметки

misha20:07:39

а если летов больше - возможно есть смысл вынести компонент, как, например, из твоего (for)

rmuslimov20:07:20

согласен

rmuslimov20:07:39

спасибо за анализ

niquola20:07:42

Большой лет часто запашок плохой декомпозиции

niquola20:07:40

Обычно бьется на более мелкие функции и ->

comerc20:07:05

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

comerc20:07:13

> мне нравилось в jsx что методы лежат в одном классе, какая явная связанность "у этих методов возникала @rmuslimov: так они и останутся в одном классе?

rmuslimov21:07:46

@comerc: ну как останутся в одном классе, с точки зрения чтения кода все равно будут разбросанные функции

rmuslimov21:07:13

собственно следующий вопрос как теперь на этот компонент написать тестов?

misha21:07:49

@nicola: в "стандартном" коде - да, в реакт компонентах - не всегда и не совсем.

misha21:07:41

юай не всегда становится лучше/быстрее, если его распотрошить на "кнопки" и скомпоновать потом много мелких осколков

comerc21:07:09

@rmuslimov: норм - в продакшен! 🙂

comerc21:07:05

но вообще тесты - для трусов 🙂

misha21:07:16

@rmuslimov: нравится? )

rmuslimov21:07:31

@misha: да, по-моему читабельность стала лучше

comerc22:07:01

@nicola: Ilshad & Artem про Om.Next рассказывали год назад, можно предположить, что поднабрались опыта https://youtu.be/u0hVc-wCYuE?t=4973 | еще @artemyarulin признался, что 3 месяца вкуривал, да бросил - отрицательный опыт тоже интересен | про re-natal тоже интересно, его можно запустить на Om.Next | @asolovyov тоже смотрит в эту сторону: https://www.youtube.com/watch?v=KxZGeD2ugOw&amp;t=3820