This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2017-07-13
Channels
- # bangalore-clj (1)
- # beginners (40)
- # boot (22)
- # clara (19)
- # cljs-dev (265)
- # clojure (160)
- # clojure-dev (6)
- # clojure-italy (5)
- # clojure-russia (47)
- # clojure-spec (10)
- # clojure-uk (63)
- # clojurescript (88)
- # core-async (8)
- # cursive (54)
- # datomic (48)
- # emacs (32)
- # garden (3)
- # graphql (29)
- # hoplon (54)
- # jobs (1)
- # klipse (4)
- # luminus (5)
- # lumo (21)
- # mount (5)
- # off-topic (16)
- # om (2)
- # pedestal (10)
- # play-clj (1)
- # portkey (32)
- # re-frame (21)
- # reagent (48)
- # rum (1)
- # spacemacs (4)
- # sql (3)
- # unrepl (5)
кто java помнит? если в java отнять у программиста if, switch и любые другие бранчевания веток исполнения, насколько трудно сделать в java свой if не используя встроенные средства ветвления?
в общем без низкоуровневого манипулирования байткодом на уровне ast никак
на кложе свой if 3 строчки занял
ну все - теперь я знаю как буду продовать кложуру бизнесу: В вашей жаве если иф сломается то капец, а на моей кложуре у меня три запасных!
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?')")
а точнож)
@artemyarulin зацени, положил атом в атом
@dartov да тут больше про возможности языка выразить идею, которой нет в языке,а надо пограмисту
наверное плохо это иллюстрировать через “а если забрать основную конструкцию“, надо какой-то реальный кейс
вот две мои реализации. Одна через мапу, другая чисто на списках.
(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)))
макросы было лень делать
не говоря уже о том, ищ чего and
и or
состоят
(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)))))
не, эвал всегда только одного бранча
да, с or и and не посмотрел сначала что они внутри на if'ах
ха, точно эвалят
да нужны макросы
кароче. код нагло спижжен отсюда
ща макросы попробую сделать на базе него
на функциях он работает, только не удобно
(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
этот вариант уже евалит только одно
@artemyarulin это чтобы всё в одном атоме™ было, и можно было и/о делать с домом мимо лайфсайкла:
[:video {:ref (fn [node] (dispatch! ::state/install-video-node! node)) ...]
а атом может хранить чо угодно да?
да, просто если видео ноду класть в общий атом через рекомендуемый реактом :ref
хук - он будет бесконечно передергиваться, компонент на него подписаный - перерендериваться, хук обновлять атом, и так по-кругу, пока не поставишь какую-то непонятную-через-2-недели ифочку
небольшой оффтоп, но очень уж классная порой тулза: https://github.com/clojure-emacs/cider/blob/master/doc/debugging.md
почему оффтоп, очень классная штука да. Для CLJS вроде как не работает на сколько я помню, но тут появляются плюсы если все CLJC уже
@misha мож полезно будет http://blog.isquaredsoftware.com/2017/05/idiomatic-redux-tao-of-redux-part-1/
@artemyarulin гляну. я уже всё почти намонстрил, получилось неплохо, дальше пишу апп, распихиваю по слотам юзкейсы и смотрю где невпихивается