Hi Ali, For usage please look at the commit which introduced that code (or search current Dirac code base): https://github.com/binaryage/dirac/commit/cce56470975a287c0164e6f79cd525d6ed27a543 https://github.com/binaryage/dirac/search?q=chunkify&type=Code&utf8=%E2%9C%93
Further explanation: My theory is that the go-macro can handle only limited complexity under ClojureScript. When you hit that threshold the ClojureScript compiler ends up entering infinite recursion. In my code the threshold was 18 async operations (<!) inside a single go block. A workaround was to break complex go block at hand into multiple smaller go blocks nested in a newly introduced parent go block. That is what chunkify macro does - it rewrites existing code to series of nested go blocks. I think this bug is triggered by a specific way how go-macro rewrites the form. At some point it is probably emitting an apply call which triggers CLJS-365. This bug has been unresolved because almost nobody is writing go blocks so complex to hit this problem. But I might be absolutely wrong with this theory. I didn't really dive deep and investigate the real cause. good luck, Antonin On Wednesday, March 21, 2018 at 5:33:00 AM UTC+1, [email protected] wrote: > > Hi Antonin, > > Thank you for the explanation and links. While the workaround that Moe > suggested does indeed remove all occurrences of the issue, is this > chunkify macro something that should be used somewhere in code, and if so > do you know how? > > Best, > Ali > > On Tuesday, March 20, 2018 at 8:41:44 PM UTC+5:30, Antonin Hildebrand > wrote: >> >> Hi Ali, >> >> I believe I encountered the same issue. And believe it is a bug in cljs >> compiler related to https://dev.clojure.org/jira/browse/CLJS-365. >> >> >> https://github.com/binaryage/dirac/blob/5a373e11d5d03d7057769d170f2599117dbae4b0/src/automation/dirac/automation.clj#L27-L39 >> >> <https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fbinaryage%2Fdirac%2Fblob%2F5a373e11d5d03d7057769d170f2599117dbae4b0%2Fsrc%2Fautomation%2Fdirac%2Fautomation.clj%23L27-L39&sa=D&sntz=1&usg=AFQjCNGtEMGxX2Yrm8O-tUccvvNscTtW2Q> >> >> regards, >> Antonin >> >> >> On Tuesday, March 20, 2018 at 11:34:29 AM UTC+1, [email protected] wrote: >>> >>> Moe, >>> >>> Great news: replacing cond with case got rid of the issue in all the >>> cases I mentioned. Like you I can't explain it either but it's good to know >>> there is a workaround. Thank you! >>> >>> Cheers, >>> Ali >>> >>> >>> On Tuesday, March 20, 2018 at 3:25:03 PM UTC+5:30, Moe Aboulkheir wrote: >>>> >>>> Ali, >>>> >>>> I don't have any colour on the underlying cause of the problem, but I'd >>>> be interested to know whether you see it with 'case' as well as 'cond', as >>>> I vaguely remember running into something like this (in cljs, only). >>>> >>>> Take care, >>>> Moe >>>> >>>> On Tue, Mar 20, 2018 at 7:33 AM, <[email protected]> wrote: >>>> >>>>> Hello, >>>>> >>>>> I'm running into a very strange issue which, having searched the web, >>>>> no one seems to have reported. >>>>> >>>>> In short, I have a go block similar to the following (simplified for >>>>> posting purposes, however I can post the full code if required): >>>>> >>>>> (go >>>>> (while true >>>>> (let [[cmd event-args] (<! mouse-chan)]] >>>>> ... >>>>> (cond >>>>> (= cmd :down) >>>>> (let [ ... ] ...) >>>>> >>>>> (= cmd :in) >>>>> (let [ ... ] ...) >>>>> >>>>> (= cmd :hover) >>>>> (let [ ... ] ...) >>>>> >>>>> (= cmd :handle-down) >>>>> (let [ ... ] ...) >>>>> >>>>> >>>>> ) >>>>> )) >>>>> >>>>> >>>>> Essentially I have a number of mouse handlers (mousedown, mouseup, >>>>> mouseover, mouseout, ...) which put! a [cmd event-args] vector onto >>>>> mouse-chan, which is subsequently taken in the above block. >>>>> >>>>> Generally speaking, the block compiles successfully, however under >>>>> certain conditions it just "breaks", specifically by producing a: >>>>> >>>>> java.lang.StackOverflowError >>>>> >>>>> during compilation. >>>>> >>>>> At present I have 4 branches within the cond block. Within one of >>>>> those branches I have a loop/recur which takes (via <!) from the same >>>>> channel as in the outermost block. This works absolutely fine until I try >>>>> one of the following, which results in the above compilation error: >>>>> >>>>> * adding a fifth branch >>>>> >>>>> * with just the 4 branches in place, if I add even something as simple >>>>> as the following expression: >>>>> >>>>> (when major-in >>>>> (major-in event-args)) >>>>> >>>>> where major-in is either a function or nil >>>>> >>>>> * and the strangest thing of all, if I simply use *map deconstruction* >>>>> at one point in one of the cond branches, I also get the same compilation >>>>> error: >>>>> >>>>> (let [{:keys [x y w h]} (rect-ent-layout ghost-rect) >>>>> ;; Even this doesn't work if I uncomment it and comment out >>>>> the previous >>>>> ;; {} () >>>>> >>>>> ] ...) >>>>> >>>>> but doing the following, which doesn't involve deconstruction, is fine: >>>>> >>>>> (let [stuff (rect-ent-layout ghost-rect) >>>>> x (:x stuff) >>>>> y (:y stuff) >>>>> w (:w stuff) >>>>> h (:h stuff)] ...) >>>>> >>>>> In terms of limitations on core.async go blocks, I am only aware of >>>>> the functional boundary limitation, namely that you cannot create >>>>> anonymous >>>>> functions within a go block which perform any puts/takes, asynchronous or >>>>> otherwise. Beyond that I can't find anything in the documentation which >>>>> would indicate that there are any other limitations. >>>>> >>>>> I am also aware that some macros do create functions, e.g. for, but I >>>>> am not using anything like that. >>>>> >>>>> I'm running a CLJS project with the following dependencies: >>>>> >>>>> [org.clojure/clojure "1.9.0-beta4"] >>>>> [org.clojure/clojurescript "1.9.946"] >>>>> [org.clojure/core.async "0.3.443"] >>>>> >>>>> I'm also using Reagent and developing using Figwheel. The Compilation >>>>> Error in fact is show in a Figwheel overlay. >>>>> >>>>> I have tried to isolate the issue but I can't seem to pinpoint what >>>>> exactly is causing it. >>>>> >>>>> Has anyone every come across something like this before when working >>>>> with core.async, specifically the java.lang.StackOverflowError >>>>> compilation error? If not, without posting the full code, can anyone >>>>> see anything with the above code which might cause such an issue? >>>>> >>>>> Thank you, >>>>> >>>>> Ali >>>>> >>>>> -- >>>>> 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 https://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 https://groups.google.com/group/clojurescript.
