nervous-systems / eulalie

Asynchronous AWS client for Clojure & Clojurescript/Node
The Unlicense
86 stars 10 forks source link

Breaks with new core async #17

Closed robinheghan closed 8 years ago

robinheghan commented 8 years ago

Using the latest version of core.async, I get the following error: Can only recur from tail position

moea commented 8 years ago

You get this error in your code, or this error is thrown inside Eulalie? Do you have a stracktrace handy?

robinheghan commented 8 years ago

It is a compile error.

error {

:cause Can only recur from tail position :via [{:type clojure.lang.Compiler$CompilerException :message java.lang.UnsupportedOperationException: Can only recur from tail position, compiling:(eulalie/core.cljc:107:24) :at [clojure.lang.Compiler analyzeSeq Compiler.java 6730]} {:type java.lang.UnsupportedOperationException :message Can only recur from tail position :at [clojure.lang.Compiler$RecurExpr$Parser parse Compiler.java 6402]}] :trace [[clojure.lang.Compiler$RecurExpr$Parser parse Compiler.java 6402] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler access$300 Compiler.java 38] [clojure.lang.Compiler$LetExpr$Parser parse Compiler.java 6129] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$CaseExpr$Parser parse Compiler.java 8579] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$BodyExpr$Parser parse Compiler.java 5861] [clojure.lang.Compiler$LetExpr$Parser parse Compiler.java 6179] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler access$300 Compiler.java 38] [clojure.lang.Compiler$LetExpr$Parser parse Compiler.java 6129] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$BodyExpr$Parser parse Compiler.java 5861] [clojure.lang.Compiler$LetExpr$Parser parse Compiler.java 6179] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$BodyExpr$Parser parse Compiler.java 5861] [clojure.lang.Compiler$TryExpr$Parser parse Compiler.java 2261] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$BodyExpr$Parser parse Compiler.java 5861] [clojure.lang.Compiler$FnMethod parse Compiler.java 5296] [clojure.lang.Compiler$FnExpr parse Compiler.java 3925] [clojure.lang.Compiler analyzeSeq Compiler.java 6721] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$InvokeExpr parse Compiler.java 3737] [clojure.lang.Compiler analyzeSeq Compiler.java 6725] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$TryExpr$Parser parse Compiler.java 2232] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler access$300 Compiler.java 38] [clojure.lang.Compiler$LetExpr$Parser parse Compiler.java 6129] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$BodyExpr$Parser parse Compiler.java 5861] [clojure.lang.Compiler$FnMethod parse Compiler.java 5296] [clojure.lang.Compiler$FnExpr parse Compiler.java 3925] [clojure.lang.Compiler analyzeSeq Compiler.java 6721] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler access$300 Compiler.java 38] [clojure.lang.Compiler$LetExpr$Parser parse Compiler.java 6129] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$BodyExpr$Parser parse Compiler.java 5861] [clojure.lang.Compiler$FnMethod parse Compiler.java 5296] [clojure.lang.Compiler$FnExpr parse Compiler.java 3925] [clojure.lang.Compiler analyzeSeq Compiler.java 6721] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$InvokeExpr parse Compiler.java 3791] [clojure.lang.Compiler analyzeSeq Compiler.java 6725] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$BodyExpr$Parser parse Compiler.java 5861] [clojure.lang.Compiler$LetExpr$Parser parse Compiler.java 6179] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler access$300 Compiler.java 38] [clojure.lang.Compiler$LetExpr$Parser parse Compiler.java 6129] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$BodyExpr$Parser parse Compiler.java 5861] [clojure.lang.Compiler$LetExpr$Parser parse Compiler.java 6179] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler$BodyExpr$Parser parse Compiler.java 5861] [clojure.lang.Compiler$FnMethod parse Compiler.java 5296] [clojure.lang.Compiler$FnExpr parse Compiler.java 3925] [clojure.lang.Compiler analyzeSeq Compiler.java 6721] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyzeSeq Compiler.java 6711] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler access$300 Compiler.java 38] [clojure.lang.Compiler$DefExpr$Parser parse Compiler.java 577] [clojure.lang.Compiler analyzeSeq Compiler.java 6723] [clojure.lang.Compiler analyze Compiler.java 6524] [clojure.lang.Compiler analyze Compiler.java 6485] [clojure.lang.Compiler eval Compiler.java 6786] [clojure.lang.Compiler load Compiler.java 7227] [clojure.lang.RT loadResourceScript RT.java 371] [clojure.lang.RT loadResourceScript RT.java 362] [clojure.lang.RT load RT.java 446] [clojure.lang.RT load RT.java 412] [clojure.core$load$fn5448 invoke core.clj 5866] [clojure.core$load doInvoke core.clj 5865] [clojure.lang.RestFn invoke RestFn.java 408] [clojure.core$load_one invoke core.clj 5671] [clojure.core$load_lib$fn5397 invoke core.clj 5711] [clojure.core$load_lib doInvoke core.clj 5710] [clojure.lang.RestFn applyTo RestFn.java 142] [clojure.core$apply invoke core.clj 632] [clojure.core$load_libs doInvoke core.clj 5749] [clojure.lang.RestFn applyTo RestFn.java 137] [clojure.core$apply invoke core.clj 632] [clojure.core$require doInvoke core.clj 5832] [clojure.lang.RestFn invoke RestFn.java 930] [eulalie.sns$eval3321$loading5340auto__3322 invoke sns.cljc 1] [eulalie.sns$eval3321 invoke sns.cljc 1] [clojure.lang.Compiler eval Compiler.java 6782] [clojure.lang.Compiler eval Compiler.java 6771] [clojure.lang.Compiler load Compiler.java 7227] [clojure.lang.RT loadResourceScript RT.java 371] [clojure.lang.RT loadResourceScript RT.java 362] [clojure.lang.RT load RT.java 446] [clojure.lang.RT load RT.java 412] [clojure.core$load$fn5448 invoke core.clj 5866] [clojure.core$load doInvoke core.clj 5865] [clojure.lang.RestFn invoke RestFn.java 408] [clojure.core$load_one invoke core.clj 5671] [clojure.core$load_lib$fn5397 invoke core.clj 5711] [clojure.core$load_lib doInvoke core.clj 5710] [clojure.lang.RestFn applyTo RestFn.java 142] [clojure.core$apply invoke core.clj 632] [clojure.core$load_libs doInvoke core.clj 5749] [clojure.lang.RestFn applyTo RestFn.java 137] [clojure.core$apply invoke core.clj 632] [clojure.core$require doInvoke core.clj 5832] [clojure.lang.RestFn invoke RestFn.java 482] [fink_nottle.internal.sns$eval3315$loading5340auto____3316 invoke sns.cljc 1] [fink_nottle.internal.sns$eval3315 invoke sns.cljc 1] [clojure.lang.Compiler eval Compiler.java 6782] [clojure.lang.Compiler eval Compiler.java 6771] [clojure.lang.Compiler load Compiler.java 7227] [clojure.lang.RT loadResourceScript RT.java 371] [clojure.lang.RT loadResourceScript RT.java 362] [clojure.lang.RT load RT.java 446] [clojure.lang.RT load RT.java 412] [clojure.core$load$fn5448 invoke core.clj 5866] [clojure.core$load doInvoke core.clj 5865] [clojure.lang.RestFn invoke RestFn.java 408] [clojure.core$load_one invoke core.clj 5671] [clojure.core$load_lib$fn5397 invoke core.clj 5711] [clojure.core$load_lib doInvoke core.clj 5710] [clojure.lang.RestFn applyTo RestFn.java 142] [clojure.core$apply invoke core.clj 632] [clojure.core$load_libs doInvoke core.clj 5749] [clojure.lang.RestFn applyTo RestFn.java 137] [clojure.core$apply invoke core.clj 632] [clojure.core$require doInvoke core.clj 5832] [clojure.lang.RestFn invoke RestFn.java 436] [fink_nottle.sns$eval3309$loading5340auto____3310 invoke sns.cljc 1] [fink_nottle.sns$eval3309 invoke sns.cljc 1] [clojure.lang.Compiler eval Compiler.java 6782] [clojure.lang.Compiler eval Compiler.java 6771] [clojure.lang.Compiler load Compiler.java 7227] [clojure.lang.RT loadResourceScript RT.java 371] [clojure.lang.RT loadResourceScript RT.java 362] [clojure.lang.RT load RT.java 446] [clojure.lang.RT load RT.java 412] [clojure.core$load$fn5448 invoke core.clj 5866] [clojure.core$load doInvoke core.clj 5865] [clojure.lang.RestFn invoke RestFn.java 408] [clojure.core$load_one invoke core.clj 5671] [clojure.core$load_lib$fn5397 invoke core.clj 5711] [clojure.core$load_lib doInvoke core.clj 5710] [clojure.lang.RestFn applyTo RestFn.java 142] [clojure.core$apply invoke core.clj 632] [clojure.core$load_libs doInvoke core.clj 5749] [clojure.lang.RestFn applyTo RestFn.java 137] [clojure.core$apply invoke core.clj 632] [clojure.core$require doInvoke core.clj 5832] [clojure.lang.RestFn invoke RestFn.java 805] [episode_next.tasks$eval3303$loading5340auto____3304 invoke tasks.clj 1] [episode_next.tasks$eval3303 invoke tasks.clj 1] [clojure.lang.Compiler eval Compiler.java 6782] [clojure.lang.Compiler eval Compiler.java 6771] [clojure.lang.Compiler load Compiler.java 7227] [clojure.lang.RT loadResourceScript RT.java 371] [clojure.lang.RT loadResourceScript RT.java 362] [clojure.lang.RT load RT.java 446] [clojure.lang.RT load RT.java 412] [clojure.core$load$fn5448 invoke core.clj 5866] [clojure.core$load doInvoke core.clj 5865] [clojure.lang.RestFn invoke RestFn.java 408] [clojure.core$load_one invoke core.clj 5671] [clojure.core$load_lib$fn5397 invoke core.clj 5711] [clojure.core$load_lib doInvoke core.clj 5710] [clojure.lang.RestFn applyTo RestFn.java 142] [clojure.core$apply invoke core.clj 632] [clojure.core$load_libs doInvoke core.clj 5749] [clojure.lang.RestFn applyTo RestFn.java 137] [clojure.core$apply invoke core.clj 632] [clojure.core$require doInvoke core.clj 5832] [clojure.lang.RestFn invoke RestFn.java 805] [episode_next.db$eval978$loading5340auto____979 invoke db.clj 1] [episode_next.db$eval978 invoke db.clj 1] [clojure.lang.Compiler eval Compiler.java 6782] [clojure.lang.Compiler eval Compiler.java 6771] [clojure.lang.Compiler load Compiler.java 7227] [clojure.lang.RT loadResourceScript RT.java 371] [clojure.lang.RT loadResourceScript RT.java 362] [clojure.lang.RT load RT.java 446] [clojure.lang.RT load RT.java 412] [clojure.core$load$fn5448 invoke core.clj 5866] [clojure.core$load doInvoke core.clj 5865] [clojure.lang.RestFn invoke RestFn.java 408] [clojure.core$load_one invoke core.clj 5671] [clojure.core$load_lib$fn5397 invoke core.clj 5711] [clojure.core$load_lib doInvoke core.clj 5710] [clojure.lang.RestFn applyTo RestFn.java 142] [clojure.core$apply invoke core.clj 632] [clojure.core$load_libs doInvoke core.clj 5749] [clojure.lang.RestFn applyTo RestFn.java 137] [clojure.core$apply invoke core.clj 632] [clojure.core$require doInvoke core.clj 5832] [clojure.lang.RestFn invoke RestFn.java 457] [repl$eval14$loading5340auto__15 invoke repl.clj 1] [repl$eval14 invoke repl.clj 1] [clojure.lang.Compiler eval Compiler.java 6782] [clojure.lang.Compiler eval Compiler.java 6771] [clojure.lang.Compiler load Compiler.java 7227] [clojure.lang.RT loadResourceScript RT.java 371] [clojure.lang.RT loadResourceScript RT.java 362] [clojure.lang.RT load RT.java 446] [clojure.lang.RT load RT.java 412] [clojure.core$load$fn5448 invoke core.clj 5866] [clojure.core$load doInvoke core.clj 5865] [clojure.lang.RestFn invoke RestFn.java 408] [clojure.core$load_one invoke core.clj 5671] [clojure.core$load_lib$fn5397 invoke core.clj 5711] [clojure.core$load_lib doInvoke core.clj 5710] [clojure.lang.RestFn applyTo RestFn.java 142] [clojure.core$apply invoke core.clj 632] [clojure.core$load_libs doInvoke core.clj 5749] [clojure.lang.RestFn applyTo RestFn.java 137] [clojure.core$apply invoke core.clj 632] [clojure.core$require doInvoke core.clj 5832] [clojure.lang.RestFn invoke RestFn.java 408] [user$eval5 invoke form-init2936256088395689051.clj 1] [clojure.lang.Compiler eval Compiler.java 6782] [clojure.lang.Compiler eval Compiler.java 6771] [clojure.lang.Compiler eval Compiler.java 6771] [clojure.lang.Compiler load Compiler.java 7227] [clojure.lang.Compiler loadFile Compiler.java 7165] [clojure.main$load_script invoke main.clj 275] [clojure.main$init_opt invoke main.clj 280] [clojure.main$initialize invoke main.clj 308] [clojure.main$null_opt invoke main.clj 343] [clojure.main$main doInvoke main.clj 421] [clojure.lang.RestFn invoke RestFn.java 421] [clojure.lang.Var invoke Var.java 383] [clojure.lang.AFn applyToHelper AFn.java 156] [clojure.lang.Var applyTo Var.java 700] [clojure.main main main.java 37]]}

moea commented 8 years ago

Thanks! It looks like the case statement there is somehow getting macroexpanded in some regressive & unanticipated way. I have no idea how core.async is playing into this, but I can confirm that just changing the dependency version is enough to trigger the compilation error. It continues to look like a tail call to me, but I guess I'm not a compiler.

In any case, I pushed 0.6.3-SNAPSHOT, which just changes the case to a cond Can you let me know if you get on any better with that? (e.g. by excluding the transitive eulalie dependency via your fink-nottle vector, and directly depending on 0.6.3-SNAPSHOT)? I tried it out a little here - if it works out for you, I'll release and update the dependent projects.