Very educational. Thank you. Re Apples and Oranges. I had a sense of that l, but it does not mean that many people are not using core.async in the way Shaun documented in the gist. On many occasions, i have seen recommended by others the use of core.async for everything async including scenarios where it is not ideal. I think calling it core.csp would make it more clear as far as what its purpose is. I am not entirely sure about error handling with core.async but I've seen examples of async try/catch in that context. I see async/await, which is syntax sugar in es7 on top of Promise, as a more universal tool, which can be used to provide CSP functionality (see async-csp on github) or Promise like functionality (but much nicer to use than Promise)
Sent from my iPhone > On Sep 16, 2015, at 1:42 PM, Andrey Antukh <[email protected]> wrote: > > Hi! > > I think you are comparing apples with oranges. CSP and async/await can't be > compared directly. Async/await works with a promise (one value) abstraction > and csp works with channel abstraction (sequence). > > It seems is an anti-pattern use channels as promises because them does not > has the notion of error. I remember that Timothy Baldridge have said > something similar about this: > > "A sort of anti-pattern I see a lot is creating a lot of one-shot channels > and go blocks inside every function. The problem, as you see is that this > creates a lot of garbage. A much more efficient plan is to stop using > core.async as a RPC-like system, and start using it more like a dataflow > language: Identity data sources and sinks, and then transform and flow the > data between them via core.async. > > It's interesting to note that core.async started as something that looked a > lot like C#'s Async/Await, but that was dropped in favor of CSP pretty > quickly. So there's reasons why the language isn't optimized for this sort of > programming style. " > > Source: https://groups.google.com/d/msg/clojure/57ig0si3gUM/vRr-T1IaebUJ > > Without the intention to make spam, the funcool/cats > (https://github.com/funcool/cats) `mlet` macro does something similar in > semantics that async/await does. It there some examples using the ES6/7 > compatible promise library: > http://funcool.github.io/promesa/latest/#sugar-syntax > > The advantage about this solution is that is generic and can be extended to > other async related abstractions as: > - JDK8 CompletableFuture's > (https://github.com/funcool/promissum/blob/master/doc/content.adoc#26-promise-chaining) > > - manifold deferred > (https://github.com/funcool/cats/blob/master/doc/content.adoc#82-manifold-deferred) > - core.async channels > (https://github.com/funcool/cats/blob/master/doc/content.adoc#81-channel) > > Personally, I use core.async to compose different processes, but when I > interacting with async apis I almost always use promise abstraction with cats > sugar syntax. The promise abstraction semantics fits more properly in async > rpc calls that channels because it represents a "eventually available value" > and has the notion of error (unlikely core.async channels). > > Regards. > Andrey > >> On Wed, Sep 16, 2015 at 10:30 PM, Marc Fawzi <[email protected]> wrote: >> Thanks for that! >> async function baz() { await* [foo(), bar()]; } >> (defn baz [] (go (doseq [c [(foo) (bar)]] (<! c)))) >> With the core.async case you have to define the channel c, right? >> It looks cryptic compared to the es7 version. Like "go" what does go mean, >> seriously? I mean in terms of its English language context. Go does not >> convey async. And what the heck is <! Are we using bash or something? Some >> kind of inverted redirection? >> I guess you can have macros that would make it look just as comprehensible >> as the es7 async version so people coming into CLJS won't be turned off by >> the crazy looking syntax and the exposed low level semantics. Maybe a bunch >> of core.async macros that expose common use cases in a way that anyone can >> understand without even having to understand CSP basics. >> In my team, everyone gets the es7 version of things but despite having been >> CLJS users for 6 months now, no one understands how to use core.async. I've >> had to play with it in different languages before I realized how powerful it >> is to have in your toolset to manage complex (potentially dynamic) >> coordination patterns between async processes but our use cases in the UI >> have yet to beyond the very simple use cases your gist shows which are >> (without use of macros) much easier to understand using es7 async functions. >> If macros can solve the "comprehensibility" problem for the common use cases >> then maybe something that would provide es7 async like library for cljs that >> gives you defnasync and await >> Syntax and semantics can then be so simple while the underlying system >> remains so powerful and in that case you could have core.async be bundled >> with those macros thus allowing easy access to common async patterns without >> the Go syntax obfuscating things and making it seem complicated as well as >> too noisy syntax wise for the most common tasks >> >> >> Sent from my iPhone >> >>> On Sep 15, 2015, at 9:38 PM, Shaun LeBron <[email protected]> wrote: >>> >>> ES7 vs core.async (gist): >>> https://gist.github.com/shaunlebron/d231431b4d6a82d83628 >>> >>>> On Tuesday, September 15, 2015 at 3:51:06 PM UTC-5, marc fawzi wrote: >>>> Well the title gives that impression and I regret having chose to do that >>>> :) >>>> >>>> But if you read the content i am asking the question if Async functions in >>>> es7 can be used to build a performant and faithful version of CSP (github: >>>> aysnc-csp) and also be useful for common tasks like the simple server >>>> request scenario I mentioned then why wouldnt we want to think of CSP as >>>> just one pattern not the One True Pattern for async. Right now core.async >>>> is being used and or recommended for everything async and I am asking if >>>> that is ideal and if CLJS can allow itself to grow beyond this one >>>> particular pattern when it comes to async. The first thing would be >>>> renaming core.async to core.csp and promoting choice when it comes to >>>> async patterns. As it is right now, every time someone has an async design >>>> problem core.async is recommended as a solution regardless of whether or >>>> not it's the best fit solution. If you have a hammer... >>>> >>>> That's the scope. Not es7 vs core.async and I'm sorry for the stupid title. >>>> >>>> Sent from my iPhone >>>> >>>>> On Sep 15, 2015, at 8:32 AM, Johann Bestowrous >>>>> <[email protected]> wrote: >>>>> >>>>> At a high level, I think it's pretty important to note that you are >>>>> comparing a language spec to a library. >>>>> >>>>> -- >>>>> Note that posts from new members are moderated - please be patient with >>>>> your first post. >>>>> --- >>>>> You received this message because you are subscribed to the Google Groups >>>>> "ClojureScript" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send an >>>>> email to [email protected]. >>>>> To post to this group, send email to [email protected]. >>>>> Visit this group at http://groups.google.com/group/clojurescript. >>> >>> -- >>> Note that posts from new members are moderated - please be patient with >>> your first post. >>> --- >>> You received this message because you are subscribed to the Google Groups >>> "ClojureScript" group. >>> To unsubscribe from this group and stop receiving emails from it, send an >>> email to [email protected]. >>> To post to this group, send email to [email protected]. >>> Visit this group at http://groups.google.com/group/clojurescript. >> >> -- >> Note that posts from new members are moderated - please be patient with your >> first post. >> --- >> You received this message because you are subscribed to the Google Groups >> "ClojureScript" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at http://groups.google.com/group/clojurescript. > > > > -- > Andrey Antukh - Андрей Антух - <[email protected]> > http://www.niwi.nz > https://github.com/niwinz > -- > Note that posts from new members are moderated - please be patient with your > first post. > --- > You received this message because you are subscribed to the Google Groups > "ClojureScript" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/clojurescript. -- Note that posts from new members are moderated - please be patient with your first post. --- You received this message because you are subscribed to the Google Groups "ClojureScript" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/clojurescript.
