This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2016-04-03
Channels
- # beginners (4)
- # boot (32)
- # braid-chat (57)
- # cljs-dev (2)
- # cljsrn (1)
- # clojure (18)
- # clojure-austin (1)
- # clojure-russia (245)
- # clojurescript (61)
- # component (5)
- # datomic (4)
- # hoplon (2)
- # off-topic (2)
- # om (3)
- # onyx (2)
- # parinfer (6)
- # proton (5)
- # protorepl (8)
- # re-frame (56)
- # reagent (1)
- # untangled (13)
- # yada (28)
@maxp: абстрактно-теоретически я тоже к этому склоняюсь, но думал вдруг есть неочевидный практический довод потом же, "свой велосипед" на ум приходит и все такое
можно показывать лямбду из большого, указательного и среднего пальцев. Большой будет закорючкой вверху, оставшиеся два "ножками"
https://news.ycombinator.com/item?id=11405239 тут конечно в основном US и стартапчики, но кложуры довольно много (31 совпадения против например 50 скалы, JavaScript 130)
@artemyarulin: ты теслу 3 уже предзаказал?
@andmed можешь их из rum компонентов собирать и рендерить им же (если тебе вдруг по-пути на шаг дальше хиккапа)
@andre: Ну вот я уже на 4 главе Real World Haskell, т.е. я уже почти элита, тесла уже на подоходе 😄
@artemyarulin: возможно ты тогда знаешь как в repl напечатать строку без nil и без кавычек
@andmed: Фу-фу, это сайд эффект 😄
не понял, а зафега? У тебя лист или чо?
задача экстраординарная: сделать readline и тут же напечатать. Hello World такой. На hackerrank типа контеста. Это первая задача
user=> "aa" "aa" user=> 'aa aa
(symbol "aa") aa
вот так тада
@artemyarulin: 🤓 работает! а как перевод строки сделать в конце? (newline) тоже nil дает
чота кая-то странная у тебя задача прям, оооочень
user=> (symbol "aa") (symbol "") aa user=>
@artemyarulin: ништяк. а я вот не догадался, всякие \n подсовывал
можешь кинуть сюда текст задачи? Чота я сомневаюсь что такое порно нужно было сконструировать
Вот эта гигантская задача Ж-)
Input Format
A single line of text denoting inputStringinputString (the variable whose contents must be printed).
Output Format
Print Hello, World.Hello, World. on the first line, and the contents of inputStringinputString on the second line.
Sample Input
Welcome to 30 Days of Code!
Sample Output
Hello, World.
Welcome to 30 Days of Code!
ааа дак неа
смотри когда ты сделать (print “HELLO”) то в консоль выведется HELLO, но так как ты в репле то будет сайд эффект (HELLO в данном случае) + то что вернула функция print, а данном случае nil
нене, тебе нужно просто (print "Hello, World.\n” inputStringinputString)
нене, все будет пучком. Репл != консоль. В репле у тебя выводиться standard output + доп фигня от кложуры, такое как возврат из функций
как задача наывается на hackerrank?
дай ссылу на нее
очевидное
(print "Hello, World.\n" (read-line))
сбой в форматировании дает, не принимаетхм, не могу открыть 404
ой да у них туда надо заходить через https://www.hackerrank.com/calendar
Your Output (stdout)
Hello, World.
Welcome to 30 Days of Code!
Expected Output
Hello, World.
Welcome to 30 Days of Code!
ну, пробел лишний
а пажди, может (printline “Hello, World.”) (read-line) ?
println точнее
Этот auth-token
со временем экспайрится, и его нужно обновлять, поэтому сделать вместо атома Delay
не получится.
Можно, конечно, запихнуть в атом Delay
, когда токен экспайрится -- заменять его на новый Delay
и получать значение через @@auth-token
, но это как-то уж слишком извращённо.
а он когда экспайрится в nil превращается?
@kronos_vano: Нет. это в другом месте обрабатывается.
А почему тут (constantly (token)) а не просто token
объясните мне)
@kronos_vano: Потому что swap!
принимает функцию.
точно
Но обновлять этот токен нужно только одному потоку, остальные должны ждать, если кто-то её обновляет.
Ну вот ситуация - токен заэкспайрился, три потока долбятся, решили обновить и втроём на неё vreset!
.
т.е. если ты get-auth вызовешь в нескольких потоках - у тебя каждый поток получит свой токен и будет гонка
@(swap! auth-token (fn [delayed-token] (if delayed-token delayed-token (delay (do-auth)))))
delay тут нужен, потому что swap может вызвать do-auth несколько раз, в случае когда несколько потоков паралельно делают swap
Поток 1 делает deref()
, f.invoke(v)
. Поток 2 делает deref()
, f.invoke(v)
. У обоих v
-- это null
.
Потом первый делает CAS, меняет. Второй делает CAS, обламывается, делает deref()
, f.invoke(v)
уже с ненулевым аргументом и выходит.
Тут же нет нигде блокировки, поэтому второй поток может вызвать deref()
до того, как первый сделает state.compareAndSet
.
А у второго потока delayed-token
будет не-`nil` только после того, как первый вызовет state.compareAndSet
Трейс простой: #1 Object v = deref(); #2 Object v = deref(); #1 Object newv = f.invoke(v); #2 Object newv = f.invoke(v);
Вот, здесь два потока, оба вызывают deref()
, оба получают nil
, оба вызывают коллбэк.
@(swap! auth-token (fn [delayed-token] (if delayed-token delayed-token (delay (do-auth)))))
Я как раз про это писал, но не дошло, что без этого не обойтись https://clojurians.slack.com/archives/clojure-russia/p1459694477002286
@(swap! auth-token (fn [delayed-token] (if delayed-token delayed-token (delay (do-auth)))))
чет мне грустно от этого почему такая нередкая задача как сделать некоторое io единожды конкурентно решается так хитро?такое ощущение, что с обычным try-lock-finally-release оно как бы проще или дело привычки?
дак грустного мне кажется не так много ибо можно вынести в функцию без проблем и переиспользовать
подскажите плз, у меня из бд прилетает такая струкутра [{:t1_id 1 :t2_id 1} {t1_id 1 :t2_id 2}] (one to many relation), я хочу это переколбасить в [{:t1_id 1 :t2 [{:t2_id 1} {t2_id 2}]}], как это сделать по нормальному?
а как у тебя прилетает [:t1_id, :t2_id]? у меня точно такая же проблема была недавно. только мне прилетало [:id_1 :id_2]. clojure.java.jdbc, если повторяется имя поля, просто индекс добавляет же.
круто, если бы туда можно было передавать функцию от metadata для того, чтобы кастомные ключи делать, типа [:table_name :column_name], а по ним уже группировать.
я для этого накидал такую штуку, но это сыро и только one-to-one – https://gist.github.com/konukhov/0c45001270ef7c76f3d6a062b32ebe0f
а недавно видел в гугл группе, чувак сделал маппер тоже. но мне не нравятся все эти defentity, как в korma, и так далее. ща попробую найти ссылку
ну она очень хочет на active_record какой-то быть похожей, что кажется неправильным – можно проще
а в jdbc вот где проблема – https://github.com/clojure/java.jdbc/blob/master/src/main/clojure/clojure/java/jdbc.clj#L376 дали бы возможность сюда кастомные штуки передавать, было бы намного проще
а, вот эта либа. https://github.com/netizer/relational_mapper. опять же, навязывает использовать все эти find-all, а хочется чистый jdbc. @niquola писал, что honeysql использует – ты как эту проблему решаешь?
в тред призывается @niwinz c https://github.com/funcool/clojure.jdbc
о, раз уж @niwinz позвали - а кто где реально использует http://funcool.github.io/cats/latest/?)
я просто никак не могу понять, как понимание всяких моноидов, монад и семигруп помогает в реальном мире. да, у нас есть future/promise и другие вещи, которые концептуально похожи на монады или функторы и т.д, но когда ты пишешь код - ты реально думаешь - “а здесь я сделаю свою монаду”?
просто почти все концепции, которые в итоге приводят, как примеры монад, в итоге можно использовать (или уже используют) без какого-либо упоминания слова “монада”
that provides some sugar syntax and protocol based abstraction for monadic abstraction
I just wonder - whether understanding of the core principles behind all those abstractions would really make me a better developer
I see that those concepts came from math and in theory you can make some proofs or rely on other proofs about that when you are building an app, but is there anything else that I’m missing?
No, it is so. Some languages enforces some things that makes mandatory using monads (haskell) but other not.
that later you will use that knowlege for other thing coding it in less generic way....
I learn a lot from writing that, and now in most of my projects I'm using only the needed part (usually not including cats as a library) but just use the concepts when I need them
I’ve talked to a lot of scala devs and usually I get similar responses - “I feel that they are useful, but I can’t tell you why” or “I justr truly believe, they are very useful, but in reality I can point only to some concrete cases - like Optional or Future"
This is not right at least not completly right. More advanced monad/free monad abstractions allow create very interesting compositions
@niwinz: heh, saw the talk about Muse, and see Alexey Kachayev in contributors. what did you do differently from muse?
urania is based on the initial work on Muse by Alexey Kachayev. It is also heavily inspired by:
Unless you've been living under a rock, you know functional programming is all the rage among the so-called alpha geeks.
Вона кто мы, прям альфа-самцы почти 😄Ну вообще так то в тему:
Any halfway decent programmer can quickly glean the general intent of most imperative code -- even in a language he or she has never seen. While you can certainly figure out what functional routines do by looking at them, it may not be possible in a glance. Unlike imperative code, functional code doesn't map to simple language constructs. Rather, it maps to mathematical constructs.
A component that can contain other components is constructed with the parentComponent function: type ParentComponentSpec s s' f f' g p = { render :: s -> ParentHTML s' f f' g p , eval :: Natural f (ParentDSL s s' f f' g p) , peek :: forall x. Maybe (ChildF p f' x -> ParentDSL s s' f f' g p Unit) }
wrk -c 10000 -t 10 -d 60
Running 1m test @
10 threads and 10000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 304.49ms 117.47ms 1.31s 80.86%
Req/Sec 177.81 146.39 1.03k 70.34%
92827 requests in 1.00m, 1.28GB read
Socket errors: connect 8991, read 1200, write 1, timeout 33
Requests/sec: 1545.17
Transfer/sec: 21.82MB
@fxposter: Интересная либа, юзаешь где? Похоже на ом
кстати - а можете накидать истинно функциональные UI фреймворки на подобие этого? У меня зачесалось и захотелось осчастливить этот мир еще одним наиболее православным подходом к построению UI
наподобие вот этого мож чо есть https://www.youtube.com/watch?v=ajX09xQ_UEg ?
@artemyarulin: оно скорее похоже на Elm, и оно все на базе virtual dom, так что они все по одному принципу построены… почти. за исключением того, что у типизированных ФПшных вариантов куча ограничений, которые меня чутка пугают я вот думаю для одного проекта на работе попробовать поюзать cljs или elm или purescript. хочется elm или purescript, но страшно в эти дебри залазить
elm мне чем не нравиться - вроде бы язык, но в тоже время Elm Architecture и вроде фреймворк, слишком много из коробки и сразу, all in
ааа, ну ок - не прально понял значит
а в чем разница тада elm VS pureScript?
и какой-нить vs GHCJS вообще?
не знаю, что такое GHCJS, но “хаскель для JS” - это в принципе “чужеродная” штука, а elm/purescript делаются с мыслью о взаимодействии с JS
а можно сказать что это диалекты хаскеля? Как понимаю языки то похоже?
ок, спс
у нас в конторке все помещански - взяли TypeScript и пишут в жава стайле, класики, синглтоны, сервисы и моки, грусть-печаль