Fork me on GitHub
#clojure-russia
<
2017-07-13
>
mike_ananev04:07:06

кто java помнит? если в java отнять у программиста if, switch и любые другие бранчевания веток исполнения, насколько трудно сделать в java свой if не используя встроенные средства ветвления?

mike_ananev07:07:31

в общем без низкоуровневого манипулирования байткодом на уровне ast никак

mike_ananev07:07:48

на кложе свой if 3 строчки занял

misha08:07:09

ну, технически, у тебя кложа на джавовых ифах написана

misha08:07:32

это как свой иф на родных ифах писать в джаве, сложно, но можно наверное

artemyarulin08:07:17

ну все - теперь я знаю как буду продовать кложуру бизнесу: В вашей жаве если иф сломается то капец, а на моей кложуре у меня три запасных! troll

dartov08:07:44

а зачем такое? были несчастные случаи когда ломались if/switch/ternary?

artemyarulin09:07:52

const myIf = (a, b, c) => a ? eval(b) : eval(c)
myIf(true, "console.log('Look ma, no ifs!')", "console.log('where is your clojure now?')")

misha09:07:34

а тернари ? - разве не просто сахар?

artemyarulin09:07:10

а точнож)

misha09:07:31

@artemyarulin зацени, положил атом в атом tatatananana

mike_ananev09:07:31

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

dartov09:07:15

наверное плохо это иллюстрировать через “а если забрать основную конструкцию“, надо какой-то реальный кейс

misha09:07:43

кор асинк хорошая иллюстрация ща найду отрывок, вчера как раз смотрел

mike_ananev19:07:51

вот две мои реализации. Одна через мапу, другая чисто на списках.

mike_ananev19:07:58

(defn if' [[pf a b] e1 e2] (let [x (pf a b)] (eval ({true e1 false e2} x)))) (defn if' [condition branch1 branch2] (or (and (apply (first condition) (drop 1 condition)) (eval branch1)) (eval branch2)))

mike_ananev19:07:14

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

misha19:07:25

ну твой иф эвалюэйтит оба бранча, такое использовать нельзя opieop

misha19:07:06

не говоря уже о том, ищ чего and и or состоят kappa

(defmacro and
  ([] true)
  ([x] x)
  ([x & next]
   `(let [and# ~x]
      (if and# (and ~@next) and#))))

(defmacro or
  ([] nil)
  ([x] x)
  ([x & next]
      `(let [or# ~x]
         (if or# or# (or ~@next)))))

mike_ananev19:07:37

не, эвал всегда только одного бранча

misha19:07:39

ну и let тоже

mike_ananev19:07:21

да, с or и and не посмотрел сначала что они внутри на if'ах

mike_ananev19:07:01

ха, точно эвалят

mike_ananev19:07:49

да нужны макросы

misha19:07:45

не продать тебе кложу в контору : )

mike_ananev19:07:00

кароче. код нагло спижжен отсюда

mike_ananev19:07:18

ща макросы попробую сделать на базе него

mike_ananev19:07:57

на функциях он работает, только не удобно

mike_ananev19:07:46

(defmacro TRUE [a b] a) (defmacro FALSE [a b] b) (defmacro IF [c a b] (list c a b)) (IF TRUE "first" "second");; => "first" (IF FALSE "first" "second");; => "second" (IF TRUE (println 1) (println 2)) ;; 1 ;; => nil

mike_ananev20:07:05

этот вариант уже евалит только одно

misha09:07:20

а в том атоме - video/аудио дом-нода

misha09:07:55

@mike1452 а тебе ответочку "без джавы не было бы кложи"

misha09:07:21

@artemyarulin это чтобы всё в одном атоме™ было, и можно было и/о делать с домом мимо лайфсайкла:

[:video {:ref (fn [node] (dispatch! ::state/install-video-node! node)) ...]

artemyarulin09:07:02

а атом может хранить чо угодно да?

misha09:07:16

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

misha09:07:26

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

misha11:07:42

конечно на экшенах/ивентах компактненький js/setInterval декомпозируется будь здоров

andrewtropin12:07:38

небольшой оффтоп, но очень уж классная порой тулза: https://github.com/clojure-emacs/cider/blob/master/doc/debugging.md

artemyarulin12:07:09

почему оффтоп, очень классная штука да. Для CLJS вроде как не работает на сколько я помню, но тут появляются плюсы если все CLJC уже

misha12:07:37

vim cursive master race kappa

misha12:07:55

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

misha12:07:49

по-сути нужно 3 корзинки: 1) маппинг ивентов на обработчики (чистые и неочень), 2) маппинг подписок ивентов на интересные им ключи в стейте, и 3) маппинг подписок ивентов на ивенты, чтобы не комплектить™ обработчик одного ивента с вызовом тех, кому еще этот ивент интересен

misha12:07:43

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