<< Back to previous view

[CLJS-1553] browser repl "EOF while reading string" when evaluating symbol "enable-console-print!" Created: 28/Jan/16  Updated: 08/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Scott Bale Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: repl
Environment:

On client side: Chrome browser (47.0.2526.111) On Mac OS 10.10.5 Yosemite

On server side:

  • Amazon EC2 instance running amazon linux

java -version
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)


Attachments: GZip Archive cljs-hello-world.tar.gz    

 Description   

Just playing around in the browser repl, running through the CLJS quickstart, I happened upon this. I crashed the repl by attempting to evaluate enable-console-print!.

Below is output of my repl. As you can see, I can doc, source, or even invoke the function, but if I try to simply evaluate the symbol, the repl crashes with a Java runtime exception. (I was expecting the repl to output a toString representation of the enable-console-print! function object, as it would for any other symbol that resolves to a function.)

I've attached a .tar.gz file of my project, but I excluded the cljs.jar file from the root. (The IP address in core.cljs is the public IP address of the ec2 instance I was using.)

The command I used to start the repl is:

java -cp cljs.jar:src clojure.main repl.clj

REPL output:

cljs.user=> (doc enable-console-print!)
-------------------------
cljs.core/enable-console-print!
([])
  Set *print-fn* to console.log
nil
cljs.user=> (source enable-console-print!)
(defn enable-console-print!
  "Set *print-fn* to console.log"
  []
  (set! *print-newline* false)
  (set! *print-fn*
    (fn [& args]
      (.apply (.-log js/console) js/console (into-array args))))
  (set! *print-err-fn*
    (fn [& args]
      (.apply (.-error js/console) js/console (into-array args))))
  nil)
nil
cljs.user=> (enable-console-print!)
nil
cljs.user=> enable-console-print!
Exception in thread "Thread-138" java.lang.RuntimeException: EOF while reading string
        at clojure.lang.Util.runtimeException(Util.java:221)
        at clojure.lang.LispReader$StringReader.invoke(LispReader.java:525)
        at clojure.lang.LispReader.read(LispReader.java:263)
        at clojure.lang.LispReader.readDelimitedList(LispReader.java:1200)
        at clojure.lang.LispReader$MapReader.invoke(LispReader.java:1158)
        at clojure.lang.LispReader.read(LispReader.java:263)
        at clojure.lang.LispReader.read(LispReader.java:196)
        at clojure.lang.LispReader.read(LispReader.java:185)
        at clojure.lang.RT.readString(RT.java:1821)
        at clojure.lang.RT.readString(RT.java:1816)
        at clojure.core$read_string.invoke(core.clj:3663)
        at cljs.repl.server$dispatch_request.invoke(server.clj:148)
        at cljs.repl.server$handle_connection.invoke(server.clj:157)
        at cljs.repl.server$server_loop$fn__5056.invoke(server.clj:167)
        at clojure.core$binding_conveyor_fn$fn__4444.invoke(core.clj:1916)
        at clojure.lang.AFn.run(AFn.java:22)
        at java.lang.Thread.run(Thread.java:745)


 Comments   
Comment by Mike Fikes [ 31/Jan/16 8:34 PM ]

I tried reproducing with the attached cljs-hello-world.tar.gz, revising the IP address to be localhost, and running everything on my local Mac with Chrome 48.0.2564.97, and I was unable to repro.

Perhaps, since this involved a network connection between AWS and your local Mac, the connection was closed during the phase when it was reading the response? In other words, I wonder if this is reproducible in general or was just a connectivity outage.

Comment by Scott Bale [ 08/Feb/16 8:33 PM ]

Thanks for checking on that Mike. I'm also unable to reproduce the crash if I run my example locally on a macbook pro (Chrome 48.0.2564.97 also; Mac's Java 8 build 1.8.0_65-b17).

However, the original behavior I'm seeing is not sporadic; it is reproducible 100% of the time. I was able to reproduce it again just now. So I guess the next step would be for me to build a debug version of cljs.jar which provides some insight into what is tripping up the LispReader$StringReader.





[CLJS-1563] :source-map option to cljs.build.api/build should take nil Created: 07/Feb/16  Updated: 08/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.48
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Isaac Cambron Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

It should be possible to specify nil or false when providing the :source-map option to cljs.build.api/build, for example, like this:

(build {...
        :optimizations :whitespace
        :source-map (when debug? "somepath.js.map")})

Currently that causes:

Exception in thread "main" java.lang.AssertionError: Assert failed: :source-map nil must specify a file in the same directory as :output-to "target/js/zs-background.js" if optimization setting applied
(or (nil? (:output-to opts)) (:modules opts) (string? source-map)), compiling:(/Users/isaac/code/zensight/client/cljs/build.clj:66:1)

Using false has the same behavior. The alternative of conditionally assoc ing the key in works just fine, but is a tad awkward. It seems reasonably straightforward to fix - need to change that assert to check the value in the map and double-check that it's checked properly downstream. Happy to submit a patch if you'll take it.



 Comments   
Comment by Isaac Cambron [ 07/Feb/16 10:18 AM ]

Apologies for the formatting; forgot that backtick stuff doesn't work in Jira.

Comment by Mike Fikes [ 08/Feb/16 5:05 PM ]

Reformatted description.





[CLJS-1565] Self-host: whitespace optimization is broken Created: 08/Feb/16  Updated: 08/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Yehonathan Sharvit Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: bootstrap, bug


 Description   

When requiring `cljs.js` and compiling in `:optimizations :whitespace`
I get the following error in the browser:
"goog.require could not find: cljs.core$macros"

And the page is broken.



 Comments   
Comment by Mike Fikes [ 08/Feb/16 6:09 AM ]

I wonder if the description is sufficient to repro.

I'd recommend checking if CLJS-1541 fixes this.

Comment by Yehonathan Sharvit [ 08/Feb/16 6:45 AM ]

@mike CLJS-1541 doesn't fix this.





[CLJS-1318] Fix typo in documentation of `specify` Created: 22/Jun/15  Updated: 08/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 0.0-3308
Fix Version/s: None

Type: Enhancement Priority: Trivial
Reporter: Yehonathan Sharvit Assignee: Unassigned
Resolution: Completed Votes: 0
Labels: docstring

Attachments: Text File CLJS-1318.patch     Text File patch.txt    
Patch: Code

 Description   

Fix typo in documentation of `specify`



 Comments   
Comment by Yehonathan Sharvit [ 22/Jun/15 6:27 AM ]

here is a patch that fixes the doc of `specify`

Comment by Mike Fikes [ 31/Jan/16 3:07 PM ]

Hey Yehonathan, the patch attached to this ticket isn't in the correct format. See https://github.com/clojure/clojurescript/wiki/Patches

Comment by Yehonathan Sharvit [ 01/Feb/16 12:40 AM ]

Attach a patch with the appropriate format

Comment by Mike Fikes [ 01/Feb/16 5:32 PM ]

LGTM and patch applies cleanly.

Comment by David Nolen [ 04/Feb/16 3:55 PM ]

Applied thanks, Yehonathan please remember to send in your CA thanks.

Comment by Mike Fikes [ 04/Feb/16 8:42 PM ]

Confirmed fixed with cljs.jar and downstream bootstrap.

Comment by Yehonathan Sharvit [ 08/Feb/16 12:58 AM ]

@david CA signed.





[CLJS-1564] Self-host: cached macro *loaded* update Created: 07/Feb/16  Updated: 07/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Mike Fikes Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-1564.patch    
Patch: Code and Test

 Description   

When using cljs.js/require, the cljs.js/*loaded* atom is updated reflecting loaded namespaces. When loading a cached macro namespace, the non-macros namespace name is added to the *loaded* set.

Minimal repo, with script/noderepljs:

$ script/noderepljs 
ClojureScript Node.js REPL server listening on 52507
To quit, type: :cljs/quit
cljs.user=> (require '[cljs.js :as cljs])
nil
cljs.user=> ;; Load a macros namespace
cljs.user=> (cljs/require
  {}
  'foo.core
  :reload-all
  {:macros-ns true
   :load      (fn [_ cb] (cb {:lang   :clj
                              :source "(ns foo.core)"}))
   :eval      (constantly nil)}
  (fn [_]
    (prn @cljs/*loaded*)))
#{foo.core$macros}
nil
cljs.user=> ;; Do the same again, but return cached js
cljs.user=> (cljs/require
  {}
  'foo.core
  :reload-all
  {:macros-ns true
   :load      (fn [_ cb] (cb {:lang   :js
                              :source ""}))
   :eval      (constantly nil)}
  (fn [_]
    (prn @cljs/*loaded*)))
#{foo.core}
nil
cljs.user=> ;; Note that *loaded* now has #{foo.core}


 Comments   
Comment by Mike Fikes [ 07/Feb/16 10:44 PM ]

This was a simple oversight with the changes made for CLJS-1504: One spot was missed in the places where name needed to be converted to aname.

With this change, the repo in the description goes away and the included additional unit tests covering *loaded* pass.

Additionally in a downstream cljs.js client, where a regular namespace refers several symbols from a cached macros namespace, it can be seen that loading of the cached namespace occurs once and only once, as opposed to an additional time for each referred symbol as :use-macros is being processed.





[CLJS-1562] WARN on hinted fn call type mismatch Created: 06/Feb/16  Updated: 06/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Enhancement Priority: Major
Reporter: Mike Fikes Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

If a call is made to a function that has hinted arguments (especially {^boolean} and {^number}), with an expression that is known to not be of that type, emit a diagnostic type mismatch warning.

An example that should emit a warning is:

(defn f [^boolean b])
(f 0)





[CLJS-1561] WARN if recur passes non-inferred type Created: 06/Feb/16  Updated: 06/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Mike Fikes Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File CLJS-1561.patch    
Patch: Code

 Description   

Take this code as an example:

(defn f [^boolean b]
  (loop [x b]
    (if x
      (recur 0)
      :done)))

The type of x is inferred to be Boolean, but there is a recur form that can be statically deduced to be passing a non-Boolean.

This ticket asks that a WARN be issued for this case, and perhaps others (where maybe x itself is directly type hinted).



 Comments   
Comment by Mike Fikes [ 06/Feb/16 2:59 PM ]

Attached a patch which warns on for the case of boolean and number, since those two types have special handling.

Some example usage:

cljs.user=> (defn f [^boolean b]
       #_=>   (loop [x b]
       #_=>     (if x
       #_=>       (recur 0)
       #_=>       :done)))
WARNING: recur target parameter x has inferred type boolean, but being passed type number at line 4 
#'cljs.user/f
cljs.user=> (loop [x 1 y true z :hi]
       #_=>   (when false (recur 'a "hi" nil)))
WARNING: recur target parameter x has inferred type number, but being passed type cljs.core/Symbol at line 2 
WARNING: recur target parameter y has inferred type boolean, but being passed type string at line 2 
nil
cljs.user=> (loop [x 1 y true]
       #_=>  (when false (recur nil nil)))
WARNING: recur target parameter x has inferred type number, but being passed type clj-nil at line 2 
WARNING: recur target parameter y has inferred type boolean, but being passed type clj-nil at line 2 
nil
cljs.user=> (loop [x 1]
       #_=>   (let [y (inc x)]
       #_=>     (when false (recur (inc y)))))
nil
cljs.user=> (loop [b true]
       #_=>   (when false (recur (inc 1))))
WARNING: recur target parameter b has inferred type boolean, but being passed type number at line 2 
cljs.user=> (loop [x 1] 
       #_=>   (inc x) 
       #_=>     (when false (recur :hi)))
WARNING: recur target parameter x has inferred type number, but being passed type cljs.core/Keyword at line 3 
nil
cljs.user=> (loop [x :hello] 
       #_=>   (inc x) 
       #_=>     (when false (recur :hi)))
WARNING: cljs.core$macros/+, all arguments must be numbers, got [cljs.core/Keyword number] instead. at line 2 
nil




[CLJS-485] clojure.string/replace ignores regex flags Created: 12/Mar/13  Updated: 06/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Esa Virtanen Assignee: Unassigned
Resolution: Unresolved Votes: 2
Labels: bug, patch, test

Attachments: Text File 0001-Take-regex-flags-m-i-into-account-in-clojure.string-.patch     Text File CLJS-485.patch    
Patch: Code and Test

 Description   

The replace function in namespace clojure.string ignores regex flag provided in the match pattern. For example:

CLJS
clojure.string/replace "I am NOT matched" #"(?i)not " "")
=> "I am NOT matched"
CLJ
clojure.string/replace "I am NOT matched" #"(?i)not " "")
=> "I am matched"

The attached patch fixes this by parsing the m and i flags, if set, from the match object, instead of explicitly setting only "g".



 Comments   
Comment by Chas Emerick [ 19/Mar/14 9:29 AM ]

I can confirm the bug. The attached patch applies cleanly, and works as expected.

Esa, sorry for the long delay (this one must have slipped through the cracks)! Could you please submit a contributor's agreement, so that your patch can be merged? More info is here:

http://clojure.org/contributing

Comment by lvh [ 26/Jul/15 5:56 PM ]

I got bit by this bug. Working on figuring out if I can sign that agreement.

Comment by lvh [ 27/Jul/15 11:55 AM ]

This is a duplicate of CLJS-794.

Comment by Jake McCrary [ 04/Feb/16 6:58 PM ]

This patch changes string/replace-all to respect flags that were set on regexp passed as an argument.

I originally attached this to CLJS-794 and then noticed there was this older issue. I was unable to figure out how to edit at ticket to mark the patch as having "Code and Test" so I'm adding it to this issue instead.

I've signed a contributors agreement.

Comment by Mike Fikes [ 04/Feb/16 9:31 PM ]

There is a "sticky" flag y that could be conveyed.

http://www.ecma-international.org/ecma-262/6.0/index.html#sec-get-regexp.prototype.sticky

Comment by Jake McCrary [ 06/Feb/16 10:50 AM ]

Reading a bit more about it and looks like both 'u' and 'y' are newly supported in ECMA6. Is there a way to write tests that exercise this functionality? I've got changes locally to get support of 'y' but felt the need to write a test for it (as its a bit more complicated than simply looking for a flag) and am hung up on having EMCA6 support while running the tests.

I'm actually wondering if having 'u' and 'y' in there is a bit premature. Any guidance on whether adding code for 'u' and 'y' should be done (or removing 'u' from my patch) or testing ClojureScript with ECMAScript 6 support?

Comment by Mike Fikes [ 06/Feb/16 12:51 PM ]

One thought: Whatever this is exercising passes on recent versions of V8, JavaScriptCore, SpiderMonkey, Nashorn, and ChakraCore: https://github.com/clojure/clojurescript/blob/628d957f3ecabf8d26d57665abdef3dea765151e/src/test/cljs/cljs/core_test.cljs#L1472

It does seem tricky to write a robust RegExp clone implementation, and if you do some googling you see people dealing with u and y as special cases. The patch seemed OK to me with respect to this, but I'm not a JavaScript expert.





[CLJS-970] assert - generate Error string when compiling Created: 10/Jan/15  Updated: 06/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Trivial
Reporter: Thomas Heller Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File cljs-970.patch    
Patch: Code

 Description   

Currently when using assert in CLJS the assert macro will generate the assert error message through CLJS. We can do that in CLJ which reduces the amount of code generated.

(let [bar 1]
  (assert (string? bar)))

Currently generates

if(typeof bar_11332 === 'string'){
} else {
throw (new Error([cljs.core.str("Assert failed: "),cljs.core.str(cljs.core.pr_str.call(null,cljs.core.list(new cljs.core.Symbol(null,"string?","string?",-1129175764,null),new cljs.core.Symbol(null,"bar","bar",254284943,null))))].join('')));
}

But could generate

if(typeof bar_23183 === 'string'){
} else {
throw (new Error("Assert failed: (string? bar)"));
}

Attached patch does that.



 Comments   
Comment by Thomas Heller [ 12/Jan/15 9:16 AM ]

Forgot to account for the fact that

(assert (string? something) "this might not be a string"))

New patch only generates the string of the form when compiling.

Comment by Mike Fikes [ 02/Feb/16 5:47 PM ]

Hey Thomas, the attached patch no longer applies.

I can confirm that if you make the same changes in master, they work there, and also in bootstrapped ClojureScript.

Comment by Thomas Heller [ 06/Feb/16 6:38 AM ]

Updated patch.

Comment by Mike Fikes [ 06/Feb/16 9:24 AM ]

I tested this patch, trying it with downstream `cljs.js` client, and it is working for me.





[CLJS-1541] Self-host: Cannot require 'cljs.js using cljs.jar Created: 10/Jan/16  Updated: 06/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Mike Fikes Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: bootstrap
Environment:

Affects 1.7.228 and earlier


Attachments: Text File CLJS-1541.patch    
Patch: Code

 Description   

If you use script/noderepljs you can (require 'cljs.js) but not with the shipping JAR:

$ java -jar cljs.jar -m cljs.repl.node
ClojureScript Node.js REPL server listening on 56432
To quit, type: :cljs/quit
cljs.user=> (require 'cljs.js)
WARNING: Use of undeclared Var cljs.core/defmacro at line 99 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/-> at line 99 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 104 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 104 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/forms at line 104 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 105 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/forms at line 105 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 115 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/->> at line 115 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 120 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 120 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/forms at line 120 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 121 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/forms at line 121 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 131 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/.. at line 131 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 145 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/form at line 145 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 145 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/form at line 145 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 146 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/form at line 146 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 146 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 146 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 146 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/form at line 146 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 146 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 149 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/comment at line 149 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 151 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 151 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 154 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/cond at line 154 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 160 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 160 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 161 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 166 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 163 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 164 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 162 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 169 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/declare at line 169 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 171 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/names at line 171 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/names at line 171 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 174 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/doto at line 174 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 180 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 180 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/forms at line 180 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 182 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/forms at line 187 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 207 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/extend-protocol at line 207 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/p at line 242 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 242 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/specs at line 242 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/p at line 243 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/specs at line 243 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 265 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fn at line 265 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 273 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sigs at line 273 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sigs at line 274 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sigs at line 274 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sigs at line 275 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sigs at line 275 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&form at line 324 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 327 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/defn- at line 327 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 329 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/decls at line 329 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/decls at line 330 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 333 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/if-let at line 333 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 338 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/then at line 338 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 339 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/then at line 339 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 340 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/then at line 340 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/else at line 340 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 340 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/oldform at line 340 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 345 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 345 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/then at line 349 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/else at line 350 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 353 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/if-not at line 353 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/test at line 356 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/then at line 356 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/test at line 356 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/then at line 356 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/test at line 357 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/then at line 357 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/else at line 357 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/test at line 358 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/then at line 358 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/else at line 358 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 361 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/letfn at line 361 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fnspecs at line 369 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 369 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 369 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fnspecs at line 370 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fnspecs at line 371 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 372 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 375 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/memfn at line 375 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 381 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/args at line 381 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/args at line 384 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/args at line 385 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 388 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/when at line 388 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/test at line 390 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 390 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 390 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 391 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/test at line 391 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 394 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/when-first at line 394 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 398 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 398 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 398 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 402 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 405 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 408 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/when-let at line 408 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 412 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 412 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 412 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 416 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 416 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 420 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 423 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/when-not at line 423 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/test at line 425 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 425 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 425 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 426 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/test at line 426 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 429 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/while at line 429 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/test at line 432 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 432 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 432 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/test at line 434 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 435 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 439 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/cond-> at line 439 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 444 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 444 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 444 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 445 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 448 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 449 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 453 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/cond->> at line 453 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 458 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 458 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 458 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 459 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 462 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 463 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 467 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/as-> at line 467 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 471 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 471 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/forms at line 471 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 472 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/forms at line 473 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 477 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/some-> at line 477 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 480 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 480 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/forms at line 480 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 483 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/forms at line 484 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 488 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/some->> at line 488 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 491 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 491 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/forms at line 491 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 494 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/forms at line 495 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 499 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/if-some at line 499 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 504 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/then at line 504 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 505 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/then at line 505 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 506 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/then at line 506 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/else at line 506 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 506 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/oldform at line 506 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 511 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 511 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/else at line 514 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/then at line 516 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 519 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/when-some at line 519 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 524 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 524 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 524 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 528 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 528 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 533 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 601 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/defonce at line 601 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 601 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/init at line 601 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 602 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 603 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/init at line 603 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 605 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/assert-args at line 605 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fnname at line 605 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 605 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/pairs at line 605 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/pairs at line 612 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fnname at line 614 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/pairs at line 614 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/pairs at line 615 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fnname at line 617 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 690 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/goog-define at line 690 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sym at line 704 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 704 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/assert-args at line 705 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/goog-define at line 705 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 706 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 707 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 708 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 709 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 706 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 707 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 708 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 709 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sym at line 710 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 712 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 713 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 714 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 714 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 714 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 714 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sym at line 716 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/default at line 718 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 720 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/let at line 720 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 726 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 726 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 726 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/assert-args at line 727 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/let at line 727 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 728 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 729 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 730 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 730 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 732 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/loop at line 732 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 736 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 736 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 736 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/assert-args at line 737 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/loop at line 737 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 738 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 739 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 740 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 741 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 742 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 742 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 743 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 744 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 754 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 781 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/str at line 781 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 781 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 781 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 782 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 785 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 795 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/and at line 795 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 801 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 801 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 802 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 802 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 803 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 804 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 805 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 810 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 813 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/or at line 813 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 819 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 819 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 820 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 820 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 821 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 822 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 823 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 828 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 831 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/nil? at line 831 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 831 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 832 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 835 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/coercive-not at line 835 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 835 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 836 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 839 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/coercive-not= at line 839 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 839 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 839 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 840 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 840 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 843 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/coercive-= at line 843 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 843 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 843 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 844 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 844 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 847 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/coercive-boolean at line 847 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 847 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 848 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 852 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/truth_ at line 852 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 852 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 853 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 854 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 854 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 857 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/js-arguments at line 857 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 860 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/js-delete at line 860 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/obj at line 860 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/obj at line 861 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 863 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/js-in at line 863 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/obj at line 863 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/obj at line 864 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 866 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/js-debugger at line 866 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 871 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/js-comment at line 871 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/comment at line 874 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/comment at line 875 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 885 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unsafe-cast at line 885 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/t at line 887 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 887 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/t at line 888 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 889 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 889 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 891 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/js-inline-comment at line 891 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/comment at line 893 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/comment at line 894 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 896 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/true? at line 896 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 896 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 897 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 899 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/false? at line 899 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 899 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 900 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 902 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/string? at line 902 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 902 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 903 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 906 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/exists? at line 906 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 909 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 912 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 914 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/undefined? at line 914 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 916 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 917 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 919 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/identical? at line 919 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 919 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/b at line 919 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/b at line 920 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 920 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 922 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/instance? at line 922 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/t at line 922 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/o at line 922 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/t at line 926 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/t at line 927 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/o at line 927 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/t at line 928 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/o at line 928 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 931 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/number? at line 931 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 931 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 932 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 934 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/symbol? at line 934 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 934 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 935 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 937 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/keyword? at line 937 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 937 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 938 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 940 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/aget at line 940 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 941 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/i at line 941 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/i at line 942 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 942 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 943 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/i at line 943 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 943 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idxs at line 943 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idxs at line 944 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 945 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/i at line 945 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idxs at line 945 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 947 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/aset at line 947 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 948 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/i at line 948 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/v at line 948 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/v at line 949 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/i at line 949 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 949 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 950 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx at line 950 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx2 at line 950 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 950 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idxv at line 950 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idxv at line 951 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 953 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx at line 953 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx2 at line 953 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idxv at line 953 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 955 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/+ at line 955 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 957 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 957 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 958 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 958 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 958 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 958 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 959 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 959 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 959 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 959 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 959 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 959 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 959 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 961 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/byte at line 961 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 961 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 961 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 962 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/short at line 962 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 962 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 962 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 963 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/float at line 963 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 963 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 963 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 964 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/double at line 964 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 964 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 964 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 966 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-byte at line 966 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 966 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 966 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 967 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-char at line 967 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 967 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 967 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 968 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-short at line 968 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 968 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 968 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 969 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-float at line 969 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 969 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 969 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 970 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-double at line 970 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 970 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 970 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 972 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-add at line 972 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 973 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 973 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 973 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 975 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-add-int at line 975 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 976 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 976 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 976 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 978 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-dec at line 978 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 979 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 979 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 981 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-dec-int at line 981 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 982 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 982 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 984 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-divide-int at line 984 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 985 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 985 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 985 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 987 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-inc at line 987 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 988 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 988 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 990 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-inc-int at line 990 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 991 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 991 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 993 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-multiply at line 993 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 994 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 994 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 994 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 996 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-multiply-int at line 996 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 997 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 997 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 997 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 999 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-negate at line 999 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1000 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1000 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1002 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-negate-int at line 1002 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1003 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1003 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1005 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-remainder-int at line 1005 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1006 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1006 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1006 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1006 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1008 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-subtract at line 1008 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1009 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 1009 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 1009 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1011 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unchecked-subtract-int at line 1011 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1012 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 1012 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 1012 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1014 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/- at line 1014 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1015 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1015 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1016 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1016 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1016 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1016 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1017 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1017 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1017 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1017 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1017 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1017 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1017 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1019 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/* at line 1019 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1021 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1021 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1022 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1022 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1022 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1022 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1023 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1023 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1023 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1023 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1023 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1023 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1023 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1025 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros// at line 1025 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1026 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1026 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1027 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1027 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1027 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1027 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1028 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1028 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1028 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1028 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1028 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1028 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1028 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1030 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/divide at line 1030 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1031 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1031 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1032 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1032 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1032 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1032 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1033 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1033 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1033 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1033 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1033 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1033 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1033 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1035 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/< at line 1035 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1036 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1037 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1037 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1037 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1037 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1038 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1038 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1038 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1038 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1038 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1038 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1038 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1038 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1040 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/<= at line 1040 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1041 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1042 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1042 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1042 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1042 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1043 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1043 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1043 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1043 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1043 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1043 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1043 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1043 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1045 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/> at line 1045 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1046 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1047 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1047 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1047 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1047 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1048 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1048 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1048 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1048 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1048 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1048 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1048 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1048 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1050 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/>= at line 1050 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1051 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1052 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1052 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1052 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1052 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1053 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1053 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1053 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1053 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1053 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1053 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1053 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1053 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1055 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/== at line 1055 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1056 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1057 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1057 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1057 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1057 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1058 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1058 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1058 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1058 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1058 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1058 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1058 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1058 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1060 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/dec at line 1060 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1060 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1061 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1063 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/inc at line 1063 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1063 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1064 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1066 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/zero? at line 1066 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1066 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1067 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1069 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/pos? at line 1069 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1069 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1070 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1072 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/neg? at line 1072 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1072 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1073 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1075 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/max at line 1075 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1076 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1076 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1077 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1077 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1077 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1077 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1079 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1079 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1079 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1079 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1079 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1079 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1079 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1081 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/min at line 1081 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1082 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1082 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1083 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1083 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1083 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1083 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1085 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1085 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1085 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1085 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1085 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1085 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1085 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1087 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/js-mod at line 1087 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/num at line 1087 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/div at line 1087 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/div at line 1088 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/num at line 1088 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1090 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bit-not at line 1090 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1090 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1091 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1093 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bit-and at line 1093 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1094 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1094 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1094 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1094 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1095 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1095 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1095 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1095 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1095 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1095 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1095 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1098 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unsafe-bit-and at line 1098 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1099 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1099 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1099 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1099 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1100 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1100 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1100 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1100 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1100 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1100 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1100 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1102 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bit-or at line 1102 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1103 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1103 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1103 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1103 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1104 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1104 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1104 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1104 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1104 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1104 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1104 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1106 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/int at line 1106 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1106 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1107 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1109 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bit-xor at line 1109 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1110 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1110 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1110 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1110 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1111 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1111 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1111 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1111 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1111 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1111 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1111 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1113 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bit-and-not at line 1113 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1114 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1114 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1114 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1114 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1115 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1115 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1115 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1115 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1115 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/y at line 1115 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/more at line 1115 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1117 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bit-clear at line 1117 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1117 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1117 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1118 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1118 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1120 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bit-flip at line 1120 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1120 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1120 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1121 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1121 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1123 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bit-test at line 1123 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1123 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1123 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1124 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1124 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1126 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bit-shift-left at line 1126 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1126 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1126 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1127 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1127 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1129 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bit-shift-right at line 1129 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1129 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1129 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1130 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1130 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1132 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bit-shift-right-zero-fill at line 1132 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1132 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1132 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1133 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1133 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1135 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/unsigned-bit-shift-right at line 1135 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1135 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1135 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1136 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1136 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1138 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bit-set at line 1138 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1138 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1138 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/n at line 1139 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1139 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1142 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/mask at line 1142 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/shift at line 1142 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/shift at line 1143 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1146 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bitpos at line 1146 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/shift at line 1146 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/shift at line 1147 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1150 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/caching-hash at line 1150 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/coll at line 1150 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/hash-fn at line 1150 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/hash-key at line 1150 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/hash-key at line 1151 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/hash-key at line 1152 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/hash-fn at line 1155 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/coll at line 1155 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/hash-key at line 1156 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1168 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/defcurried at line 1168 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/doc at line 1171 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/args at line 1171 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1171 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 1171 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/doc at line 1172 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/args at line 1172 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 1172 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1185 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/rfn at line 1185 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/f1 at line 1187 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/k at line 1187 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fkv at line 1187 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/f1 at line 1188 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/k at line 1188 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fkv at line 1188 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1216 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/reify at line 1216 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1254 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1254 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 1262 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 1263 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1273 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&form at line 1274 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1276 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/specify! at line 1276 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 1278 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1278 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1278 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 1280 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1281 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1284 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/specify at line 1284 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 1287 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1287 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1287 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 1288 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1289 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1291 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/js-this at line 1291 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1294 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/this-as at line 1294 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1296 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 1296 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 1298 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1483 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/extend-type at line 1483 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/type-sym at line 1494 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1494 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1494 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 1495 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1496 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1498 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/type-sym at line 1499 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/type-sym at line 1501 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/type-sym at line 1503 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/type-sym at line 1505 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/type-sym at line 1505 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/type-sym at line 1506 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1574 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/deftype at line 1574 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/t at line 1623 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fields at line 1623 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1623 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1623 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/t at line 1624 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fields at line 1624 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 1625 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/t at line 1626 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1627 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1628 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/t at line 1629 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fields at line 1633 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1634 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1635 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fields at line 1635 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fields at line 1636 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fields at line 1641 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1738 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/defrecord at line 1738 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/rsym at line 1791 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fields at line 1791 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1791 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1791 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/rsym at line 1792 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fields at line 1792 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/rsym at line 1793 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 1795 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 1798 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fields at line 1798 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/impls at line 1798 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fields at line 1799 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fields at line 1803 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fields at line 1804 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1807 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/defprotocol at line 1807 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/psym at line 1847 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1847 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/doc+methods at line 1847 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 1848 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/psym at line 1848 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/doc+methods at line 1849 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/doc+methods at line 1850 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/doc+methods at line 1850 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/doc+methods at line 1851 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/psym at line 1852 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 1855 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 1902 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1919 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/implements? at line 1919 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/psym at line 1921 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1921 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 1924 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/psym at line 1924 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1930 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1931 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1938 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1939 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1940 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1945 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/satisfies? at line 1945 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/psym at line 1947 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1947 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 1950 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/psym at line 1950 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1956 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1957 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/psym at line 1963 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/psym at line 1965 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1966 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1967 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1968 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1970 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/psym at line 1971 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1971 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/psym at line 1973 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 1973 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1975 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/lazy-seq at line 1975 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1980 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 1980 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 1981 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1983 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/delay at line 1983 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1988 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 1988 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 1989 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 1991 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/with-redefs at line 1991 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 1999 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 1999 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 1999 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 2000 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 2001 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 2009 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2013 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/binding at line 2013 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 2021 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2021 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 2021 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 2022 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 2023 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 2024 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 2024 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2026 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/condp at line 2026 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/pred at line 2047 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 2047 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2047 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 2047 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/pred at line 2064 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 2065 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 2066 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2090 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/case at line 2090 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/e at line 2113 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2113 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 2113 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 2114 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 2115 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/e at line 2118 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 2119 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 2135 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 2140 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 2140 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/clauses at line 2140 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/e at line 2143 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/e at line 2151 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/e at line 2151 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/e at line 2156 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2161 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/assert at line 2161 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 2164 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 2166 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 2168 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 2169 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/message at line 2169 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 2171 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/message at line 2173 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 2173 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2175 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/for at line 2175 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/seq-exprs at line 2185 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body-expr at line 2185 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/assert-args at line 2186 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/for at line 2186 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/seq-exprs at line 2187 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/seq-exprs at line 2188 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body-expr at line 2214 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body-expr at line 2237 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/seq-exprs at line 2259 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/seq-exprs at line 2260 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2262 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/doseq at line 2262 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/seq-exprs at line 2266 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2266 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 2266 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/assert-args at line 2267 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/doseq at line 2267 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/seq-exprs at line 2268 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/seq-exprs at line 2269 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 2273 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/seq-exprs at line 2316 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2318 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/array at line 2318 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2318 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2327 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/make-array at line 2327 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/size at line 2328 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/size at line 2330 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/size at line 2331 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/size at line 2332 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2335 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/list at line 2335 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 2337 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2337 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2337 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2338 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/x at line 2338 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2340 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/vector at line 2340 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2342 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2342 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2343 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2346 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2348 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2351 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/array-map at line 2351 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2353 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/kvs at line 2353 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/kvs at line 2354 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 2356 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 2356 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/kvs at line 2358 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/kvs at line 2358 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/kvs at line 2359 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2361 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/hash-map at line 2361 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2363 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/kvs at line 2363 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/kvs at line 2364 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2371 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/hash-set at line 2371 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2373 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2373 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2374 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 2376 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2376 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2377 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2377 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2374 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 2376 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2376 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2377 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2377 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2379 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2379 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/xs at line 2382 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2394 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/js-obj at line 2394 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2394 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2414 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/alength at line 2414 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 2414 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 2416 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2419 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/amap at line 2419 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 2424 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx at line 2424 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ret at line 2424 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 2424 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 2425 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ret at line 2426 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx at line 2427 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx at line 2428 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ret at line 2430 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx at line 2430 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 2430 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx at line 2431 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ret at line 2432 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2434 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/areduce at line 2434 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 2438 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx at line 2438 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ret at line 2438 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/init at line 2438 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 2438 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/a at line 2439 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx at line 2440 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ret at line 2440 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/init at line 2440 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx at line 2441 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/idx at line 2442 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 2442 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ret at line 2443 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2445 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/dotimes at line 2445 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 2450 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2450 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 2450 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 2451 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 2452 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 2456 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2469 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/defmulti at line 2469 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/mm-name at line 2477 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2477 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/options at line 2477 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/options at line 2478 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/options at line 2479 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/options at line 2481 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/options at line 2482 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/options at line 2483 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/mm-name at line 2495 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/mm-name at line 2496 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 2498 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/mm-name at line 2506 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/mm-name at line 2512 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2515 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/defmethod at line 2515 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/multifn at line 2517 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/dispatch-val at line 2517 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2517 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fn-tail at line 2517 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/multifn at line 2518 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/dispatch-val at line 2518 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/fn-tail at line 2518 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2520 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/time at line 2520 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 2522 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 2524 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2530 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/simple-benchmark at line 2530 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 2537 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 2537 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/iterations at line 2537 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2537 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/print-fn at line 2537 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/print-fn at line 2537 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 2538 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 2539 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/bindings at line 2540 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/iterations at line 2542 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/expr at line 2542 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/print-fn at line 2545 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/iterations at line 2546 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2565 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/gen-apply-to at line 2565 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2575 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/with-out-str at line 2575 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2579 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 2579 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/body at line 2583 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2586 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/lazy-cat at line 2586 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2592 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/colls at line 2592 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/colls at line 2593 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2595 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/js-str at line 2595 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/s at line 2595 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/s at line 2596 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2598 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/es6-iterable at line 2598 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ty at line 2598 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ty at line 2599 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2604 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ns-interns at line 2604 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quote at line 2606 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ns at line 2606 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quote at line 2607 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ns at line 2607 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quote at line 2607 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ns at line 2607 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ns at line 2612 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ns at line 2613 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2615 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ns-unmap at line 2615 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quote0 at line 2617 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ns at line 2617 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quote1 at line 2617 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sym at line 2617 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quote0 at line 2618 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ns at line 2618 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quote1 at line 2619 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sym at line 2619 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quote0 at line 2618 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ns at line 2618 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quote1 at line 2619 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sym at line 2619 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ns at line 2621 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sym at line 2621 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/ns at line 2622 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/sym at line 2622 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2624 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/vswap! at line 2624 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/vol at line 2628 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/f at line 2628 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/& at line 2628 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/args at line 2628 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/vol at line 2629 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/f at line 2629 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/vol at line 2629 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/args at line 2629 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2632 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/load-file* at line 2632 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/f at line 2632 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/f at line 2633 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2635 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/macroexpand-1 at line 2635 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quoted at line 2638 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quoted at line 2639 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quoted at line 2641 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 2642 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2644 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/macroexpand at line 2644 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quoted at line 2648 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quoted at line 2649 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/quoted at line 2651 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/&env at line 2652 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core/defmacro at line 2697 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/copy-arguments at line 2697 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/dest at line 2697 .cljs_node_repl/cljs/core.cljc
WARNING: Use of undeclared Var cljs.core$macros/dest at line 2701 .cljs_node_repl/cljs/core.cljc
TypeError: Cannot read property 'call' of undefined
    at Object.<anonymous> (/Users/mfikes/Downloads/.cljs_node_repl/cljs/core$macros.js:11:19)
    at Module._compile (module.js:435:26)
    at Object.Module._extensions..js (module.js:442:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:311:12)
    at Module.require (module.js:366:17)
    at require (module.js:385:17)
    at global.CLOSURE_IMPORT_SCRIPT (repl:75:3)
    at Object.goog.require (repl:21:8)
    at Object.<anonymous> (/Users/mfikes/Downloads/.cljs_node_repl/cljs/js.js:14:6)
cljs.user=>


 Comments   
Comment by Mike Fikes [ 05/Feb/16 5:06 PM ]

Some analysis:

A more fundamental issue is that, in script/noderepljs, the defmacro underlying function exists:

cljs.user=> (defmacro x [])
true

while this is not the case with cljs.jar

cljs.user=> (defmacro x [])
WARNING: Use of undeclared Var cljs.user/defmacro at line 1 <cljs repl>
WARNING: Use of undeclared Var cljs.user/x at line 1 <cljs repl>
TypeError: Cannot read property 'call' of undefined
    at repl:1:107
    at repl:9:3
    at repl:14:4
    at Object.exports.runInThisContext (vm.js:54:17)
    at Domain.<anonymous> ([stdin]:41:34)
    at Domain.run (domain.js:221:14)
    at Socket.<anonymous> ([stdin]:40:25)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:146:16)

Perhaps this is associated with the difference that is causing compilation of the core.cljc file to fail. There is also some circularity to sort out with respect to this.

Comment by Mike Fikes [ 06/Feb/16 8:21 AM ]

The attached patch addresses the issue. The rationale is that it copies the working approach for defn.

Here is an example testing it with Nashorn (it also works with Node):

$ java -jar ~/Projects/clojurescript/target/cljs.jar -m cljs.repl.nashorn
To quit, type: :cljs/quit
cljs.user=> (require 'cljs.js)
nil
cljs.user=> (cljs.js/eval-str (cljs.js/empty-state) 
              "(+ 1 2)" nil {:eval cljs.js/js-eval} identity)
{:ns cljs.user, :value 3}




[CLJS-924] Better error message for mistaken use of 'def' Created: 24/Dec/14  Updated: 05/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Enhancement Priority: Trivial
Reporter: Alex Dowad Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File 0001-Better-error-message-if-def-is-mistakenly-substitute.patch    
Patch: Code

 Description   

ClojureScript shares what is IMHO one of the biggest weaknesses of the current JVM Clojure implementation: those (in)famous stack traces going down into the innards of the compiler if you get your syntax wrong. An easy mistake for noobs is to use 'def' in place of 'defn'; this patch makes that mistake a lot less painful to debug.

Feedback please!



 Comments   
Comment by Mike Fikes [ 05/Feb/16 8:19 PM ]

Patch no longer applies.





[CLJS-1153] Typed Array backed PersistentVector based on clojure.core/Vec Created: 19/Mar/15  Updated: 05/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Adrian Medina Assignee: Unassigned
Resolution: Unresolved Votes: 1
Labels: enhancement

Attachments: Text File 1153.patch    
Patch: Code

 Description   

Goal is to add support for vectors based on clojure.core/Vec, built on top of JavaScript Typed Arrays.

My hope is that this would allow for both efficient creation of vectors from existing Typed Arrays without intermediate conversion to normal JavaScript arrays, as well as efficient concatenation of the composite arrays of the vector back into a Typed Array when necessary via an enhanced cljs.core/into-array.

Implementation is based heavily on clojure/core/gvec.clj, cljs.core/PersistentVector, and cljs.core/TransientVector.

Performance should be comparable to cljs.core/PersistentVector, although there is additional constant overhead with TypedArray instantiation compared to js/Array.

Adds cljs.core/Vec, cljs.core/TransientVec, cljs.core/vector-of, and updates cljs.core/into-array.



 Comments   
Comment by Adrian Medina [ 19/Mar/15 8:39 PM ]

I still have to test, I will update the issue when that is complete. I just wanted to get my first patch up for review as quickly as possible.

Comment by Francis Avila [ 19/Mar/15 11:59 PM ]

No mention of Uint8ClampedArray.

Should Vec type- or range-check assignments? In Clojure these fail (even with unchecked-math):

  • (vector-of :byte 128) returns [-128]
  • (vector-of :byte "1") returns [1]
  • (vector-of :byte (js-obj)) returns [0]

If we're going to expose host primitive arrays via cljs apis, should we also bring the various other array functions in line with Clojure (and ClojureCLR, which also has extra uint, ubyte, etc types) like you are doing with into-array? Some or all of these issues may warrant another ticket instead, or maybe even a design page:

  • make-array ignores type argument and lacks higher dimensions.
  • object-array, int-array, etc. maybe should return TypedArrays.
  • Missing ubyte-array, ushort-array, uint-array (like ClojureCLR)
  • Missing aset-* setters. (Meaningless in js unless we range-check.)
  • aclone and amap preserve type of input array in Clojure, but not in cljs.
  • missing array casters: bytes, shorts, chars, ints, etc.
  • While we're at it, primitive coercion functions (e.g. int, long, unchecked-int, etc) are either no-ops or differ from clojure. (e.g., int in cljs is like unchecked-int in clojure, but unchecked-int in cljs does nothing). Maybe these should be dropped or should match the javascript ToInt32, ToInt16, etc abstract operations (i.e. those used when assigning to TypedArrays). Maybe these match java semantics also?
Comment by Mike Fikes [ 05/Feb/16 8:18 PM ]

Patch 1153.patch no longer applies





[CLJS-1515] Self-host: Allow :file key in cljs.js/*load-fn* callback Created: 17/Dec/15  Updated: 05/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Mike Fikes Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-1515-1.patch     Text File CLJS-1515-2.patch     Text File CLJS-1515-3.patch     Text File CLJS-1515-4.patch     Text File CLJS-1515-5.patch    
Patch: Code and Test

 Description   

Bootstrapped ClojureScript is abstracted away from direct I/O by use of a *load-fn* callback. A result is that when a namespace is loaded, the :file attribute associated with def s in [:cljs.analyzer/namespaces 'foo.ns :defs] in the AST is nil, because cljs.analyzer/*cljs-file* cannot be set to a meaningful value.

This ticket asks for an extension to *load-fn*, allowing a :file key to be optionally included by cljs.js clients, and for cljs.analyzer/*cljs-file* to be bound to that value in appropriate places in cljs.js so that the :file info appears in the AST.

One rationale for this :file attribute is that it makes it easier for clients of cljs.js to look up the file for a def, say, for use when implementing a source REPL special, for example.



 Comments   
Comment by Andrea Richiardi [ 17/Dec/15 4:31 PM ]

Initial patch, adding a :file key to load-fn and a :file-env key inside opts and then assigning it to cljs.analyzer/cljs-file in eval-str. This approach can be discussed and we can create an ad-hoc function for binding. It felt right there.
Moreover, cljs.analyzer/cljs-file gets overridden every time with the payload coming from load-fn.
All this was very quickly done in order to have a feedback from who's more expert than me about the consequences. This is also my very first ClojureScript patch

Comment by Mike Fikes [ 17/Dec/15 5:33 PM ]

I tried this patch. It is working fine for me when loading namespaces, but if I use cljs.js/analyze-str where the string is an ns form referring other namespaces loaded via *load-fn*, along with a def, things are off. (I have that ns referring macros from a clj file and a symbol from a cljs file, and the clj file gets associated with the top-level def and the macro, and the def in the referred file ends up with nil.

As a minor aside, the patch has a spurious whitespace change at the end.

Comment by Mike Fikes [ 17/Dec/15 5:56 PM ]

With respect to the last comment: The patch employs the pattern of conveying the :file passed in the cb via a :file-env opt to the consuming fn. It is consumed in eval-str* but not in analyze-str*. If the same logic is added to analyze-str* then the problem mentioned in the last comment goes away.

Comment by David Miller [ 17/Dec/15 6:48 PM ]

I'm hopeful someone will assign this to a responsible party. I am not that person.

Comment by Andrea Richiardi [ 17/Dec/15 7:21 PM ]

sorry David (Miller) and thanks Mike, I will rework it, adding some tests as well

Comment by Andrea Richiardi [ 17/Dec/15 7:23 PM ]

By the way this makes me think that maybe a better choice is to consider this a side effect and directly modify cljs.analyzer/*cljs-file* returning from *load-fn*, who knows how many other spots I am not covering...

Comment by Mike Fikes [ 18/Dec/15 5:36 AM ]

Two more comments:

1) Broadening the scope of the binding doesn't appear to work properly for me. But things do work if the bindings are done as in the patch now (next to where the other bindings are done).

2) Perhaps :file should be only set if the :lang being called back with is :clj. Maybe this could at least be documented. (It is not clear to me if it is useful for :js, as the patch is setting ana/*cljs-file*.)

Comment by Andrea Richiardi [ 18/Dec/15 10:27 AM ]

About 2), is any AST generated for .js files at all? If yes maybe then we should add it too...I need to explore that code path as well.

Comment by Andrea Richiardi [ 18/Dec/15 3:33 PM ]

So basically with ana/*cljs-file* binding the :file in :meta is not changed at all (I fixed following Mike's advice) but :file is, are we ok with this? In replumb (from planck) we check both so no problem, nonetheless it would be great to know why..

:defs {foo {:protocol-inline nil, :meta {:file bootstrap-test.core, :line 3, :column 7, :end-line 3, :end-column 10, :arglists (quote ([a b]))}, :name bootstrap-test.core/foo, :variadic false, :file /.../clojurescript/src/test/self/bootstrap_test/core.cljs, :end-column 10, :method-params ([a b]), :protocol-impl nil, :arglists-meta (nil nil), :column 1, :line 3, :end-line 3, :max-fixed-arity 2, :fn-var true, :arglists (quote ([a b]))}}, :require-macros nil, :doc nil

Comment by Andrea Richiardi [ 18/Dec/15 3:44 PM ]

It looks like the information in :meta comes directly from the multimethod parse which I dont' think we can change easily. So either we override :file in :meta or we leave as it is with a note in the documentation for :file in *load-fn*

Comment by Andrea Richiardi [ 18/Dec/15 4:10 PM ]

About :js files at least to me it looks like the only trace of importing, say, goog.sting in the AST is in the :imports of the parent namespace. No :file key anywhere, but please correct me if I am wrong as the AST is difficult to untangle

Comment by Andrea Richiardi [ 18/Dec/15 5:29 PM ]

Patch and test

Comment by Mike Fikes [ 18/Dec/15 7:43 PM ]

Comments on {{CLJS-1515-2.patch}} (mostly just opinion):

  1. (Opinion): Introduces new public API, especially with respect to AST exposure. Perhaps fn could instead be added to the test namespace.
  2. (Opinion): I wouldn't try anything complicated to try to patch up the :file that is in the :meta map. (Maybe we'll ultimately figure out why setting cljs.analyzer/*cljs-file* is insufficient for that bit.)
  3. (Opinion): For the :file docstring, I'd avoid mentioning AST. (Even though that was the true motivation for this ticket.) I'd only indicate that it represents the location where :source was obtained. (Which I guess would leave open it being perfectly fine for clients to provide it in the case that :lang is :js.)
  4. script/test-self-host passes for me.
  5. Inadvertent whitespace changes in append-source-map.
Comment by Andrea Richiardi [ 18/Dec/15 7:49 PM ]

1. Sorry Mike I don't understand when you say fn...what do you mean? Can you expand?
2. Yes and it would change a lot of code, that's why I didn't even try
3. Ok can change that, but where should be mentioned that we are modifying :file but not inside :meta?
4. Great!
5. You know I really tried hard not to have that, I will try again to disable all the auto indent my emacs has.

Comment by Mike Fikes [ 18/Dec/15 8:30 PM ]

1. The three new public functions in cljs.js: (var-ast, ns-ast, file->lang) could perhaps be moved to be utility functions in the self-host test namespace.
3. Dunno about the :meta question. But on the :lang :js question, perhaps the patch should only bind :cljs.analyzer/*cljs-file* if :lang :clj?

Comment by Andrea Richiardi [ 18/Dec/15 8:38 PM ]

1. I know it looks like they are used in test only, but I put them there as public because both replumb and planck use them and I was kind of "proposing" this kind of AST utils to be part of the official API (so that the poor dev does not have to go through cljs.analyzer in order to query the AST. I understand if no though.
3. This I don't really know, and seek guidance. I have not noticed any significant change in the AST for .js file, maybe *cljs-file* is never queried in that code path. I could not even find a way to test it. But I could, of course, be very wrong.

Comment by Andrea Richiardi [ 21/Dec/15 2:13 PM ]

This puts the utils functions in the test namespace for now, maybe thinking about exposing some API in the future.

Comment by Andrea Richiardi [ 21/Dec/15 8:19 PM ]

About :js:

  • it looks like the analyze-str code path simply recurs to fetch the next dep. So I guess that branch does not touch the AST.
  • for the require code path it looks like it -> is -> similar.

Therefore I don't see the point in adding :file for :js and I will not bind *cljs-file* if this is the case, as you suggested.

Comment by Andrea Richiardi [ 21/Dec/15 9:48 PM ]

Patch #4 changes the conveying key to :cljs-file, after Mike's good suggestion, and moves the assoc to the (condp ... :clj) branch only. I also added a test to check that *cljs-file* does not match the file path when in the :js branch.

Comment by Andrea Richiardi [ 21/Dec/15 11:56 PM ]

Another note, the *cljs-file* test works because the binding form does not actually restore the old value when it exits...In Clojure it would not probably work.

^ This is plain wrong, I was not considering the "when" my tests are executed, please disregard.

Comment by Mike Fikes [ 23/Dec/15 5:13 PM ]

CLJS-1515-4.patch LGTM.

Details: I tested against current ClojureScript master, using downstream Planck to load regular and macro namespaces and the :file portion of the AST gets properly updated. This also occurs if I instead use cljs.js/analyze-str passing in an ns form that causes code to be loaded. Additionally unit tests (regular and bootstrap) pass for me. I think this patch is functionally good to go.

Comment by David Nolen [ 26/Dec/15 6:54 AM ]

Copying goog.string into the source tree is not desirable. Please fix the tests to remove this. If you must, copy it to a temporary a location from the Google Closure Library JAR and remove it after the test has completed, thanks.

Comment by Andrea Richiardi [ 26/Dec/15 2:20 PM ]

Patch 5 avoid copying string.js and re-uses self_host/test.js.

Comment by Andrea Richiardi [ 26/Dec/15 2:22 PM ]

Done what you asked

Comment by Mike Fikes [ 05/Feb/16 8:05 PM ]

CLJS-1515-5.patch no longer applies





[CLJS-1559] Closure :libs ignored Created: 05/Feb/16  Updated: 05/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Dominykas Mostauskis Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

:libs compilation option doesn't work. Whether specifying directories, or specific files. If trying to `import` one of the js classes (properly namespaced with `goog.provide`) into clojurescript, compilation fails with "no such namespace". If the libs code is not referenced in clojurescript, it compiles, and the output directory does not contain the libs js files.

Compilation options:

(cljs.closure/build
    "src/main/clojurescript"
    {:main 'example.core
     :libs ["/src/main/javascript/"]
     :optimizations :none
     :output-dir "js"
     :output-to "js/main.js"
     :source-map true
     :asset-path "/js"
     })

Javascript file:

goog.provide("test.Test");

test.Test = function(x) {
  this.x = x;
};


 Comments   
Comment by Mike Fikes [ 05/Feb/16 1:51 PM ]

Hi Dominykas, is the absolute path intentional? I suspect the intent was to not have the leading /.

Comment by Dominykas Mostauskis [ 05/Feb/16 2:01 PM ]

I made this typo when posting. On my setup paths are relative to project root.

Comment by David Nolen [ 05/Feb/16 2:38 PM ]

As far as I know quite a few people rely on this functionality. Please provide a complete minimal example or this issue will be closed. All source should be in the ticket or in this comment thread, no external links. Thanks.

Comment by Dominykas Mostauskis [ 05/Feb/16 3:50 PM ]

Can't reproduce. Tips would be appreciated. Banging my head against the wall here.





[CLJS-1560] cljs.reader/read-string doesn't read records that are printed Created: 05/Feb/16  Updated: 05/Feb/16  Resolved: 05/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Daniel Compton Assignee: Unassigned
Resolution: Declined Votes: 0
Labels: None


 Description   

I'm not sure if this is a bug, or feature enhancement, but there is a difference between how Clojure reads records that have been printed, and how ClojureScript does with cljs.reader/read-string.

In Clojure

user=> (defrecord myrec [a b])
user.myrec
user=> (pr-str (->myrec 1 2))
"#user.myrec{:a 1, :b 2}"
user=> (read-string (pr-str (->myrec 1 2)))
#user.myrec{:a 1, :b 2}

In ClojureScript

cljs.user=> (defrecord myrec [a b])
cljs.user/myrec
cljs.user=> (pr-str (->myrec 1 2))
"#cljs.user.myrec{:a 1, :b 2}"
cljs.user=> (cljs.reader/read-string "#cljs.user.myrec{:a 1, :b 2}")
Could not find tag parser for cljs.user.myrec in ("inst" "uuid" "queue" "js")
...
;; Add a tag parser
cljs.user=> (cljs.reader/register-tag-parser! "cljs.user.myrec" map->myrec)
nil
cljs.user=> (cljs.reader/read-string "#cljs.user.myrec{:a 1, :b 2}")
#cljs.user.myrec{:a 1, :b 2}

The proposed solution to this would be to register a tag parser when a defrecord is created. However after reading http://stackoverflow.com/questions/24661655/clojure-clojurescript-clojure-core-read-string-clojure-edn-read-string-and-c, it seems like perhaps the error is in my understanding and cljs.reader/read-string should be expected to behave more like clojure.edn/read-string. If this is the case, it might be good to update the docstrings for cljs.reader to make this distinction clearer.



 Comments   
Comment by David Nolen [ 05/Feb/16 2:36 PM ]

There isn't a good way to make this work due to the nature of advanced compilation. Those names won't exist. If we created some kind of lookup table that would defeat dead code elimination of unused records.





[CLJS-1523] Expose an undocumented Closure compiler DiagnosticGroup Created: 24/Dec/15  Updated: 05/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Rohit Aggarwal Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File CLJS-1523-1.patch    
Patch: Code

 Description   

Following the tutorial on (Compile Time Type checking wiki)https://github.com/clojure/clojurescript/wiki/Compile-Time-Type-Checking, I noticed that the compiler is producing a lot of warning and errors by default such as:

```
ERROR: JSC_WRONG_ARGUMENT_COUNT. Function cljs.core.array_seq: called with 2 argument(s). Function requires at least 1 argument(s) and no more than 1 argument(s). at ..../hello_world/out/cljs/core.js line 17738 : 186
```

These errors and warnings can be disabled by turning off an undocumented DiagosticGroup: (LINT_CHECKS)https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/DiagnosticGroups.java#L465



 Comments   
Comment by David Nolen [ 04/Feb/16 4:03 PM ]

This patch looks ok, Rohit have you submitted your CA? Thanks.

Comment by Rohit Aggarwal [ 05/Feb/16 2:52 AM ]

Hi David,
I've signed the Clojure CA and my name is listed here. Thanks a lot!

Comment by Mike Fikes [ 05/Feb/16 11:19 AM ]

I tried validating the patch, but I cannot reproduce the problem in the description, even with 1.7.170.

Comment by Rohit Aggarwal [ 05/Feb/16 11:27 AM ]

Hi Mike,
I just created a project using the mies template and changed the release.clj file to:

(require '[cljs.build.api :as b])

(println "Building ...")

(let [start (System/nanoTime)]
  (b/build "src"
    {:output-to "release/hello_world.js"
     :output-dir "release"
     :optimizations :advanced
     :closure-warnings {:check-types :error}
     :verbose true})
  (println "... done. Elapsed" (/ (- (System/nanoTime) start) 1e9) "seconds"))

Now when I do

scripts/release

I get warning like:

ERROR: JSC_WRONG_ARGUMENT_COUNT. Function cljs.core.println: called with 0 argument(s). Function requires at least 1 argument(s) and no more than 1 argument(s). at .../hello-world/release/cljs/repl.js line 174 : 0
Comment by Mike Fikes [ 05/Feb/16 11:57 AM ]

Thanks Rohit,

I get errors for a lein new mies hello-world project, but they are different than the one you quote above.

I do get two JSC_WRONG_ARGUMENT_COUNT diagnostics:

ERROR: JSC_WRONG_ARGUMENT_COUNT. Function goog.net.WebSocket.prototype.isOpen: called with 1 argument(s). Function requires at least 0 argument(s) and no more than 0 argument(s). at /Users/mfikes/Desktop/foobar/hello-world/release/clojure/browser/net.js line 591 : 7
ERROR: JSC_WRONG_ARGUMENT_COUNT. Function goog.net.WebSocket.prototype.close: called with 1 argument(s). Function requires at least 0 argument(s) and no more than 0 argument(s). at /Users/mfikes/Desktop/foobar/hello-world/release/clojure/browser/net.js line 613 : 7

Then when revising the project to use the compiler built with the attached patch, I tried adding

:lint-checks :off

to the :closure-warnings map, but this doesn't make these go away.

Hrm... I wonder what explains the difference.

Comment by Rohit Aggarwal [ 05/Feb/16 12:24 PM ]

Mike,
You are correct about the warning with the patch.

:lint-checks :off

But I see that the number of errors is greatly reduced for me.

If it helps, I am using OS X 10.11.4 and Java 1.8.0_71

Comment by Mike Fikes [ 05/Feb/16 12:49 PM ]

I'm seeing no effect with :lint-checks :off.

I'm on OS X 10.11.3 with Java 1.8.0_72, and I'm trying this against the current master of the ClojureScript tree.





[CLJS-1550] Enhance docstring for extend-type wrt type-sym Created: 22/Jan/16  Updated: 04/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Enhancement Priority: Major
Reporter: Mike Fikes Assignee: David Nolen
Resolution: Completed Votes: 1
Labels: docstring

Attachments: Text File CLJS-1550.patch    
Patch: Code

 Description   

At times, people will use js/String, or not have a way to know about the semantics of default, etc.

Add copy to the docstring along the lines:

type-sym may be
   * default, meaning the definitions will apply for any value, unless an extend-type exists for one of the more specific cases below.
   * nil, meaning the definitions will apply for the nil value.
   * any of object, boolean, number, string, array, or function, indicating the definitions will apply for values of the associated base JavaScript types. Note that, for example, string should be used instead of js/String.
   * a JavaScript type not covered by the previous list, such as js/RegEx.
   * a type defined by deftype or defrecord.


 Comments   
Comment by Mike Fikes [ 22/Jan/16 5:38 PM ]

Attached patch produces this output:

cljs.user=> (doc extend-type)
-------------------------
cljs.core/extend-type
([type-sym & impls])
Macro
  Extend a type to a series of protocols. Useful when you are
  supplying the definitions explicitly inline. Propagates the
  type as a type hint on the first argument of all fns.

  type-sym may be

   * default, meaning the definitions will apply for any value,
     unless an extend-type exists for one of the more specific
     cases below.
   * nil, meaning the definitions will apply for the nil value.
   * any of object, boolean, number, string, array, or function,
     indicating the definitions will apply for values of the
     associated base JavaScript types. Note that, for example,
     string should be used instead of js/String.
   * a JavaScript type not covered by the previous list, such
     as js/RegExp.
   * a type defined by deftype or defrecord.

  (extend-type MyType
    ICounted
    (-count [c] ...)
    Foo
    (bar [x y] ...)
    (baz ([x] ...) ([x y & zs] ...))

nil
Comment by David Nolen [ 04/Feb/16 4:09 PM ]

fixed https://github.com/clojure/clojurescript/commit/c0a4e07426b67659ae575cc731e83f7007c36c43

Comment by Mike Fikes [ 04/Feb/16 8:58 PM ]

Confirmed fixed with cljs.jar and downstream cljs.js client.





[CLJS-1551] Self-host: assert-args dormant in macros Created: 22/Jan/16  Updated: 04/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Mike Fikes Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-1551-1.patch    
Patch: Code and Test

 Description   

In bootstrap ClojureScript, if you invoke a macro that employs assert-args, the arguments will not be checked. An example of this would be

(let [a])

In JVM-based ClojureScript, this triggers:

Caused by: java.lang.IllegalArgumentException: let requires an even number of forms in binding vector

In bootstrap ClojureScript, the macroexpansion blindly succeeds, but then the analyzer processes

(let* [a])
and emits a warning

bindings must be vector of even number of elements at line 1

The root cause of this is that the {let} macro is making use of the {assert-args} macro, and in bootstrap ClojureScript, since the {let} macro is being processed as ClojureScript, the {assert-args} macro must be in a "higher" stage.

I did an experiment that moved this to a higher stage and, indeed {(let [a])} results in an exception being thrown in bootstrap indicating:

let requires an even number of forms in binding vector

I haven't yet produced a minimal repro, but I suspect this will be possible with the self-host unit tests.



 Comments   
Comment by Mike Fikes [ 23/Jan/16 10:42 AM ]

Minimal repro, in the form of a self-host unit test:

(deftest test-CLJS-1551
  (cljs/eval-str st
    "(if-let [x true y true] 3)"
    nil
    {:eval node-eval}
    (fn [{:keys [error value]}]
      (is (nil? value))
      (is (= "if-let requires exactly 2 forms in binding vector at line 1 " (ex-message (ex-cause error))))))
  (cljs/eval-str st
    "(if-let [x true] 1 2 3)"
    nil
    {:eval node-eval}
    (fn [{:keys [error value]}]
      (is (nil? value))
      (is (= "if-let requires 1 or 2 forms after binding vector at line 1 " (ex-message (ex-cause error))))))
  (cljs/eval-str st
    "(if-let '(x true) 1)"
    nil
    {:eval node-eval}
    (fn [{:keys [error value]}]
      (is (nil? value))
      (is (= "if-let requires a vector for its binding at line 1 " (ex-message (ex-cause error)))))))
Comment by Mike Fikes [ 23/Jan/16 10:52 AM ]

The attached patch (version 1) adds an entirely new namespace to solve the problem, and as such probably requires extra thought / review. It passes tests and you can also see that it works for regular bootstrap if you do `script/noderepljs` and evaluate

(for [a (range) b] 3)

In this case, the top level exception is still {clojure.lang.ExceptionInfo}, but the root cause changes to {clojure.lang.ExceptionInfo} instead of the previous {java.lang.IllegalArgumentException}. (This difference is due to the use of ex-info in assert-args, and is unlikely to be problematic, but calling it out specifically.)

Comment by David Nolen [ 04/Feb/16 4:07 PM ]

fixed https://github.com/clojure/clojurescript/commit/8f7b1d02d113e49965ebcfe418454b93ba45a6e5

Comment by Mike Fikes [ 04/Feb/16 8:56 PM ]

Confirmed fixed with downstream cljs.js client, and confirmed no regression with cljs.jar.





[CLJS-1552] doc for & should match fn Created: 27/Jan/16  Updated: 04/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Mike Fikes Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: docstring

Attachments: Text File CLJS-1552.patch    
Patch: Code

 Description   

If you do (doc &) the intent is that the doc for fn would be displayed.

Currently you get synthetically constructed (but empty) doc as if fn is a special form.

cljs.user=> (doc &)
-------------------------
fn
Special Form
  nil

  Please see http://clojure.org/special_forms#fn

nil


 Comments   
Comment by Mike Fikes [ 27/Jan/16 9:00 AM ]

With the patch, and exercising doc facility from another namespace:

cljs.user=> (ns foo.core)
nil
foo.core=> (require '[cljs.repl :refer-macros [doc]])
nil
foo.core=> (doc &)
-------------------------
cljs.core/fn
([& sigs])
Macro
  params => positional-params* , or positional-params* & next-param
  positional-param => binding-form
  next-param => binding-form
  name => symbol

  Defines a function

nil
Comment by David Nolen [ 04/Feb/16 4:05 PM ]

fixed https://github.com/clojure/clojurescript/commit/89ec69f06919afaa102a078606dc0ab8b1015fb5

Comment by Mike Fikes [ 04/Feb/16 8:54 PM ]

Confirmed fixed with cljs.jar.





[CLJS-1488] cljs.repl/source Cannot read source of cljs functions that use #js reader Created: 21/Nov/15  Updated: 04/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145, 1.7.228
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Tony Kay Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: None
Environment:

OSX


Attachments: Text File CLJS-1488.patch    
Patch: Code

 Description   

The clsj.repl/source function fails to pull source for cljs that uses #js reader tag. Reports "No reader found for tag".

To reproduce, try (source str).



 Comments   
Comment by Mike Fikes [ 29/Jan/16 8:49 PM ]

I've added a patch to bind the needed reader capability.

Comment by David Nolen [ 04/Feb/16 4:02 PM ]

fixed https://github.com/clojure/clojurescript/commit/d63ad27bbf431274428b9ff391779bac04fef2d0

Comment by Mike Fikes [ 04/Feb/16 8:53 PM ]

Confirmed fixed with cljs.jar.





[CLJS-1557] Make special-symbol? return true for catch and finally Created: 31/Jan/16  Updated: 04/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Mike Fikes Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: None

Attachments: Text File CLJS-1557.patch    
Patch: Code

 Description   

In Clojure,

(special-symbol? 'catch)
and
(special-symbol? 'finally)
both evaluate to true.

Do this in ClojureScript

1. for consistency
2. because cljs.tools.reader (tools.reader-1.0.0-alpha3) makes use of special-symbol? and without this change syntax quoting doesn't work properly, making it difficult to write bootstrapped macros

With respect to the second item above

`(try (catch) (finally))

evaluates to

(try (cljs.user/catch) (cljs.user/finally))

if using cljs.tools.reader tools.reader-1.0.0-alpha3 with bootstrap ClojureScript.



 Comments   
Comment by David Nolen [ 04/Feb/16 3:59 PM ]

fixed https://github.com/clojure/clojurescript/commit/609400910e983849e5b7932a4b7d0b0dda465df6

Comment by Mike Fikes [ 04/Feb/16 8:50 PM ]

Confirmed fixed with cljs.jar and downstream cljs.js client. In particular, using tools.reader-1.0.0-alpha3,

`(try (catch) (finally))

syntax quotes properly.





[CLJS-1542] Self-host: cljs/compile-str not handling errors properly Created: 10/Jan/16  Updated: 04/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145, 1.7.228
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Matt Huebert Assignee: Mike Fikes
Resolution: Completed Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-1542.patch    
Patch: Code and Test

 Description   

cljs/compile-str throws on some errors which cljs/eval[-str] handles gracefully.

Example: on `(fn [] (let [x 7 y] (prn y)))`, cljs/eval-str returns:

{:message "Could not eval eval-str", :data {:tag :cljs/analysis-error}, :cause #error {:message "bindings must be vector of even number of elements at line 1 ", :data {:file nil, :line 1, :column 8, :tag :cljs/analysis-error}}}

whereas cljs/compile-str throws:

Uncaught Error: No method in multimethod 'cljs.compiler/emit*' for dispatch value:
cljs$core$throw_no_method_error @ core.cljs:9611
cljs.core.MultiFn.call.G_10698_2 @ core.cljs:9626
cljs.core.MultiFn.call.G__10698 @ core.cljs:9613
cljs$compiler$emit @ compiler.cljc:170
(anonymous function) @ js.cljs:630
cljs$js$compile_str_STAR__$_compile_loop @ js.cljs:630
cljs$js$compile_str_STAR_ @ js.cljs:603
cljs.js.compile_str.cljs$core$IFn$_invoke$arity$5 @ js.cljs:674
cljs$js$compile_str @ js.cljs:644
(anonymous function) @ core.cljs:28

Minimal example: https://github.com/mhuebert/mies-cljs.js



 Comments   
Comment by Mike Fikes [ 31/Jan/16 9:33 PM ]

If you use cljs.js/compile-str on a form that cannot be analyzed, then the analysis error is wrapped, but inadvertently passed on to compilation as an AST structure. This results in the compiler derailing because it tries to process a nil :op.

The fix is to employ the same pattern used in cljs.js/eval-str, namely: Wrap successful analysis in a {:value ast} map, and then additionally check for an :error key in the result and cb early, otherwise extract the :value and continue on to compilation.

With the patch this error should be produced:

#error {:message "Could not compile ", :data {:tag :cljs/analysis-error}, :cause #error {:message "bindings must be vector of even number of elements at line 1 ", :data {:file nil, :line 1, :column 8, :tag :cljs/analysis-error}}}
Comment by David Nolen [ 04/Feb/16 3:57 PM ]

fixed https://github.com/clojure/clojurescript/commit/4b44c3e4d48c14d47eaa46c203fcc28df16d3941

Comment by Mike Fikes [ 04/Feb/16 8:44 PM ]

Confirmed fixed with downstream bootstrapped client.





[CLJS-620] Warnings are generated when using a macro in argument position Created: 14/Oct/13  Updated: 04/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Julien Eluard Assignee: Unassigned
Resolution: Completed Votes: 0
Labels: None

Attachments: File CLJS-620.diff     Text File CLJS-620.patch    
Patch: Code

 Description   

Using a macro in argument position (e.g. (map macro [])) generates a warning:
WARNING: Use of undeclared Var test/node at line 4 src/test.cljs

Find a reproduction project here.



 Comments   
Comment by Jozef Wagner [ 15/Oct/13 3:30 AM ]

and what would you like, a better warning? Clojurescript allows same name for macro and for function, so you can both have macro + and fn +. Macro version will be used when is first in the list, fn version otherwise.

Comment by Jonas Enlund [ 15/Oct/13 3:38 AM ]

For reference, Clojure generates the following error message:

user=> (map when [])
CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/when, compiling:(NO_SOURCE_PATH:1:1)

The "obvious" approach would be to add

(when-let [m (get-expander sym env)]
  (throw (error env (str "Can’t take value of a macro: " m))))

to resolve-var[1]. Unfortunately this doesn’t work in ClojureScript due to the way inlining works. A simple workaround is to add {:inline true} metadata to macros that are later redefined as functions in core.cljs and check for invalid macro usage like this:

(when-let [m (get-expander sym env)]
  (and (-> m meta :inline not)    
       (throw (error env (str "Can’t take value of a macro: " m)))))

Another approach would perhaps be to rethink how inlining works as it seems kind of brittle to have macros in cljs/core.clj with the same name as functions in cljs/core.cljs (especially since both namespaces are auto-imported. Is cljs.core/inc a function, a macro, or both?). Maybe there’s a better way?

[1] https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/analyzer.clj#L193

Comment by Julien Eluard [ 15/Oct/13 6:23 AM ]

My bad, didn't realize it didn't make sense. Of course it's obvious now. I was confused by recent changes around function/macro name validation.
Now the warning could probably be improved a little but that doesn't seem very important. The Clojure warning is not that much better.

Comment by David Nolen [ 15/Oct/13 11:58 AM ]

We're not going to change how inlining works - the whole point is that we can reuse the same names. Adding :inline metadata seems like a promising way to warn of incorrect usage of inlining macros.

Comment by Mike Fikes [ 01/Feb/16 6:34 PM ]

Attaching CLJS-620.patch for comment.

It may at least improve things by producing the warning regarding it being a macro.

cljs.user=> (map when [])
WARNING: Can't take value of macro cljs.core/when at line 1 <cljs repl>
()

One advantage of the patch is it is pretty small.

A disadvantage is that it kind-of overloads the existing :undeclared-var warning. (The alternative would be to introduce a completely new warning that is emitted in exactly this situation.)

Comment by David Nolen [ 04/Feb/16 3:53 PM ]

fixed https://github.com/clojure/clojurescript/commit/58cd6be66877ba43d1642138360b916de0983917

Comment by Mike Fikes [ 04/Feb/16 8:41 PM ]

Confirmed fixed with cljs.jar and downstream bootstrap.





[CLJS-794] RegExp flags are being dropped by `string/replace` Created: 09/Apr/14  Updated: 04/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Peter Taoussanis Assignee: Unassigned
Resolution: Unresolved Votes: 2
Labels: None

Attachments: Text File CLJS-794.patch    

 Description   

`clojure.string/replace` accepts either a string or pattern argument to match against.

For pattern arguments, the current implementation discards the original RegExp and creates a new one:
`(.replace s (js/RegExp. (.-source match) "g") replacement)`

This is killing any flags on the original pattern (case insensitivity, for example). As a result, things like `(str/replace "Foo" #"(?i)foo" "bar")` currently fail. The result is "Foo", it should be "bar".

Can I submit a patch that'll check for and preserve other (i/m/y) flags?

Thanks



 Comments   
Comment by David Nolen [ 02/Dec/14 5:42 AM ]

A patch is welcome for this. Thanks.

Comment by lvh [ 27/Jul/15 11:55 AM ]

This appears to be identical to CLJS-485, which has a patch (by someone who hasn't signed the CLA yet).

Comment by Jake McCrary [ 04/Feb/16 6:43 PM ]

This patch changes string/replace-all to respect flags that were set on regexp passed as an argument.





[CLJS-1540] Arity-1 version of js->clj should pass keyword arguments for default options, as expected by js->clj Created: 07/Jan/16  Updated: 04/Feb/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Nicolás Berger Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File js-clj-keyword-opts.patch    
Patch: Code

 Description   

Arity-1 version of js->clj is passing the map {:keywordize-keys false} as the default options of js->clj, when it should pass the keyword arguments :keywordize-keys false. It's working by luck, because keywordize-keys ends being nil by default, which is falsey. But it's confusing for anyone reading the code and trying to pass {:keywordize-keys true} with the expectation that it would keywordize the keys.

References: http://dev.clojure.org/jira/browse/CLJS-750 and https://groups.google.com/forum/#!topic/clojurescript/Dis6845WL5U



 Comments   
Comment by Mike Fikes [ 29/Jan/16 7:59 PM ]
Comment by David Nolen [ 04/Feb/16 4:05 PM ]

Patch looks OK, Nicolas have you submitted your CA? Thanks.

Comment by Nicolás Berger [ 04/Feb/16 5:00 PM ]

Yes I did, David





[CLJS-1499] Circular dependency checking for nses that self-require Created: 01/Dec/15  Updated: 04/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Completed Votes: 0
Labels: None


 Description   

Currently triggers StackOverflow



 Comments   
Comment by Mike Fikes [ 29/Jan/16 8:17 PM ]

I believe we can close this one:

(ns foo.core
  (:require foo.core))

yields

cljs.user=> (require 'foo.core)
clojure.lang.ExceptionInfo: Assert failed: Circular dependency detected, cljs.user -> foo.core -> foo.core

with the changes made for CLJS-1537.





[CLJS-1424] (def) or (defn) will throw an obscure exception Created: 14/Aug/15  Updated: 04/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.48
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Sean Grove Assignee: Unassigned
Resolution: Completed Votes: 0
Labels: cljs


 Description   

Simply trying to compile `(def)` will throw an exception: "Caused by: clojure.lang.ArityException: Wrong number of args (1) passed to: analyzer/eval1440/fn-1441/pfn-1442"

While obviously not a valid construct, the error could be significantly more descriptive, and also show the line number where it happened.

A similar issue happens with `(defn)`: "Caused by: clojure.lang.ExceptionInfo: Wrong number of args (2) passed to: core/defn--12230"



 Comments   
Comment by Mike Fikes [ 29/Jan/16 9:03 PM ]

FWIW, the defn case is a little better now with CLJS-1516, reporting 0 args passed:

cljs.user=> (defn)
clojure.lang.ExceptionInfo: Wrong number of args (0) passed to: core/defn--3475 at line 1 <cljs repl> {:file "<cljs repl>", :line 1, :column 1, :tag :cljs/analysis-error}




[CLJS-1554] AbstractMethodError trying to deftype with Object Created: 31/Jan/16  Updated: 04/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Major
Reporter: James Laver Assignee: Unassigned
Resolution: Declined Votes: 0
Labels: bug, interop
Environment:

clojure 1.7, clojurescript 1.7.228



 Description   

I get this obscure message trying to upgrade timbre to cljs 1.7.228 (from 0.0.2727) and I have no idea what's changed.

java.lang.AbstractMethodError: Method cljsbuild/compiler/SourcePaths._find_sources(Ljava/lang/Object;)Ljava/lang/Object; is abstract, compiling/private/var/folders/k6/glc05svd5d194k8kgqfwkrph0000gn/T/form-init382463497803898384.clj:1:124)

Code that triggers it is here:
https://github.com/jjl/automat/blob/cljc/src/automat/fsm.cljc#L25

I've eliminated my cljc as being the cause by bumping the clojurescript version on the original code and seeing the same error.



 Comments   
Comment by Thomas Heller [ 31/Jan/16 8:05 AM ]

You also need to upgrade the lein-cljsbuild version, not sure what is current but I believe at least 1.1.1 is required.

Comment by James Laver [ 31/Jan/16 9:02 AM ]

Ah, thanks. That's working now.





[CLJS-1545] Add option to ignore JCS_UNSAFE_THIS warning Created: 14/Jan/16  Updated: 04/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Daniel Compton Assignee: Unassigned
Resolution: Declined Votes: 0
Labels: None


 Description   

When using https://github.com/binaryage/dirac, we get this warning with a prod build.

com.google.javascript.jscomp.LoggerErrorManager println
WARNING: ../parts/devtools/sanity_hints.js:108: WARNING - dangerous use of this in static method devtools.sanity_hints.type_error_to_string
var self = this;

Is it possible to extend :closure-warnings to add JSC_UNSAFE_THIS to the set of warnings that we can enable/disable? Details on the warnings: https://developers.google.com/closure/compiler/docs/error-ref?hl=en#warn

JSC_UNSAFE_THIS is defined at https://github.com/google/closure-compiler/blob/v20151015/src/com/google/javascript/jscomp/CollapseProperties.java#L88-L90



 Comments   
Comment by David Nolen [ 18/Jan/16 2:46 PM ]

Patch welcome.

Comment by Antonin Hildebrand [ 01/Feb/16 9:19 AM ]

This was actually a problem in cljs-devtools code.

After reading https://developers.google.com/closure/compiler/docs/limitations?hl=en I was able to get rid of the warning with this change:

https://github.com/binaryage/cljs-devtools/commit/e5fad13e4565ddeac59ed06cfe551455b47303f2

But Daniel, this points out another issue in your build setup. You should not be compiling and requiring cljs-devtools in :advanced builds of your project. cljs-devtools is designed for development mode only, it cannot work under :advanced because of CLJS-1249.





[CLJS-741] seq error message readability is not optimal Created: 02/Jan/14  Updated: 04/Feb/16  Resolved: 04/Feb/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Enhancement Priority: Trivial
Reporter: Julien Eluard Assignee: Unassigned
Resolution: Completed Votes: 0
Labels: None

Attachments: Text File cljs_741.patch    

 Description   

When calling seq on an invalid type an errr with following message is thrown: :keywordis not ISeqable.

Adding a space between the argument and the message improves the readability.



 Comments   
Comment by David Nolen [ 02/Jan/14 12:58 PM ]

Excellent thanks!

Comment by Mike Fikes [ 02/Feb/16 5:57 PM ]

The attached patch no longer applies owing to source file name changes.

Comment by Mike Fikes [ 02/Feb/16 6:04 PM ]

We can close, this has already been addressed: https://github.com/clojure/clojurescript/commit/f9a33372a9122f940310588435e210312da685f9





[CLJS-1518] Case macro expansion evaluates expression twice Created: 21/Dec/15  Updated: 31/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145, 1.7.228
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Darrick Wiebe Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: None
Environment:

The issue is present in version 1.7.189.


Attachments: Text File CLJS-1518.patch    
Patch: Code and Test

 Description   

The value being checked is evaluated twice if all of the test values are keywords.

(macroexpand-1 '(case (expensive) :a 1 2))
(cljs.core/let [G__123555 (if (cljs.core/keyword? (expensive)) (.-fqn (expensive)) nil)]
  (case* G__123555 [["a"]] [1] 2))


 Comments   
Comment by Mike Fikes [ 31/Jan/16 11:38 PM ]

Patch takes advantage of the existing gensym as a temp place to stash the evaluated value before test / FQN conversion.

Adds a unit test specifically checking for single evaluation in this case.

Comment by Mike Fikes [ 31/Jan/16 11:40 PM ]

With the patch, Darrick's macroexpansion example becomes:

(cljs.core/let [G__7663 (expensive) 
                G__7663 (if (cljs.core/keyword? G__7663) (.-fqn G__7663) nil)] 
  (case* G__7663 [["a"]] [1] 2))




[CLJS-1241] Add cljs.core/boolean? predicate Created: 03/May/15  Updated: 31/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Brandon Bloom Assignee: Unassigned
Resolution: Unresolved Votes: 2
Labels: patch

Attachments: Text File CLJS-1241_v01.patch    
Patch: Code and Test

 Description   

I'm constantly re-implementing this predicate...

It's also important for clj/cljs compatibility.



 Comments   
Comment by Brandon Bloom [ 03/May/15 2:32 PM ]

See also: http://dev.clojure.org/jira/browse/CLJ-1719

Comment by Mike Fikes [ 03/May/15 2:52 PM ]

I tried this patch and it works correctly for me.

The docstring uses "typeof". Perhaps "type of" was intended?

cljs.user=> (doc boolean?)
-------------------------
cljs.core/boolean?
([x])
  Returns true if the typeof x is boolean, false otherwise.

nil
Comment by Brandon Bloom [ 03/May/15 7:41 PM ]

I did mean "typeof", which is a javascript-ism. A better doc string may be less javascript-specific...

Comment by Mike Fikes [ 31/Jan/16 3:17 PM ]

Patch CLJS-1241_v01.patch no longer applies on master.

Comment by Brandon Bloom [ 31/Jan/16 7:13 PM ]

Not going to bother updating patch until there is movement on http://dev.clojure.org/jira/browse/CLJ-1719





[CLJS-1558] Code allowed to re-define referred var Created: 31/Jan/16  Updated: 31/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Defect Priority: Major
Reporter: Mike Fikes Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

If you refer a var from another namespace, then you can def a new value for that var, and the def will mutate the other namespace, and other things will go wrong as illustrated in the example below.

FWIW, Clojure disallows this, and refuses to allow you to evaluate a def involving a referred var, and emits an error diagnostic like:

CompilerException java.lang.IllegalStateException: foo already refers to: #'some.name.space/foo in namespace: user, compiling:(NO_SOURCE_PATH:2:1)

Here is a complete example illustrating the issues:

Given:

(ns foo.core)

(defn square [x]
  (* x x))

then do this in a REPL:

cljs.user=> (require '[foo.core :refer [square]])
nil
cljs.user=> (var square)
#'foo.core/square
cljs.user=> (square 3)
9
cljs.user=> (ns-interns 'cljs.user)
{}
cljs.user=> (defn square [x] (+ x x))
WARNING: square already refers to: foo.core/square being replaced by: cljs.user/square at line 1 <cljs repl>
#'foo.core/square
cljs.user=> (square 3)
6
cljs.user=> (var square)
#'foo.core/square
cljs.user=> (in-ns 'foo.core)
nil
foo.core=> (square 3)
6
foo.core=> (in-ns 'cljs.user)
nil
cljs.user=> (ns-interns 'cljs.user)
{square #'cljs.user/square}
cljs.user=> (cljs.user/square 3)
TypeError: Cannot read property 'call' of undefined
    at repl:1:105
    at repl:9:3
    at repl:14:4
    at Object.exports.runInThisContext (vm.js:54:17)
    at Domain.<anonymous> ([stdin]:41:34)
    at Domain.run (domain.js:221:14)
    at Socket.<anonymous> ([stdin]:40:25)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:146:16)
cljs.user=> #'cljs.user/square
#'cljs.user/square
cljs.user=> @#'cljs.user/square
nil





[CLJS-1556] Invalid code emit for obj literal Created: 31/Jan/16  Updated: 31/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Mike Fikes Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File CLJS-1556.patch    
Patch: Code and Test

 Description   

For some legal ClojureScript expressions involving #js object literals, invalid JavaScript is emitted. Specifically this has to do with object literals appearing at the beginning of statements where the opening brace can be interpreted as the beginning of a JavaScript block.

One way to reproduce this is to evaluate

(do #js {:a 1} 
    #js {:b 2})

in the Node REPL. In this case it is the first object literal that causes the problem; the second one emitted follows a return statement and is OK.

Rationale for marking it as minor: This appears to only really occur in places where the object literal won't actually be used.






[CLJS-1458] re-matches might give false negative when using match groups Created: 25/Sep/15  Updated: 31/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Nikita Prokopov Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File cljs-1458-re-matches-might-give-false-negative.patch    
Patch: Code and Test

 Description   

Current behaviour:

(re-matches #"(a|aa)" "aa") => nil

Expected:

(re-matches #"(a|aa)" "aa") => ["aa" "aa"]

JVM version works as expected, only CLJS is affected



 Comments   
Comment by David Nolen [ 14/Oct/15 11:36 AM ]

This is the kind of ticket that tends to break existing code. We should get some people who are interested in this ticket to actually try it out.

Comment by Mike Fikes [ 31/Jan/16 3:45 PM ]

FWIW, I gave cljs-1458-re-matches-might-give-false-negative.patch a try in bootstrapped ClojureScript and it is working fine there (each of the additional unit tests produce the expected results in bootstrapped).





[CLJS-651] optimize true branch of satisfies? usage Created: 01/Nov/13  Updated: 31/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File cljs_651.patch    
Patch: Code

 Description   

The true branch of a satisfies? test should be hinted so that the type doesn't need type hints



 Comments   
Comment by Peter Schuck [ 16/Dec/14 2:51 PM ]

All paths taken on satisfies are now hinted as boolean

Comment by Mike Fikes [ 31/Jan/16 3:26 PM ]

cljs_651.patch no longer applies on master





[CLJS-1300] REPLs do no write out updated deps.js when compiling files Created: 05/Jun/15  Updated: 31/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Major
Reporter: David Nolen Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File cljs-1300.patch    
Patch: Code

 Description   

For example a user may edit a file including a new dependency. This will work at the REPL but if a browser refresh is made the emitted goog.require will fail due to the initial deps.js file being stale.



 Comments   
Comment by ewen grosjean [ 05/Dec/15 4:15 PM ]

load-file is broken into 4 sub-functions:
repl-compile-cljs: compile the cljs file beeing loaded
repl-cljs-on-disk: ensures all dependencies are on disk
refresh-cljs-deps: refreshes the cljs_deps.js file
repl-eval-compiled: eval the compiled file

Comment by David Nolen [ 05/Dec/15 9:02 PM ]

Thanks will review.

Comment by Mike Fikes [ 31/Jan/16 3:25 PM ]

cljs-1300.patch no longer applies on master





[CLJS-1164] quot and rem are inefficient Created: 24/Mar/15  Updated: 31/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Francis Avila Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: math

Attachments: Text File cljs-1164.patch    
Patch: Code and Test

 Description   

The implementation of the quot and rem functions are needlessly complicated. Currently they are:

(defn quot [n d] (fix (/ (- n (js-mod n d)) d)))
(defn rem [n d] (- n (* d (quot n d))))

However all numbers in js are doubles already, so all this is unnecessary:

(defn quot [n d] (fix (/ n d)))
(defn rem [n d] (js-mod n d)))

Notice that "rem" is simply js-mod, and I'm not sure why no one noticed this before. I keep js-mod for now since a lot of code uses it, and if cljs ever grows a number tower the distinction may be important.

Patch attached, which also:

  • Creates a macro version of quot and rem.
  • Updates documentation for quot, rem, js-mod and mod for clarity.
  • Implement fix (private function to round to zero) with ES6 Math.trunc() if available.

Existing quot and rem tests pass, although there could be some better tests of edge cases (negative decimal num or div, NaN and +-Infinity args).



 Comments   
Comment by Francis Avila [ 24/Mar/15 12:27 PM ]

Better tests found rounding errors in my updated rem, which should stay as-is. (Not simply js-mod after all! Seems to round args first? Not obvious from the spec.) Changed quot however is correct and introduces less error than the current one. Will update patch and tests when I get a chance.

Comment by Francis Avila [ 29/Mar/15 12:39 AM ]

Working patch with tests attached. Tests expanded to cover floating-point cases. rem is now fundamentally the same as master (was more accurate than js-mod!!), but returns results consistent with js-mod for non-finite args or zero divisor.

Comment by Mike Fikes [ 31/Jan/16 3:23 PM ]

cljs-1164.patch no longer applies on master





[CLJS-1059] Simple interface wanted to convert cljs forms to js Created: 22/Feb/15  Updated: 31/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 0.0-3211
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Stuart Mitchell Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: analyzer, compiler


 Description   

In our project (a clojurescript debugger) we want to convert cljs forms or a sequence of forms into javascript so that they can be executed in the javascript console.

We would like something similar to closure/compile-form-seq (https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/closure.clj#L308)

However, we need to supply, the namespace requires and locals in an env like this

{:ns {:name "test.core" :requires {(quote gstring) (quote goog.string)}} :locals {}}

This code seems to do what we want.

(defn compile-form-seq
    \"Compile a sequence of forms to a JavaScript source string.\"
    [forms env]
    (env/ensure
    (compiler/with-core-cljs nil
      (fn []
        (with-out-str
            (doseq [form forms]
              (compiler/emit (analyzer/analyze env form))))))))

I am not sure why I need env/ensure.

Would you be able to patch compile-form-seq to provide the needed interface, or suggest what we should be doing.

Thanks
Stu



 Comments   
Comment by Mike Thompson [ 22/Feb/15 10:09 PM ]

Just to be clear:
1. when our debugger is at a breakpoint,
2. the user can type in an expression at the repl
3. in response, our debugger has to compile the user-typed-in expression to javascript (and then execute it, showing a result)
4. taking into account any local bindings. <---- this is the key bit.

To satisfy point 4, our tool extracts all the 'locals' from the current call-frame, and then supplies all these local bindings in env/locals, so the compiler doesn't stick a namespace on the front of them.

For example, if there was a local binding for 'x' in the callstack, and the user's repl-entered-expression involves 'x', then we want the compiler to leave the symbol 'x' alone and to not put some namespace on the front of it. In the final javascript, it must still be 'x', not 'some.namespace.x'

Our method to achieve this is to put 'x' into env/locals when compiling – and it all works. Except, with the recent changes this has become more of a challenge. Hence this ticket asking for a way to pass in env.

Comment by Thomas Heller [ 23/Feb/15 3:19 AM ]

You could wrap the user expression in an fn, that would allow you to skip messing with the locals. The REPL basically does the same trick for *1,*2,...

(fn [x]
  ~user-expression-here)
Comment by David Nolen [ 29/Apr/15 7:21 AM ]

Seems like something useful to add to a cljs.compiler.api namespace.





[CLJS-1411] make-array signature differs from clojure Created: 10/Aug/15  Updated: 31/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.48
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Lars Andersen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: newbie

Attachments: Text File CLJS-1411.patch    
Patch: Code

 Description   

When I was porting clj code using a two-dimensional array I noticed the cljs version only accepts size, instead of dim & more-dims.

Signature in cljs: ([size] [type size])
signature int clj: ([type len] [type dim & more-dims])



 Comments   
Comment by David Nolen [ 10/Aug/15 7:28 AM ]

Unlike on the JVM there's no efficient way to allocate multi-dimensional arrays. An enhancement patch that includes a modification to the docstring that warns about the computational cost is welcome.

Comment by Lars Andersen [ 10/Aug/15 8:00 AM ]

What I want is for the signatures to be the same, so I don't have to use reader conditionals to get the same behavior on the two platforms.

When I'm asking for a two-dimensional array, I'm presumably going to do work that is O(m*n), so even though the pre-allocation is O(m*n) too it won't affect the runtime of the program significantly.

Comment by David Nolen [ 10/Aug/15 8:13 AM ]

Lars, yes I understood As I said patch welcome. This is a very ClojureScript newbie friendly ticket.

Comment by António Nuno Monteiro [ 19/Oct/15 12:30 PM ]

Submitted patch with suggested changes

Comment by Erik Assum [ 26/Nov/15 11:27 AM ]

@Antonio: Out of curiosity, isn't the "will run in polynomial time" a bit unprecise, since I guess all array-allocations run in polynomial time?

Comment by António Nuno Monteiro [ 03/Dec/15 5:46 AM ]

You're right. I misunderstood what David mentioned regarding the JVM performance. should it just say "Note that there is no efficient way to allocate multi-dimensional arrays in JavaScript" and stop there?

Comment by Mike Fikes [ 31/Jan/16 9:51 AM ]

This patch fails for me if I try using it with make-array in operator position. In fact, there's an underlying issue CLJS-1555 that probably needs to be fixed first, and then a patch could be made that takes care of the extra arity in the macro version of make-array as well.





[CLJS-1555] make-array macro missing 2 arg arity Created: 31/Jan/16  Updated: 31/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Defect Priority: Major
Reporter: Mike Fikes Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File CLJS-1555.patch    
Patch: Code and Test

 Description   

You can do

(apply make-array [nil 2])
but not
(make-array nil 2)
.






[CLJS-1466] Absolute paths in :output-dir break Node.js shim for :none Created: 11/Oct/15  Updated: 29/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Major
Reporter: Sebastian Bensusan Assignee: Sebastian Bensusan
Resolution: Unresolved Votes: 0
Labels: bug

Attachments: Text File cljs_1466.patch    
Patch: Code

 Description   

When compiling a trivial example with the following script:

(require 'cljs.build.api)

(cljs.build.api/build "src"
  {:main 'hello.core
   :output-to "main.js"
   :output-dir "/home/carlos/Playground/node-abs/out"
   :target :nodejs})

It generates code that tries to resolve the following path:

/home/carlos/Playground/node-abs/home/carlos/Playground/node-abs/out/goog/bootstrap/nodejs.js

We should check if the provided path for :output-dir is absolute before resolving it in the Node.js :none shim. The shim has a related ticket in CLJS-1444.

Even if it's uncommon for users to have absolute paths, tooling might need to.



 Comments   
Comment by Sebastian Bensusan [ 11/Oct/15 4:28 PM ]

The attach patch cljs_1466.patch solves the issue by using path.resolve which takes into account relative vs absolute paths when joining paths. Successfully tested in the example repo with both relative and absolute :output-dir

Comment by Martin Klepsch [ 14/Oct/15 3:57 AM ]

Looking at the patch it seems that it might break current behaviour in some cases? Have you thought about that?

CLJS-1444 [1] would probably also break the shim in some way so would be good to get these in together and be very clear about what will break etc. As long as we come up with a robust and predictable impl this is something worth breaking imo.

[1] http://dev.clojure.org/jira/browse/CLJS-1444 for

Comment by David Nolen [ 14/Oct/15 8:05 AM ]

Yes would like to get feedback from people already heavily invested in ClojureScript + Node.js before moving forward on this.

Comment by Sebastian Bensusan [ 14/Oct/15 10:31 AM ]

Martin Klepsch: I did think about breakage but I couldn't find any cases. Do you have an example one? In the example repo I've put together some tests (by running ./script/test.sh) but it boils down to path.join(path.resolve("."),paths) being equivalent to path.resolve(paths) for all relative paths, since the "Resolve to absolute" method is the same for both (process.cwd() inside of path.resolve). When considering absolute paths, only the new version does the right thing.

On the other hand, those tests also reveal that the proposed patch doesn't cover CLJS-1446 as I originally thought since

node main.js

succeeds while:

cd ..
node node-abs/main.js

fails.





[CLJS-1492] Warn when using :optimisations instead of :optimizations Created: 24/Nov/15  Updated: 29/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Daniel Compton Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

Coming from British English, it is easy to accidentally type the Anglicised :optimisations, instead of the American english :optimizations. Would it be ok to add a warning when users pass in :optimisations to use :optimizations instead?



 Comments   
Comment by Mike Fikes [ 29/Jan/16 8:26 PM ]

Perhaps if we maintained a collection of all known compiler and REPL option keys somewhere in the code, we could warn (and even suggest a correction) if an unknown key is passed with a small Levenshtein distance from a known key.





[CLJS-1549] Printing #object tags should be consistent Created: 22/Jan/16  Updated: 29/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Enhancement Priority: Trivial
Reporter: Antonin Hildebrand Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File cljs_1549.patch    
Patch: Code

 Description   

[CLJS-1376|http://dev.clojure.org/jira/browse/CLJS-1376) wanted to bring printing parity with Clojure 1.7.0.

There are two problems:
1) Atom and Volatile contain extra space between #object and "[" (that differs from Clojure 1.7.0)
2) Atom and Volatile printing was inconsistent with #object printing in pr-writer-impl (in goog/isFunction and :else branches) - there we have no space

I have introduced a function which handles printing object tags consistently without space. Also I have broken writing content into writer into logical tokens for easier cljs-devtools implementation.

Background info:
Exact printing behaviour is quite important for me when implementing alternative pr-writer-impl for cljs-devtools. For most cases I call original pr-writer-impl and then post-process its output to enhance its presentation in DevTools console:
https://github.com/binaryage/cljs-devtools/blob/2f1c0f4095a364bb11a833e73e5753a4e48add8f/src/devtools/format.cljs#L200-L226

In case of constructors or functions (goog/isFunction and :else branches of pr-writer-impl), I don't want to emit stringified content, but I want to provide real js-object reference and delegate further printing/expansion to native javascript formatter in DevTools.
In other cases like Atom or Volatile, I would like to easily detect "#object" as first token written into writer and provide better visual clues. I find printing "#object [...]" confusing for more complex data situations. Square brackets resemble vectors and may confuse clarity. Instead I will use color-coding or another form of visual styling to mark object instances and their boundaries. But for this I want to have nice token stream "#object" "[" ... "]" without having to use regexps.






[CLJS-968] Metadata on function literal inside of a let produces invalid Javascript Created: 07/Jan/15  Updated: 28/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Major
Reporter: Bobby Eickhoff Assignee: David Nolen
Resolution: Unresolved Votes: 2
Labels: bug
Environment:

Originally found with [org.clojure/clojurescript "0.0-2496"]
Still reproducible with the latest cljsc (b5e9a5116259fc9f201bee4b9c6564f35306f9a5)



 Description   

Here is a minimal test case that produces the invalid Javascript:

(defn f []
  (let [a 0]
    ^{"meta" "data"}
    (fn [] true)))

The compiled Javascript includes the invalid token sequence "return return". (Per Chrome: Uncaught SyntaxError: Unexpected token return)

The problem does not occur if the metadata applies to a map literal instead of a function literal.
The problem only occurs when the function and metadata are inside of a let.



 Comments   
Comment by Bobby Eickhoff [ 07/Jan/15 9:45 PM ]

I forgot to try with-meta. Using with-meta does not produce this syntax error, so it's only a problem with the reader macro for metadata.

Comment by David Nolen [ 08/Jan/15 7:41 AM ]

Any quick thoughts about this one Nicola? Quite possibly a compiler issue on the CLJS side.

Comment by Nicola Mometto [ 08/Jan/15 8:07 AM ]

David, I understand why this happens but I don't know enough about how cljs's js emission to propose a fix.
The issue is that with this commit: https://github.com/clojure/clojurescript/commit/d54defd32d6c5ffcf6b0698072184fe8ccecc93a the following scenario is possible:

{:op :meta
 :env {:context :return}
 :expr {:op :fn
        :env {:context :expr}
        :methods [{:op :fn-method 
                   :env {:context :return} ..}]
        ..}
 ..}

i.e. analyze-wrap-meta changes the context of the :fn node to :expr but keeps the context of the :fn-methods to :return.

This causes both
https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L575-L576
and
https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L488 (https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L233)

to be true and emit a "return".

Comment by David Nolen [ 06/May/15 7:15 PM ]

Hrm, it appears analyze-wrap-meta may need to defer to a helper to change the :context of the given AST node.

Comment by Herwig Hochleitner [ 11/Dec/15 10:52 AM ]

I just randomly ran into this, when upgrading an old project. There is also a duplicate already: http://dev.clojure.org/jira/browse/CLJS-1482

Comment by Jonathan Chu [ 28/Jan/16 6:19 PM ]

This issue occurs for me even without a let.

(fn []
  ^{"meta" "data"}
  (fn [] true))

gives me

#object[SyntaxError SyntaxError: Unexpected token return]




[CLJS-1547] Wrong output encoding when compile with goog.LOCALE Created: 17/Jan/16  Updated: 19/Jan/16  Resolved: 19/Jan/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Sergey Zharinov Assignee: Unassigned
Resolution: Completed Votes: 0
Labels: None

Attachments: Text File CLJS-1547.patch    

 Description   

How to reproduce:

1. Compiler options:

{:closure-defines {"goog.LOCALE" "ru"}

2. In REPL:

(import '[goog.i18n DateTimeFormat])
(let [fmt (DateTimeFormat. "dd MMMM")]
  (.format fmt (js/Date.)))
;=> "17 ÑнварÑ"

Closure Compiler source code contains note about this behaviour:
https://github.com/google/closure-compiler/blob/62ca536d0a184a8852646e2bc2db178f700f5cfc/src/com/google/javascript/jscomp/AbstractCommandLineRunner.java#L163



 Comments   
Comment by Sergey Zharinov [ 17/Jan/16 1:12 PM ]

Possible solution:
https://github.com/zharinov/clojurescript/commit/72486836d5a1fdb2799f3c21194349403a7828d2

Comment by David Nolen [ 18/Jan/16 2:42 PM ]

This probably needs a compiler flag with a default to "UTF-8". Patch welcome.

Comment by David Nolen [ 19/Jan/16 3:19 PM ]

fixed https://github.com/clojure/clojurescript/commit/404d6444cb6419658a7dacb343a5fed5b9451e0c





[CLJS-1548] cannot reference a JS global var with same name as current namespace Created: 19/Jan/16  Updated: 19/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: Shaun LeBron Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

Steps to reproduce:

1. Create a JS global var `foo`.
2. Create a `foo.core` namespace.
3. Try referencing `js/foo` in `foo.core`.

Problem:

`js/foo` does not resolve to the JS global var `foo`
(in advanced optimizations, but not w/ optimizations off).

Solution: Proposing we issue a warning.

Will put together a diagnostic project soon and see about working on a patch.






[CLJS-1546] cljs.core/run! does not always return nil Created: 15/Jan/16  Updated: 18/Jan/16  Resolved: 18/Jan/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: None

Type: Defect Priority: Major
Reporter: Mike Fikes Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: None

Attachments: Text File CLJS-1546.patch    
Patch: Code and Test

 Description   

According to the documentation cljs.core/run! should return nil. This is not the case as seen by the following examples:

cljs.user=>  (run! identity [1])
1
cljs.user=> (run! reduced (range))
0

See CLJ-1761.



 Comments   
Comment by Mike Fikes [ 16/Jan/16 12:43 PM ]

Attached patch with trivial addition to explicitly return nil (as is also done in Clojure 1.8), along with tests.

Comment by David Nolen [ 18/Jan/16 2:45 PM ]

fixed https://github.com/clojure/clojurescript/commit/628d957f3ecabf8d26d57665abdef3dea765151e





[CLJS-276] Uploaded closure-library-third-party JAR not working as expected Created: 26/May/12  Updated: 15/Jan/16  Resolved: 21/Sep/12

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Major
Reporter: Alexander Kellett (lypanov) Assignee: Stuart Sierra
Resolution: Completed Votes: 0
Labels: None
Environment:

ClojureScript release 0.0-1236
noir-cljs


Attachments: Text File 0001-closure-library-0.0-1376.patch     Text File 0001-closure-library-third-party-0.0-1376.patch    
Patch: Code

 Description   

After adding a dependency on closure-library-third-party jar to my project (as announced via http://osdir.com/ml/clojure/2012-05/msg00568.html) I was unable to use either goog.dom.query or the non third party resources.

Example error messages:
ERROR - required "goog.ui.TabBar" namespace never provided
ERROR - required "goog.dom.query" namespace never provided

It could be that its my setup, but I noticed that the JAR files look nothing like the JAR files I've generated in the past when working with closure library / compiler.

I have locally fudged the uploaded jar's such that they work as expected for my project, namely.
1) deps.js in closure-library at the very end refers to ../third-party, this path does not / could not appear in the jar provided, instead it should look like for example:
goog.addDependency('dojo/dom/query.js', ['goog.dom.query'], ['goog.array', 'goog.dom', 'goog.functions', 'goog.string', 'goog.userAgent']);
(that it to say, remove the relative path and make it look like the other dep lines)
2) removed deps.js and base.js from the -third-party jar entirely.

I readily agree that having no mention of third-party in the main jar deps.js and only referring to it in third-party.jar is prettier, but AFAIU closure compiler expects a single deps.js with all dependencies and IIRC will not merge multiple partial deps files (not sure about this, didn't test well enough). This behavior seems to be borne out by the addition of a third-party dependency resulting in existing libraries no longer working.

Possibly nicer than my solution would be to have a deps.js skipping the third party deps present in google-closure-library.jar but for google-closure-library-third-party.jar to have the full set of both, however I had no time to try this option.



 Comments   
Comment by David Nolen [ 17/Jun/12 12:07 PM ]

Would be nice if someone else could confirm this is a problem. Have you checked on the mailing list?

Comment by Alexander Kellett (lypanov) [ 17/Jun/12 12:17 PM ]

Nope but I have experience already with use of closure compiler and have seen the same mistake made by others. As soon as I find the time (alas OSS commits are lower priority than keeping the company I work for afloat) I'll come up with a patch.

Comment by Robert Stuttaford [ 02/Aug/12 2:25 AM ]

I can confirm this behaviour.

With ClojureScript 1443, if I include [org.clojure/google-closure-library-third-party "0.0-1376"] in my project.clj, then none of the goog.* namespaces are added to the js produced by :whitespace mode. If I exclude this dependency, then goog.* namespaces appear in the js produced by :whitespace mode.

I'm concerned at the level of spelunking I'll have to do to get this working (looking at Alexander's fixes above), as I need to be able to build this project on multiple developer machines as well as on Jenkins. I won't be able to simply depend on leiningen to handle dependencies any more.

Is it possible to have these two jars updated such that they can work together?

I can provide a sample leiningen project to reproduce this, if you need it.

Comment by Alexander Kellett (lypanov) [ 02/Aug/12 4:39 AM ]

Robert I use:

[org.clojars.lypanov/google-closure-library-repackaged "0.0-1376"]
[org.clojars.lypanov/google-closure-library-third-party-repackaged "0.0-1376"]

Both are available on clojars.

And then peppered :exclusions [org.clojure/google-closure-library]'s around my project.clj where ever needed.

Comment by Alexander Kellett (lypanov) [ 02/Aug/12 8:52 AM ]

Pinged Stuart Sierra on Twitter hoping for some information.

My last post on the topic (a while back) to the mailing list wasn't allowed through.

Just sent in my CA.

Comment by Stuart Sierra [ 03/Aug/12 7:29 AM ]

I'm looking at this now. It would be helpful if someone could explain what is different about https://clojars.org/org.clojars.lypanov/google-closure-library-repackaged that makes it work.

Comment by Alexander Kellett (lypanov) [ 03/Aug/12 7:47 AM ]

Hey Stuart. The issue's description explains how to fix issue (section starting with "I have locally fudged the uploaded jar's such that they work as expected for my project, namely.").

Thanks for looking into it!

Comment by Stuart Sierra [ 03/Aug/12 7:54 AM ]

Uploaded two patch files for the contents of google-closure-library-0.0-1376.jar and google-closure-library-third-party-0.0-1376.jar

These patches are based on the repackaged versions by https://clojars.org/users/lypanov

Can someone confirm that JARs based on these patches will work?

Comment by Alexander Kellett (lypanov) [ 03/Aug/12 8:01 AM ]

Yup, looks good!

Comment by Stuart Sierra [ 03/Aug/12 9:28 AM ]

Pushed some new release scripts into the ClojureScript GitHub repo:
https://github.com/clojure/clojurescript/commit/cb95d651f6671fca534ade864408e8f1d04524ea

Please verify that they produce main and third-party Google Closure Library JARs which work correctly.

Comment by Stuart Sierra [ 05/Aug/12 8:50 PM ]

I have staged some JARs based on these scripts in the Sonatype OSS repository. You can try them out with a project.clj file like this:

(defproject tryme "0.1.0-SNAPSHOT"
  :dependencies [[org.clojure/clojure "1.4.0"]
                 [org.clojure/clojurescript "0.0-1450"]
                 [domina "1.0.0"]
                 [org.clojure/google-closure-library "0.0-1376-2"]
                 [org.clojure/google-closure-library-third-party "0.0-1376-2"]]
  :exclusions [org.clojure/google-closure-library
               org.clojure/google-closure-library-third-party
               goog-jar]
  :repositories {"sonatype-staging"
                 "https://oss.sonatype.org/content/groups/staging/"})

Please try this out and report the third-party Google Closure Library extensions work correctly.

Comment by Stuart Sierra [ 10/Aug/12 10:37 AM ]

These JARs have now been released to Maven Central, so you can use them without the special :repositories in your project.clj

Comment by Stuart Sierra [ 21/Sep/12 7:41 AM ]

POM template in ClojureScript has been updated.

Comment by Andrea Richiardi [ 15/Jan/16 7:40 PM ]

By the way, I am looking into repackaging this for replumb and it looks like deps.js has been deprecated in the third-party folder.





[CLJS-1544] cljs.test REPL reload support Created: 13/Jan/16  Updated: 13/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.228
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

When adding a test to a test ns that uses cljs.test and re-loading (via require + :reload) that namespace in the REPL after saving the file - invoking run-tests does not include the newly added test.






[CLJS-1543] Support Closure libs using goog.module Created: 12/Jan/16  Updated: 13/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Juho Teperi Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

goog.module is a new way to define Closure namespaces: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide

It is used for example in https://github.com/google/incremental-dom

I didn't do full check of how Closure libraries are handled, but one function which is definitely used by cljs.closure is cljs.js-deps/find-classpath-lib which calls cljs.js-deps/parse-js-ns to read a JS file and parse module information from it. Currently the function reads lines before first function declaration and uses a regex to find goog.provide and goog.require calls. Probably Closure Compiler has some built-in functionality to parse files which could be leveraged.

Besides reading module information from files, another question is if using goog.module defined namespaces for traditional/legacy namespaces generated by ClojureScript compiler needs something special. When goog.module is required, goog.require returns the exported object but no global is set. There is however a function to create the globals: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide#how-do-i-use-a-googmodule-from-a-traditional-closure-file

Notes:

  • Can we still assume that goog.requires all occur before first function declaration?
    • Would be fixed by using possible Closure Compiler functionality
    • Class com.google.javascript.jscomp.deps.JsFileParser looks promising
  • "GCL hasn't switched to it so it may be something driven by some users not something that Google uses more broadly" (David at slack)





[CLJS-349] cljs.compiler: No defmethod for emit-constant clojure.lang.LazySeq Created: 30/Jul/12  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Julien Fantin Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File 0001-CLJS-349-Allow-ISeq-to-be-emitted-by-macros-as-a-con.patch     File fixbug349.diff    

 Description   

The cljs compiler errors when trying to emit-constant for a clojure.lang.LazySeq.

Example : https://www.refheap.com/paste/3901

Here syms is defined as a LazySeq on line 3, then on line 7 it is quoted. The error is included in the refheap.

Emitting a cljs.core.list for this type seems to solve the issue.



 Comments   
Comment by David Nolen [ 31/Aug/12 9:27 AM ]

Can you identify precisely where a LazySeq is getting emitted here? A LazySeq is not literal so this seems like a bug in the macro to me. I could be wrong. Thanks!

Comment by Herwig Hochleitner [ 28/Oct/12 9:31 PM ]

The lazy seq seems to be introduced on line 7, the '~syms form

`(let [mappings# (into {} (map-indexed #(identity [%2 %1]) '~syms))

Clojure allows lazy-seqs to be embedded: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L4538

As an aside: The relevant protocol is not literality, but the print-dup multimethod. Do / Should we have print-dup in CLJS?

Comment by Herwig Hochleitner [ 31/Oct/12 10:10 PM ]

Attached patch 0001 doesn't add a case for LazySeq, but folds two cases for PersistentList and Cons into one for ISeq.

Comment by David Nolen [ 19/Nov/13 9:28 PM ]

This approach seems acceptable but this is an old patch can we update for master?





[CLJS-375] loop doesn't seem to preserve tag information as evidenced by extra cljs.core.truth_ calls Created: 06/Sep/12  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None





[CLJS-712] resolve-var for symbol with dot still wrong Created: 03/Dec/13  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

We need to recur on the first segment passing an new additional argument to resolve-var indicating that we should not try to resolve in the current namespace and instead warn.






[CLJS-719] this-as behaves incorrectly in "scoping function" Created: 07/Dec/13  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Major
Reporter: Kevin Marolt Assignee: David Nolen
Resolution: Unresolved Votes: 1
Labels: None


 Description   

When a this-as expression gets put in a "scoping function", e.g. in a let-binding, the value bound via this-as refers to the scoping function, and not to the outer scope.

Example:

(def foo
  (js-obj
    "bar" "baz"
    "getBarRight" (fn [] (this-as self (.-bar self)))
    "getBarWrong" (fn []
                    (let [bar (this-as self (.-bar self))]
                      bar))))
     
(.log js/console (.getBarRight foo)) ;; => "baz"
(.log js/console (.getBarWrong foo)) ;; => undefined

Whereas foo.getBarRight expands to something like

function() {
  var self = this; // this refers to foo
  return self.bar; // returns "bar"
}

foo.getBarWrong on the other hand expands to

function() {
  var bar = function() {
    var self = this; // this refers to enclosing function
    return self.bar; // returns undefined
  }();
  return bar; // returns undefined
}





[CLJS-868] no arity warnings on recursive calls Created: 03/Oct/14  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Major
Reporter: David Nolen Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: None

Attachments: File cljs_868_14_Nov_2015.md     Text File cljs_868_14_Nov_2015.patch    

 Description   

If a function recursively invokes itself within its own body the invoke will not be checked for arity mismatch.



 Comments   
Comment by Samuel Miller [ 10/Aug/15 10:06 PM ]

Took some time to look at this issue. Originally thought "Do what loop/recur does" but that does not take into account multi-arity. It seems like maybe the best option is to somehow use the second pass of the analyze(analyze-fn-methods-pass2). The entire information about the function is present and the warning section of the code gets triggered but because of no-warn is ignored. Any other ideas for a solution to this?

Comment by Samuel Miller [ 14/Nov/15 7:47 PM ]

So I am looking for feed back on this patch and I will try to explain the reasoning for each section.

The issue is that a function only knows about it's arity after it has been parsed once.
So we need to check arity issues on the second pass

First off, added two new variables.
-activate-second-pass-warnings:Boolean Basically if you want to have second-pass warnings turned on
-second-pass-cljs-warnings:Set Right now we only have :fn-arity but I figure might as well make it generic.

So first up if the modifications to the analyze-fn-methods-pass2 function.
Instead of using no-warn marco here we have some new functionality.
The goal is to turn everything off except the second-pass warnings

So if activate-second-pass-warnings is false just use no-warn else it will use the new section of code.

The default-warning-handler was also modified. After checking if a warning is on, it checks if the warning is a second-pass warning and
if that warning can now be activated. If activate-second-pass-warnings is false AND a warning is still on that implies it is a second pass warning
in the second pass so we activate it.

Also I tried to keep all modifications in cljs.analyzer.

Originally I had the cljs-warnings :fn-arity to false and it would only be turned on in the second pass.
However the repl section just sets everything to true (and turns off select parts like ns errors).
So I decided to not touch those sections and instead keep how other files interface with the analyzer the same.

Comment by Samuel Miller [ 16/Nov/15 10:58 PM ]

Just realized that I have the patch marked as .md instead of .patch





[CLJS-434] ClojureScript compiler prepends "self__" to defmulti forms when metadata in form of ^:field. Created: 01/Dec/12  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Andrew Mcveigh Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: bug
Environment:

Mac OS X (10.7), java version "1.6.0_37", leiningen 2 preview 10, cljsbuild 0.2.9.
clojure/clojurescript master 01 December 2012 - 5ac1503



 Description   

Using the def form, with the specific metadata ^:field causes the cljs compiler
to prepend "self__" to the output js form.

The browser (latest chrome/firefox) does not recognize "self__".

Test Case: Tested against master: 5ac1503
-------------

(ns test-def)

(def ^:foo e identity)
e
; test_def.e = cljs.core.identity;
; test_def.e;

(def ^:field f identity)
f
; test_def.f = cljs.core.identity;
; self__.test_def.f;
; Uncaught ReferenceError: self__ is not defined

https://gist.github.com/4185793



 Comments   
Comment by Brandon Bloom [ 01/Dec/12 5:37 PM ]

code tags

Comment by David Nolen [ 20/Jan/13 12:54 AM ]

This one is a bit annoying. We should probably use namespaced keywords internally.





[CLJS-744] ISequential types should implement JS indexOf, lastIndexOf Created: 05/Jan/14  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None





[CLJS-773] Use unchecked-*-int functions for real 32-bit math Created: 26/Feb/14  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Minor
Reporter: Francis Avila Assignee: Francis Avila
Resolution: Unresolved Votes: 0
Labels: numerics
Environment:

r2173



 Description   

Currently the unchecked-* functions and macros simply alias the primitive js operators. It would be nice if the unchecked-*-int family of functions and macros implemented C/Java-like signed int operations with silent overflows (just like in Clojure) using asm.js coersion idioms. This should also allow us to share such code between clojure and clojurescript without worrying about their different numerics.

A use case is that porting hash algorithms from java to clojurescript is trickier and more verbose than it needs to be.



 Comments   
Comment by David Nolen [ 08/May/14 6:43 PM ]

This sounds interesting, would like to see more thoughts on approach, benchmarks etc.

Comment by David Nolen [ 02/Dec/14 5:46 AM ]

Bump, this enhancements sound simple & fine.

Comment by Francis Avila [ 02/Dec/14 1:26 PM ]

I'll have time to do this in about a week. The implementation is straightforward (basically use xor 0 everywhere). The goal is correctness, but I expect performance to be as good as or better than it is now on most platforms. I'm not sure if advanced mode will drop intermediate truncations or what impact this has on performance.

Some higher-level numeric analysis using the asm.js type system is possible but I doubt it's worth it.

Comment by Francis Avila [ 16/Mar/15 11:14 AM ]

I completely forgot about this, sorry. I see you have scheduled it for the "next" release. Are you assigning it as well or will you still accept a patch?

Comment by David Nolen [ 16/Mar/15 11:26 AM ]

Be my guest





[CLJS-871] .-default property access returns nil Created: 11/Oct/14  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Joel Holdbrooks Assignee: Unassigned
Resolution: Unresolved Votes: 1
Labels: None

Attachments: Text File 871.patch     Text File 871.patch    
Patch: Code and Test

 Description   

Types defined with deftype/defrecord which have a default field will incorrectly return nil with property access. The following example will return nil.

(deftype Foo [default])

(let [foo (Foo. "bar")]
  (.-default foo))


 Comments   
Comment by Joel Holdbrooks [ 13/Oct/14 4:19 PM ]

Patch attached. I should point out that I had to borrow js-reserved from the compiler namespace and the warning message provided hard codes the munged symbol information instead of reusing the compiler's munge fn.

Comment by Joel Holdbrooks [ 13/Oct/14 9:41 PM ]

For the sake of history, I should provide more context to this patch (I'm unable to edit the issue title for some reason). It isn't just .-default it is any field name that is also a JavaScript identifier (eg. public, private, if).

Comment by David Nolen [ 14/Oct/14 5:26 AM ]

Please lift js-reserved and any helpers like munge into the shared namespace cljs.util so that logic an be shared and hard coding avoided. Thanks.

Comment by Joel Holdbrooks [ 14/Oct/14 5:03 PM ]

Are you sure, David? That might make this patch a bit more noisy. If it's not a problem I'm happy to do it.

Comment by David Nolen [ 14/Oct/14 6:06 PM ]

I'm sure, I'd like to avoid this kind of code duping. Cleaner in the end and better moving forward.

Comment by Joel Holdbrooks [ 18/Mar/15 11:43 AM ]

Updated to use new refactorings

Comment by David Nolen [ 18/Mar/15 11:46 AM ]

The warning is not desirable. Instead we should just munge and ensure property access always works.





[CLJS-994] print a warning when :externs file paths can't be found. Created: 30/Jan/15  Updated: 11/Jan/16

Status: Reopened
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Minor
Reporter: Crispin Wellington Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: cljs, enhancement, errormsgs, patch,
Environment:

Linux 64bit

java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.3) (7u71-2.5.3-0ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode)


Attachments: Text File clojurescript-extern-missing-warning.patch    
Patch: Code

 Description   

clojurescript silently ignores missing externs files possibly leading a developer to chase their tail.

Presently it can be very confusing using advanced compilation if you have made a mistake in the path name of one of your :externs files. This patch makes the compiler print a warning on stderr so you can quickly determine the cause of the broken advanced compilation output.

As a side effect, when doing a basic lein-cljsbuild a warning is always printed:

```
WARNING: js resource path closure-js/externs does not exist
```

This is because lein-cljsbuild quietly adds this extra path to your :externs listing without you knowing.



 Comments   
Comment by David Nolen [ 31/Jan/15 1:59 PM ]

You need to bind *out* to *err*, or just print to it directly a la cljs.util/debug-prn.

Comment by Crispin Wellington [ 31/Jan/15 7:30 PM ]

I did bind out to err. Check the patch.

Comment by David Nolen [ 01/Feb/15 12:30 PM ]

Crispin, oops sorry you are correct. Thanks.

Comment by David Nolen [ 13/Mar/15 7:33 AM ]

fixed https://github.com/clojure/clojurescript/commit/5f66a78bf469a9875e51aa39c29d3e66ce890eb4

Comment by David Nolen [ 14/Mar/15 5:55 AM ]

The solution does not work for cljsbuild. It's unclear why there so much machinery in place over the approach taken for deps.clj.

Comment by David Nolen [ 15/Mar/15 10:37 AM ]

Stalled on this cljsbuild issue https://github.com/emezeske/lein-cljsbuild/issues/383

Comment by Crispin Wellington [ 23/Mar/15 2:50 AM ]

This lein-cljsbuild issue is what made me make it just a warning initially, and not a hard error like raising IllegalArgumentException does. Though I agree it should be a hard error. If we start with a warning, it enables the immediate problem for the developer to be resolved, and leaves a wart that the cljs-build project can then see that need fixing on their end. Then when that end is fixed it could be made a hard error. If cljsbuild is fixed fairly soon then all is well, but if it takes a long time, a warning might be a good first step.





[CLJS-1070] top-level boolean inference does not work Created: 28/Feb/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

Problem for using boolean Closure defines



 Comments   
Comment by Francis Avila [ 30/Mar/15 12:02 PM ]

I am unsure if this is the same issue, but forms like ^boolean (js/isFinite n) also do not seem to analyze correctly: if, and, and or will still emit a call to truth_.





[CLJS-1125] Simple corrupted compiled file detection Created: 16/Mar/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

We should include a line at the end of the file that we check for to determine that the file was not corrupted due to either an incomplete write or a clobbered write. It should be be the SHA of the ClojureScript source it was generated from.






[CLJS-1127] validate compiled file written to disk Created: 16/Mar/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

If we validate the file written to disk then we can catch common error of running multiple build processes and abort.






[CLJS-1128] Describe internationalization strategies via Google Closure on the wiki Created: 16/Mar/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Task Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: documentation, newbie


 Description   

This can be done via Google Closure defines or via pulling a specific locale. A page should document how this can be done.






[CLJS-1141] memoization of js-dependency-index and get-upstream-deps needs knobs Created: 18/Mar/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File CLJS_1141.patch     Text File CLJS-1141-with-js-dep-caching-latest.patch    

 Description   

knobs should be exposed for more dynamic compilation environments like Figwheel which may desire to add dependencies to the classpath on the fly.



 Comments   
Comment by Bruce Hauman [ 21/Mar/15 3:51 PM ]

A patch that caches upstream dependencies in the compiler env.

Comment by Bruce Hauman [ 21/Mar/15 3:59 PM ]

Actually I'm going to submit another patch that includes the memoize calls in js-deps.

Comment by Bruce Hauman [ 28/Mar/15 12:50 PM ]

New patch that moves cljs.js-deps memoization to current env/compiler as well as get-upstream-deps.

Unfortunately there is a circular dep between cljs.env and cljs.js-deps, if we want to cache in env/compiler. I overcame this with a resolve.

Compile performance is either completely unchanged or slightly improved based on several test runs.

Comment by Bruce Hauman [ 28/Mar/15 2:22 PM ]

Hold off on this. Its not behaving as expected. Doesn't seem to be caching in certain situations.

Comment by David Nolen [ 28/Mar/15 2:26 PM ]

Thanks for the update. This will definitely not land until after the pending REPL/piggieback release anyhow.

Comment by Bruce Hauman [ 28/Mar/15 2:44 PM ]

Yeah there is an obvious bug and a subtle one. Hopefully will finish it up soonish.

Comment by Bruce Hauman [ 28/Mar/15 3:43 PM ]

Alright, this latest patch works. There was a subtle memoizing nil value bug.





[CLJS-1147] reconnect logic for browser REPLs Created: 18/Mar/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

Instead of forcing users to refresh browser and lose application state, the browser REPL should poll once a second to connect if connection is unreachable for some reason.



 Comments   
Comment by David Nolen [ 21/Mar/15 8:56 PM ]

This is firmly a major nice-to-have, but not a blocker.





[CLJS-1194] data_readers.cljc Created: 10/Apr/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 1
Labels: None


 Description   

Now that conditional reading has landed we can implement support for data_readers.cljc to get both compile time and runtime support.



 Comments   
Comment by David Nolen [ 10/Apr/15 7:45 PM ]

This needs http://dev.clojure.org/jira/browse/CLJ-1699 to be useful.

Comment by Nikita Prokopov [ 19/May/15 7:58 AM ]

CLJ-1699 has landed.

Right now CLJS tries to compile data_readers.cljc as a regular source code file:

Exception in thread "main" java.lang.AssertionError: No ns form found in src/data_readers.cljc, compiling:(/private/var/folders/0h/9vv4g3d955l6ctwwl4k9xjy40000gn/T/form-init3533791126017861878.clj:1:125)
	at clojure.lang.Compiler.load(Compiler.java:7249)
	at clojure.lang.Compiler.loadFile(Compiler.java:7175)
	at clojure.main$load_script.invoke(main.clj:275)
	at clojure.main$init_opt.invoke(main.clj:280)
	at clojure.main$initialize.invoke(main.clj:308)
	at clojure.main$null_opt.invoke(main.clj:343)
	at clojure.main$main.doInvoke(main.clj:421)
	at clojure.lang.RestFn.invoke(RestFn.java:421)
	at clojure.lang.Var.invoke(Var.java:383)
	at clojure.lang.AFn.applyToHelper(AFn.java:156)
	at clojure.lang.Var.applyTo(Var.java:700)
	at clojure.main.main(main.java:37)
Comment by David Nolen [ 19/May/15 8:53 AM ]

This should be addressed first: http://dev.clojure.org/jira/browse/CLJS-1277





[CLJS-1129] :modules tutorial for wiki Created: 16/Mar/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Task Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: documentation, newbie


 Description   

The documentation is nice but something that walks people through the steps would be nicer.






[CLJS-1133] REPL require results in warnings to be emitted twice Created: 17/Mar/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Mike Fikes Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None
Environment:

Quick Start Browser REPL with :watch off



 Description   

Run through the Quick Start and go down through to the Browser REPL portion (https://github.com/clojure/clojurescript/wiki/Quick-Start#browser-repl), but exclude the :watch option from repl.clj.

Then further down, where the new symbol is introduced

;; ADDED
(defn foo [a b]
  (+ a b))

instead cause some duplicate symbols to be introduced in order to provoke compiler warnings:

(def a 1)
(def a 1)

(defn foo [a b]
  (+ a b))
(defn foo [a b]
  (+ a b))

Then evaluate the require statement in the tutorial and observe that the warnings are emitted twice:

ClojureScript:cljs.user> (require '[hello-world.core :as hello])
WARNING: a at line 11 is being replaced at line 12 /Users/mfikes/Desktop/hello_world/src/hello_world/core.cljs
WARNING: foo at line 14 is being replaced at line 16 /Users/mfikes/Desktop/hello_world/src/hello_world/core.cljs
WARNING: a at line 11 is being replaced at line 12 /Users/mfikes/Desktop/hello_world/src/hello_world/core.cljs
WARNING: foo at line 14 is being replaced at line 16 /Users/mfikes/Desktop/hello_world/src/hello_world/core.cljs
nil





[CLJS-1134] Lift protocols from cljs.closure into cljs.protocols ns Created: 17/Mar/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Task Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

This is task towards presenting a stable API to users without reaching into the implementation namespaces.






[CLJS-1136] Initial require fails to fully load added symbols Created: 17/Mar/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Mike Fikes Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None
Environment:

Quick Start Browser REPL (OS X / Safari)



 Description   

In the Quick Start, a portion runs the user through adding a symbol (a function named foo) and then requiring the namespace and using that symbol. I'm finding that require fails and that I need to add the :reload directive.

To reproduce:

  1. Run through the Quick Start up through the browser REPL section.
  2. Set src/hello_world/core.cljs so that it does not have the foo function defined.
  3. Remove the out directory: rm -rf out
  4. Start up the REPL: rlwrap java -cp cljs.jar:src clojure.main repl.clj
  5. Connect Safari by going to http://localhost:9000
  6. Show the error console in Safari. (You'll see Hello world.)
  7. Run tail -f out/watch.log
  8. Add the foo function that adds a b to src/hello_world/core.cljs and save it.
  9. Observe that watch.log reflects recompilation
  10. Do {{ (require '[hello-world.core :as hello]) }}
  11. Do {{ (hello/foo 2 3) }}

At this point you will get:
TypeError: undefined is not an object (evaluating 'hello_world.core.foo.call')

But:

ClojureScript:cljs.user> (ns-interns 'hello-world.core)
{foo #'hello-world.core/foo, conn #'hello-world.core/conn}
ClojureScript:cljs.user> (source hello/foo)
(defn foo [a b]
  (+ a b))
nil

Now, if you :reload

ClojureScript:cljs.user> (require '[hello-world.core :as hello] :reload)
nil
ClojureScript:cljs.user> (hello/foo 2 3)
5


 Comments   
Comment by Mike Fikes [ 17/Mar/15 11:30 AM ]

Prior to step 8:

ClojureScript:cljs.user> (ns-interns 'hello-world.core)
{}

Between steps 9 and 10:

ClojureScript:cljs.user> (ns-interns 'hello-world.core)
{foo #'hello-world.core/foo, conn #'hello-world.core/conn}

My guess: Watching is causing symbols to be interned, but not usable, and this is interfering with require forcing you to include :reload.

Comment by David Nolen [ 22/Mar/15 9:46 AM ]

I'm not sure that this is actually an issue, the browser has already required the namespace, it's the entry point. Thus you really do need a :reload. But the reason you see interned symbols is that the watch process shares the compilation environment with the REPL. It may be the case that with the dramatically improved REPLs the watch option becomes entirely unnecessary and counterintuitive, let's see how it goes.





[CLJS-1139] Repeated applications of `ns` form at the REPL are not additive Created: 17/Mar/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Michael Griffiths Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None
Environment:

Quick start guide with Node REPL



 Description   

In a Clojure REPL, it is possible to declare the same namespace again, without existing namespaces aliases being altered or removed:

user=> (ns my-test-ns.core (:require [clojure.string :as string]))
nil
my-test-ns.core=> (def a string/blank?)
#'my-test-ns.core/a
my-test-ns.core=> (ns my-test-ns.core)
nil
my-test-ns.core=> (def a string/blank?)
#'my-test-ns.core/a
my-test-ns.core=>

ClojureScript REPLs do not behave in the same way:

ClojureScript:cljs.user> (ns my-test-ns.core (:require [clojure.string :as string]))
true
ClojureScript:my-test-ns.core> (def a string/blank?)
#<function clojure$string$blank_QMARK_(s){
return goog.string.isEmptySafe(s);
}>
ClojureScript:my-test-ns.core> (ns my-test-ns.core)
nil
ClojureScript:my-test-ns.core> (def a string/blank?)
WARNING: No such namespace: string, could not locate string.cljs at line 1 <cljs repl>
WARNING: Use of undeclared Var string/blank? at line 1 <cljs repl>
repl:13
throw e__3919__auto__;
      ^
ReferenceError: string is not defined
    at repl:1:109
    at repl:9:3
    at repl:14:4
    at Object.exports.runInThisContext (vm.js:74:17)
    at Domain.<anonymous> ([stdin]:41:34)
    at Domain.run (domain.js:197:16)
    at Socket.<anonymous> ([stdin]:40:25)
    at Socket.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:163:16)
    at Socket.Readable.push (_stream_readable.js:126:10)
ClojureScript:my-test-ns.core>





[CLJS-1159] compiled files with warnings that otherwise don't need recompilation will not emit warnings on the next compile Created: 23/Mar/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 1
Labels: None


 Description   

The aggressive caching approach is odds with warning visibility. It probably makes sense for a compiled file with warnings to always return true for requires-compilation?.






[CLJS-1174] Simple warning if a namespace with dashes not found but a file path with dashes exists Created: 27/Mar/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: easy





[CLJS-1195] generic reusable command line argument parsing for REPLs Created: 10/Apr/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: newbie


 Description   

REPLs are more or less started in the same way and all the builtin ones provide a -main entry point. We should supply reusable command line argument parsing that any REPL can use to get standard command line driven start.






[CLJS-1207] Emit a warning if multiple resources found for a ClojureScript namespace Created: 15/Apr/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

We should emit a simple warning if a namespace doesn't not appear to be unique on the classpath.






[CLJS-1277] relax requirement that files must declare a namespace, default to cljs.user Created: 19/May/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

This aligns better with Clojure itself supports.



 Comments   
Comment by David Nolen [ 14/Jun/15 10:30 AM ]

There are a few hurdles in order to make progress on this ticket. The first is that in order to be useful something like require etc. outside the ns needs to be supported in order to be useful.

Comment by Jonathan Boston [ 18/Jul/15 12:17 PM ]

Needs http://dev.clojure.org/jira/browse/CLJS-1346 to be useful.





[CLJS-1297] defrecord does not emit IKVReduce protocol Created: 03/Jun/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Major
Reporter: Daniel Skarda Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: newbie

Attachments: Text File CLJS-1297-19-July-2015.patch    

 Description   

Records are maps and in Clojure they support reduce-kv (IKVReduce protocol).
This is not true in ClojureScript:

(defrecord Foobar [x y])
 (reduce-kv assoc {} (Foobar. 1 2))

Fails wit Error: No protocol method IKVReduce.-kv-reduce defined for type : [object Object]



 Comments   
Comment by David Nolen [ 03/Jun/15 7:25 PM ]

Just seems like an oversight. Patch welcome, this one is a relatively easy one.

Comment by Daniel Skarda [ 04/Jun/15 2:53 AM ]

OK

I checked Clojure implementation. Records do not implement any reduce protocol on their own. For IKVReduce records use default implementation using reduce and destructuring. Is this approach OK?

Recently Alex Miller implemented many optimizations of reduce protocols in Clojure. Eg range returns an object which implements IReduce protocol so reduce (and transducers in general) can take advantage of it. Any plans for such optimizations in ClojureScript?

;;clojure/src/clj/clojure/core.clj:6523
;;slow path default
clojure.lang.IPersistentMap
(kv-reduce 
  [amap f init]
  (reduce (fn [ret [k v]] (f ret k v)) init amap))
Comment by David Nolen [ 04/Jun/15 9:05 AM ]

Going with the Clojure implementation is fine. Yes all of the optimizations in 1.7.0 are on the table for ClojureScript but these are separate issues from this one.

Comment by Samuel Miller [ 16/Jul/15 10:39 PM ]

Mind if I take this as my first cljs bug? Poking around quickly I think I know what needs to happen.

Comment by David Nolen [ 17/Jul/15 5:21 AM ]

Sure! Have you submitted your CA yet?

Comment by Samuel Miller [ 17/Jul/15 7:13 PM ]

Yes, I did yesterday.

Comment by Samuel Miller [ 20/Jul/15 9:52 PM ]

Here is a potential patch. I implemented a basic IKVreduce based on Daniel Skarda's comment. Note: I am a little fuzzy on macros still so please look over what I have. There is probably a better way. Also added a test for reduce-kv on records.

I ran the test on Linux on V8 and SpiderMonkey. I plan to get JSC and Nashorn working and tested this week but if someone wants to test them out before that would be great.

Comment by Sebastian Bensusan [ 23/Jul/15 6:45 PM ]

Experience report:

I just tested the patch in the Node Repl and it seems to work:

cljs.user=> (defrecord A [a b])
cljs.user/A
cljs.user=> (reduce-kv (fn [m k v] (assoc m k (inc v))) {} (A. 1 2))
{:a 2, :b 3}

and the provided tests passed in Spidermonkey, V8, and Nashorn (I don't have JSC installed).

For completeness: before applying the patch the same code fails with:

Error: No protocol method IKVReduce.-kv-reduce defined for type : [object Object]
Comment by David Nolen [ 10/Aug/15 10:22 PM ]

Is this the same approach taken by Clojure?

Comment by Samuel Miller [ 10/Aug/15 10:36 PM ]

You can see the relevant current Clojure code here...
https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L6526
I think it is the same. I literally just tried to translate it over into CLJS. I might of understood something wrong though.

Comment by David Nolen [ 11/Aug/15 6:10 AM ]

Yes that's the slow path. Please use the implementation used by defrecord instead. If defrecord doesn't have one then this patch is OK.

Comment by Samuel Miller [ 11/Aug/15 8:48 PM ]

As far as I can tell there is no implementation on defrecord itself however there are separate implementations on the the java classes PersistentVector, PersistentArrayMap, PersistentTreeMap, and PersistenHashMap in pure java. I am not sure if you would want to do something similar for Clojurescript.

I can also spend some time trying to make a more performant version.





[CLJS-1328] Support defrecord reader tags Created: 04/Jul/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Major
Reporter: Herwig Hochleitner Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: reader, readertags


 Description   

Currently, defrecord instances print similar to how they do in clojure

> (pr-str (garden.units/px 5))
#garden.types.CSSUnit{:unit :px, :magnitude 5}

This representation cannot be read by the compiler, nor at runtime by cljs.reader/read-string

> #garden.types.CSSUnit{:unit :px, :magnitude 5}
clojure.lang.ExceptionInfo: garden.types.CSSUnit {:type :reader-exception, :line 1, :column 22, :file "NO_SOURCE_FILE"}
...
> (cljs.reader/read-string "#garden.types.CSSUnit{:unit :px, :magnitude 5}")
#<Error: Could not find tag parser for garden.types.CSSUnit in ("inst" "uuid" "queue" "js")>
...

Analysis

The two requirements - using record literals in cljs source code and supporting runtime reading - can be addressed by using the analyzer to find defrecords and registering them with the two respective reader libraries.

Record literals

Since clojurescript reads and compiles a file at a time, clojure's behavior for literals is hard to exactly mimic. That is, to be able to use the literal in the same file where the record is defined.
A reasonable compromise might be to update the record tag table after each file has been analyzed. Thus the literal form of a record could be used only in requiring files.

EDIT: Record literals can also go into the constant pool

cljs.reader

To play well with minification, the ^:export annotation could be reused on defrecords, to publish the corresponding reader tag to cljs.reader.

Related Tickets



 Comments   
Comment by David Nolen [ 08/Jul/15 12:00 PM ]

It's preferred that we avoid exporting. Instead we can adopt the same approach as the constant literal optimization for keywords under advanced optimizations. We can make a lookup table (which won't pollute the global namespace like exporting does) which maps a string to its type.

I'm all for this enhancement.





[CLJS-1350] Compiler support for browser REPL Created: 19/Jul/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 1
Labels: None


 Description   

Currently the browser REPL experience could be considerably enhanced just by eliminating manual configuration in source. Instead REPL configuration could happen via a compiler option. This would make REPL support considerably more robust in the face of user errors while developing.






[CLJS-1373] Generalize CLJS-1324, check invokes of all IFn implementors Created: 28/Jul/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

We currently track all IFn implementors but in order to do arity checking of statically analyzeable invokes of keywords, vector, etc. we need to do a bit more. extend-type should update the type in the compiler state with :method-params :max-fixed-arity and :variadic. Then we can just reuse the existing checks in cljs.analyzer/parse-invoke.






[CLJS-1402] Source Mapping Closure Error Logger Created: 08/Aug/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: type-check


 Description   

Current error reports generated by Google Closure point back to the generated JavaScript sources. For JavaScript source that originated from ClojureScript we should generated source mapped reports.






[CLJS-1443] ES6 Module Processing at individual :foreign-lib spec Created: 09/Sep/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

ES6 module processing could probably benefit from processing at the individual :foreign-lib spec. Brings up questions wrt. source maps and merged source maps when applying other optimization settings.






[CLJS-1222] Sequence of a stateful transducer is producing the wrong answer Created: 24/Apr/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Lucas Cavalcanti Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: bug, cljs, collections
Environment:

OSX 10.10.3, java 1.8.0-ea-b124



 Description   

I'm producing more than one element on the 1-arity of the transducer, and sequence is only considering the last one.

Here is the transducer and the tests that fail for sequence:

(defn sliding-window [n]
  (fn [rf]
    (let [a #js []]
      (fn
        ([] (rf))
        ([result]
         (loop [] ;; Here I'm emitting more than one element
           (when (not-empty a)
             (rf result (vec (js->clj a)))
             (.shift a)
             (recur))))
        ([result input]
         (.push a input)
         (if (== n (.-length a))
           (let [v (vec (js->clj a))]
             (.shift a)
             (rf result v))
           result))))))

;;This test fails! =(
(deftest sliding-window-in-a-sequence
  (is (= [[5 4 3]
          [4 3 2]
          [3 2 1]
          [2 1]
          [1]]
         (sequence (sliding-window 3) [5 4 3 2 1])))

  (is (= [[2 1]
          [1]]
         (sequence (sliding-window 3) [2 1]))))


 Comments   
Comment by Lucas Cavalcanti [ 24/Apr/15 11:18 AM ]

I could make it work by recurring on the result.

([result]
  (loop [res result]
    (if (not-empty a)
      (let [v (vec (js->clj a))]
        (.shift a)
        (recur (rf res v)))
      res)))

even so it's weird that the previous version behaves differently on core.async and sequences in cljs and clj

Comment by David Nolen [ 26/Apr/15 4:04 AM ]

Please demonstrate the problem without core.async. Thanks.

Comment by Lucas Cavalcanti [ 26/Apr/15 7:32 PM ]

Hi,

the last test I posted on the ticket, fails in cljs, but not in clj:

;;This test fails! =(
(deftest sliding-window-in-a-sequence
  (is (= [[5 4 3]
          [4 3 2]
          [3 2 1]
          [2 1]
          [1]]
         (sequence (sliding-window 3) [5 4 3 2 1])))

  (is (= [[2 1]
          [1]]
         (sequence (sliding-window 3) [2 1]))))
Comment by David Nolen [ 27/Apr/15 7:43 AM ]

I've removed the core.async bits from the description to clarify the issue.

Comment by David Nolen [ 10/May/15 2:40 PM ]

The implementation of sliding-window above does not appear to be correct, it doesn't return the result. This ticket needs more information.

Comment by Lucas Cavalcanti [ 10/May/15 3:51 PM ]

As I said on http://dev.clojure.org/jira/browse/CLJS-1222?focusedCommentId=38620&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-38620

changing the 1-arity of the sliding-window to that fixes the transducer.

The point of this ticket now is that the behavior of the same (wrong) transducer in clj (both core.async and sequence) and cljs (core.async) is different than cljs sequence.





[CLJS-1237] ns-unmap doesn't work on refers from cljs.core Created: 01/May/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Chouser Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: ns-unmap

Attachments: Text File 0001-CLJS-1237-ns-unmap-adds-to-namespace-s-excludes.patch     Text File 0002-CLJS-1237-ns-unmap-adds-to-namespace-s-excludes.patch    
Patch: Code

 Description   

In ClojureScript, using ns-unmap on a symbol from cljs.core doesn't exclude it from the current namespace. Note that both a function and a macro still exist, even after unmapping:

To quit, type: :cljs/quit  
cljs.user=> (ns-unmap 'cljs.user 'when) ;; macro
true  
cljs.user=> (ns-unmap 'cljs.user 'not)  ;; function
true  
cljs.user=> (when 1 2)  
2  
cljs.user=> (not false)  
true  

This differs from the behavior of Clojure's ns-unmap. Note the appropriate errors when attempting to use unmapped symbols:

Clojure 1.7.0-beta1
user=> (ns-unmap 'user 'when) ;; macro
nil
user=> (ns-unmap 'user 'not)  ;; function
nil
user=> (when 1 2)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: when in this context, compiling:(NO_SOURCE_PATH:11:1) 
user=> (not false)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: not in this context, compiling:(NO_SOURCE_PATH:12:1) 

Somehow ClojureScript's ns-unmap needs to add the symbol to the current namespace's :excludes set. Note that the def special form does this already (after it displays a warning).

We have two solutions. 0001 extends the ns form's :merge behavior to support :excludes, and then uses this in ns-unmap. If the enhancement to ns isn't wanted, patch 0002 changes ns-unmap to update :excludes directly.



 Comments   
Comment by David Nolen [ 05/May/15 7:23 AM ]

The second patch is preferred. However it seems the second patch is too permissive. The :excludes logic should only be applied if the symbol identifies a core macro or fn.

Comment by Chouser [ 05/May/15 3:46 PM ]

The ns form's own :refer-clojure :exclude accepts arbitrary symbols and adds them to the namespace's :excludes set, which seems like the same permissiveness problem. Do you want a patch that addresses the permissiveness of both ns and ns-unmap in this ticket, or should such a patch go in a new ticket?

Comment by David Nolen [ 05/May/15 4:08 PM ]

New ticket to fix the bug that :exclude doesn't check the symbol list for cljs.core declared vars, and an updated patch here please.





[CLJS-1238] Setting *main-cli-fn* when using :target :nodejs shouldn't be manditory Created: 01/May/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Minor
Reporter: Jeremy Shoemaker Assignee: Unassigned
Resolution: Unresolved Votes: 1
Labels: None

Attachments: Text File nodejs-main-cli-fn.patch    
Patch: Code

 Description   

Currently, when you use :target :nodejs in the build options for ClojureScript, the resulting code requires you to set *main-cli-fn* to a function.

This prevents someone from writing a library that can be used by JavaScript developers because it forces code execution on require. It also makes writing a CLI tool that can be distributed using NPM less straightforward. I ran into this issue trying to create a Leiningen template for writing CLI tools that could be installed using npm install or npm link. I had a wrapper script to take care of the CLI use-case, and intended to write the ClojureScript module in a more library oriented way, but ran into issues. I could work around this by not using the wrapper script, but it got me thinking about the more general library issue.

I don't see any reason why you should be forced to set *main-cli-fn* and so I'm suggesting making it optional.

Attached is a patch that makes it optional but retains the check for whether the value it is set to is a function in the case where it is set.

This is my first time submitting a change to a project using a git patch and not a pull request, so let me know if I've made the patch wrong.



 Comments   
Comment by Jeremy Shoemaker [ 01/May/15 7:27 PM ]

I just noticed the priority defaulted to "Major". I don't know if I'd say it's major, so feel free to bump it down if that doesn't seem appropriate.





[CLJS-1271] Missing warning when assigning namespaces via def Created: 17/May/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Sebastian Bensusan Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

Currently you can assign a Closure namespace to a var without getting a warning.

Minimal sample:

(ns import-names.core
  (:import [goog debug]))

(def debug goog.debug)


 Comments   
Comment by David Nolen [ 29/May/15 12:30 PM ]

The example case is a bit complected. Besides importing a name that matches a def you are also assigning a google closure namespace to a local. This will likely cause problems on its own. We need more information.

Comment by Sebastian Bensusan [ 29/May/15 12:46 PM ]

We should check that :require ed and :import ed namespaces are not used as values and then warn about it.





[CLJS-1286] REPL environment should be able to provide advice if source mapping fails Created: 23/May/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

For example browser REPL will often need users to supply :host-port, :host, and :asset-path in order to correctly parse files from stacktraces.






[CLJS-1315] Warning on Google Closure enum property access with / Created: 18/Jun/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

Edge case in / usage, EventType/CLICK does not trigger a warning. Foo/bar always means that Foo is a namespace, it cannot be used for the static field access pattern common in Java as there's no reflection information in JavaScript to determine this.






[CLJS-1327] Support Transit JSON for analysis caches Created: 03/Jul/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Task Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

A significant amount of time is spent reading caches both during cold builds and REPL start. Switching to Transit for the analysis cache format should deliver a very large performance boost. Having a direct dep on Transit is undesirable since it is a critical part of existing applications. Instead we could allow users to provide analysis cache encoder/decoder functions to the compiler options. This does mean we cannot use the AoTed analysis for cljs.core if these are provided.






[CLJS-1412] Add JSDoc type information to individual IFn methods Created: 10/Aug/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: type-check


 Description   

Propagate user supplied docstring type information to the various fn arities so that more code may be checked.






[CLJS-1415] Handling JSDoc param name [x] optional syntax Created: 10/Aug/15  Updated: 11/Jan/16

Status: In Progress
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Minor
Reporter: David Nolen Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: type-check





[CLJS-1419] enhance numeric inference, if + number? test on local var should tag local var in the successful branch Created: 12/Aug/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Comments   
Comment by David Nolen [ 12/Aug/15 6:44 AM ]

One small complication is dealing with and as it has an optimizing case.





[CLJS-1344] port Clojure tuples commit Created: 17/Jul/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Task Priority: Trivial
Reporter: David Nolen Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: None

Attachments: Text File 0001-CLJS-1344-port-Clojure-tuples-commit-of-16-July-2015.patch     Text File 0002-CLJS-1344-port-Clojure-tuples-commit-of-16-July-2015.patch     Text File 0003-CLJS-1344-port-Clojure-tuples-commit-of-16-July-2015.patch    

 Description   

See https://github.com/clojure/clojure/commit/36d665793b43f62cfd22354aced4c6892088abd6



 Comments   
Comment by Michał Marczyk [ 18/Jul/15 11:38 AM ]

Patch based on current master.

Comment by Michał Marczyk [ 18/Jul/15 11:50 AM ]

In absence of abstract bases macros seemed like the most straightforward way to keep things DRY. Anything involving transients or metadata still uses PV, as in Clojure.

Comment by Michał Marczyk [ 18/Jul/15 12:04 PM ]

The 0002 patch is the same, except it does NOT change PV's -equiv to check satisfies? IVector rather than instance? PersistentVector. (The 0001 patch does make this change.)

Haven't made up my mind as to whether it's better to switch or not, so I thought I'd prepare both versions.

Comment by Michał Marczyk [ 18/Jul/15 12:25 PM ]

Some benchmark results, for now obtained using SpiderMonkey (I've just realized that I don't have a working V8 setup on this box – which is not the one I normally use for CLJS dev – I'll have to look into fixing that).

On the subject of -equiv, script benchmark says 0002 patch is very slightly faster than 0001 patch, which itself is noticeably faster than master: 633 ms vs 660 ms vs 781 ms in the vector equality benchmark.

The reason both patches are faster than master is undoubtedly their choice to call -count rather than count on the "other thing"; that is 100% justified in the 0002 patch (with instance?) and slightly less justified in the 0001 patch (who could implement IVector without ICounted though?).

Full script/benchmark results:

master
======

Benchmarking with SpiderMonkey
[x 1], (identity x), 1000000 runs, 0 msecs
;; symbol construction
[], (symbol (quote foo)), 1000000 runs, 585 msecs

;; array-reduce & ci-reduce
[coll (seq arr)], (ci-reduce coll + 0), 1 runs, 137 msecs
[coll (seq arr)], (ci-reduce coll sum 0), 1 runs, 735 msecs
[coll arr], (array-reduce coll + 0), 1 runs, 3 msecs
[coll arr], (array-reduce coll sum 0), 1 runs, 297 msecs
;;; instance?
[coll []], (instance? PersistentVector coll), 1000000 runs, 23 msecs
;;; satisfies?
[coll (list 1 2 3)], (satisfies? ISeq coll), 1000000 runs, 21 msecs
[coll [1 2 3]], (satisfies? ISeq coll), 1000000 runs, 32 msecs

;;; array & string ops
[coll (array 1 2 3)], (seq coll), 1000000 runs, 524 msecs
[coll "foobar"], (seq coll), 1000000 runs, 1879 msecs
[coll (array 1 2 3)], (first coll), 1000000 runs, 789 msecs
[coll "foobar"], (first coll), 1000000 runs, 1762 msecs
[coll (array 1 2 3)], (nth coll 2), 1000000 runs, 150 msecs
[coll "foobar"], (nth coll 2), 1000000 runs, 1297 msecs

;;; cloning & specify
[coll [1 2 3]], (clone coll), 1000000 runs, 587 msecs
[coll [1 2 3]], (specify coll IFoo (foo [_] :bar)), 1000000 runs, 1486 msecs
[coll (specify [1 2 3] IFoo (foo [_] :bar))], (foo coll), 1000000 runs, 105 msecs

;;; list ops
[coll (list 1 2 3)], (first coll), 1000000 runs, 214 msecs
[coll (list 1 2 3)], (-first coll), 1000000 runs, 114 msecs
[coll (list 1 2 3)], (rest coll), 1000000 runs, 111 msecs
[coll (list 1 2 3)], (-rest coll), 1000000 runs, 88 msecs
[], (list), 1000000 runs, 13 msecs
[], (list 1 2 3), 1000000 runs, 1691 msecs

;;; vector ops
[], [], 1000000 runs, 9 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count [a b c]), 1000000 runs, 715 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vec #object[cljs.tagged_literals.JSValue 0xd0fabc8 "cljs.tagged_literals.JSValue@d0fabc8"])), 1000000 runs, 972 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vector a b c)), 1000000 runs, 638 msecs
[coll [1 2 3]], (transient coll), 100000 runs, 161 msecs
[coll [1 2 3]], (nth coll 0), 1000000 runs, 323 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 361 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 238 msecs
[coll [1 2 3]], (coll 0), 1000000 runs, 211 msecs
[coll [1 2 3]], (conj coll 4), 1000000 runs, 1284 msecs
[coll [1 2 3]], (-conj coll 4), 1000000 runs, 1071 msecs
[coll []], (-conj coll 1), 1000000 runs, 1067 msecs
[coll [1]], (-conj coll 2), 1000000 runs, 1133 msecs
[coll [1 2]], (-conj coll 3), 1000000 runs, 835 msecs
[coll [1 2 3]], (seq coll), 1000000 runs, 472 msecs
[coll [1 2 3]], (-seq coll), 1000000 runs, 557 msecs
[coll (seq [1 2 3])], (first coll), 1000000 runs, 91 msecs
[coll (seq [1 2 3])], (-first coll), 1000000 runs, 104 msecs
[coll (seq [1 2 3])], (rest coll), 1000000 runs, 690 msecs
[coll (seq [1 2 3])], (-rest coll), 1000000 runs, 435 msecs
[coll (seq [1 2 3])], (next coll), 1000000 runs, 425 msecs

;;; large vector ops
[], (reduce conj [] (range 40000)), 10 runs, 251 msecs
[coll (reduce conj [] (range (+ 32768 32)))], (conj coll :foo), 100000 runs, 160 msecs
[coll (reduce conj [] (range 40000))], (assoc coll 123 :foo), 100000 runs, 213 msecs
[coll (reduce conj [] (range (+ 32768 33)))], (pop coll), 100000 runs, 184 msecs

;;; chunked seqs
[], (-first v), 1000000 runs, 207 msecs
[], (-next v), 1000000 runs, 768 msecs
[], (-rest v), 1000000 runs, 326 msecs

;;; transients
transient vector, conj! 1000000 items
"Elapsed time: 679 msecs"


;;; vector equality
[a (into [] (range 1000000)) b (into [] (range 1000000))], (= a b), 1 runs, 781 msecs

;;; keyword compare
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed)))))], (.sort arr compare), 100 runs, 672 msecs
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed) (rand-nth seed)))))], (.sort arr compare), 100 runs, 965 msecs

;;; reduce lazy-seqs, vectors, ranges
[coll (take 100000 (iterate inc 0))], (reduce + 0 coll), 1 runs, 403 msecs
[coll (range 1000000)], (reduce + 0 coll), 1 runs, 20 msecs
[coll (into [] (range 1000000))], (reduce + 0 coll), 1 runs, 267 msecs

;; apply
[coll (into [] (range 1000000))], (apply + coll), 1 runs, 675 msecs
[], (list 1 2 3 4 5), 1000000 runs, 639 msecs
[xs (array-seq (array 1 2 3 4 5))], (apply list xs), 1000000 runs, 2422 msecs
[xs (list 1 2 3 4 5)], (apply list xs), 1000000 runs, 1725 msecs
[xs [1 2 3 4 5]], (apply list xs), 1000000 runs, 1620 msecs
[f (fn [a b & more])], (apply f (range 32)), 1000000 runs, 3240 msecs
[f (fn [a b c d e f g h i j & more])], (apply f (range 32)), 1000000 runs, 2525 msecs

;; update-in
[coll {:foo 1} ks [:foo]], (update-in coll ks inc), 1000000 runs, 2980 msecs
[coll (array-map :foo 1) ks [:foo]], (update-in coll ks inc), 1000000 runs, 453 msecs

;;; obj-map
[coll (obj-map)], (assoc coll :foo :bar), 1000000 runs, 549 msecs
[coll (obj-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 265 msecs
[coll (obj-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 1695 msecs
[coll (obj-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 276 msecs
[coll (obj-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 252 msecs

;;; array-map
[], {[1] true, [2] true, [3] true}, 1000000 runs, 2831 msecs
[coll (array-map)], (assoc coll :foo :bar), 1000000 runs, 373 msecs
[coll (array-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 276 msecs
[coll (array-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 515 msecs
[coll (array-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 320 msecs
[coll (array-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 355 msecs

;;; array-map w/ symbols
[coll (array-map)], (assoc coll a b), 1000000 runs, 322 msecs
[coll (array-map a b)], (-lookup coll a), 1000000 runs, 297 msecs
[coll (array-map a b)], (assoc coll c d), 1000000 runs, 416 msecs
[coll (array-map a b c d)], (-lookup coll c), 1000000 runs, 360 msecs
[coll (array-map a b c d e f)], (-lookup coll e), 1000000 runs, 331 msecs

;;; array-map w/ inline symbols
[coll (array-map)], (assoc coll (quote foo) (quote bar)), 1000000 runs, 894 msecs
[coll (array-map (quote foo) (quote bar))], (-lookup coll (quote foo)), 1000000 runs, 732 msecs
[coll (array-map (quote foo) (quote bar))], (assoc coll (quote baz) (quote woz)), 1000000 runs, 1027 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz))], (-lookup coll (quote baz)), 1000000 runs, 699 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz) (quote lol) (quote rofl))], (-lookup coll (quote lol)), 1000000 runs, 589 msecs

;;; map / record ops
[coll {:foo 1, :bar 2}], (get coll :foo), 1000000 runs, 330 msecs
[coll {(quote foo) 1, (quote bar) 2}], (get coll (quote foo)), 1000000 runs, 523 msecs
[coll {:foo 1, :bar 2}], (-lookup coll :foo nil), 1000000 runs, 307 msecs
[coll {(quote foo) 1, (quote bar) 2}], (-lookup coll (quote foo) nil), 1000000 runs, 530 msecs
[coll {:foo 1, :bar 2}], (:foo coll), 1000000 runs, 295 msecs
[coll {(quote foo) 1, (quote bar) 2}], ((quote foo) coll), 1000000 runs, 574 msecs
[coll {:foo 1, :bar 2}], (kw coll), 1000000 runs, 291 msecs
[coll {(quote foo) 1, (quote bar) 2}], (sym coll), 1000000 runs, 280 msecs
[coll {:foo 1, :bar 2}], (loop [i 0 m coll] (if (< i 100000) (recur (inc i) (assoc m :foo 2)) m)), 1 runs, 9 msecs
[coll (Foo. 1 2)], (:bar coll), 1000000 runs, 251 msecs
[coll (Foo. 1 2)], (-lookup coll :bar), 1000000 runs, 253 msecs
[coll (Foo. 1 2)], (assoc coll :bar 2), 1000000 runs, 322 msecs
[coll (Foo. 1 2)], (assoc coll :baz 3), 1000000 runs, 336 msecs
[coll (Foo. 1 2)], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :bar 2)) m)), 1 runs, 373 msecs

;;; zipmap
[m {:a 1, :b 2, :c 3}], (zipmap (keys m) (map inc (vals m))), 100000 runs, 626 msecs

;;; persistent hash maps
[key :f0], (hash key), 1000000 runs, 266 msecs
[key "f0"], (m3-hash-unencoded-chars key), 1000000 runs, 244 msecs
[key :unsynchronized-mutable], (hash key), 1000000 runs, 267 msecs
[coll hash-coll-test], (hash-coll coll), 100 runs, 340 msecs
[coll hash-coll-test], (hash-ordered-coll coll), 100 runs, 128 msecs
[coll hash-imap-test], (hash-imap coll), 100 runs, 111 msecs
[coll hash-imap-test], (hash-unordered-coll coll), 100 runs, 361 msecs
[coll pmap], (:f0 coll), 1000000 runs, 385 msecs
[coll pmap], (get coll :f0), 1000000 runs, 370 msecs
[coll pmap], (-lookup coll :f0 nil), 1000000 runs, 324 msecs
[coll pmap], (-lookup hash-imap-test :foo500 nil), 1000000 runs, 364 msecs
[coll pmap], (-lookup hash-imap-int-test 500 nil), 1000000 runs, 3598 msecs
[coll pmap], (assoc coll :g0 32), 1000000 runs, 657 msecs
[coll pmap], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :a 1)) m)), 1 runs, 565 msecs
[coll cljs.core.PersistentHashMap.EMPTY], (assoc coll :f0 1), 1000000 runs, 421 msecs

transient map, conj! 100000 items
"Elapsed time: 539 msecs"


;;; set ops
[], #{}, 1000000 runs, 217 msecs
[], #{1 3 2}, 1000000 runs, 0 msecs
[v [1 2 3]], (set v), 1000000 runs, 587 msecs
[], (hash-set 1 2 3), 1000000 runs, 0 msecs
[coll #{1 3 2}], (conj coll 4), 1000000 runs, 477 msecs
[coll #{1 3 2}], (get coll 2), 1000000 runs, 304 msecs
[coll #{1 3 2}], (contains? coll 2), 1000000 runs, 267 msecs
[coll #{1 3 2}], (coll 2), 1000000 runs, 289 msecs

;;; seq ops
[coll (range 500000)], (reduce + coll), 1 runs, 21 msecs

;;; reader
[s "{:foo [1 2 3]}"], (reader/read-string s), 1000 runs, 85 msecs
[s big-str-data], (reader/read-string s), 1000 runs, 1060 msecs

;;; range
[r (range 1000000)], (last r), 1 runs, 77 msecs

;;; lazy-seq
;;; first run
[r r], (last r), 1 runs, 369 msecs
;;; second run
[r r], (last r), 1 runs, 94 msecs

;;; comprehensions
[xs (range 512)], (last (for [x xs y xs] (+ x y))), 1 runs, 233 msecs
[xs (vec (range 512))], (last (for [x xs y xs] (+ x y))), 4 runs, 473 msecs
[a (Box. 0) xs (range 512)], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 1233 msecs
[a (Box. 0) xs (vec (range 512))], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 688 msecs

;; reducers
[xs (into [] (range 1000000))], (r/reduce + (r/map inc (r/map inc (r/map inc xs)))), 1 runs, 53 msecs
;; transducers
[xs (into [] (range 1000000))], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 52 msecs
;; primitive array reduce 1000000 many ops
[xs (into-array (range 1000000))], (-> xs (.map inc) (.map inc) (.map inc) (.reduce (fn [a b] (+ a b)) 0)), 1 runs, 177 msecs
;; reduce range 1000000 many ops
[xs (range 1000000)], (reduce + 0 (map inc (map inc (map inc xs)))), 1 runs, 1298 msecs
;; transduce range 1000000 many ops 
[xs (range 1000000)], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 57 msecs


;; multimethods
[], (simple-multi :foo), 1000000 runs, 569 msecs


;; higher-order variadic function calls
[f array], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 67 msecs
[f vector], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 82 msecs
[], (= 1 1 1 1 1 1 1 1 1 0), 100000 runs, 134 msecs

0001 patch
==========

Benchmarking with SpiderMonkey
[x 1], (identity x), 1000000 runs, 0 msecs
;; symbol construction
[], (symbol (quote foo)), 1000000 runs, 585 msecs

;; array-reduce & ci-reduce
[coll (seq arr)], (ci-reduce coll + 0), 1 runs, 137 msecs
[coll (seq arr)], (ci-reduce coll sum 0), 1 runs, 735 msecs
[coll arr], (array-reduce coll + 0), 1 runs, 3 msecs
[coll arr], (array-reduce coll sum 0), 1 runs, 297 msecs
;;; instance?
[coll []], (instance? PersistentVector coll), 1000000 runs, 23 msecs
;;; satisfies?
[coll (list 1 2 3)], (satisfies? ISeq coll), 1000000 runs, 21 msecs
[coll [1 2 3]], (satisfies? ISeq coll), 1000000 runs, 32 msecs

;;; array & string ops
[coll (array 1 2 3)], (seq coll), 1000000 runs, 524 msecs
[coll "foobar"], (seq coll), 1000000 runs, 1879 msecs
[coll (array 1 2 3)], (first coll), 1000000 runs, 789 msecs
[coll "foobar"], (first coll), 1000000 runs, 1762 msecs
[coll (array 1 2 3)], (nth coll 2), 1000000 runs, 150 msecs
[coll "foobar"], (nth coll 2), 1000000 runs, 1297 msecs

;;; cloning & specify
[coll [1 2 3]], (clone coll), 1000000 runs, 587 msecs
[coll [1 2 3]], (specify coll IFoo (foo [_] :bar)), 1000000 runs, 1486 msecs
[coll (specify [1 2 3] IFoo (foo [_] :bar))], (foo coll), 1000000 runs, 105 msecs

;;; list ops
[coll (list 1 2 3)], (first coll), 1000000 runs, 214 msecs
[coll (list 1 2 3)], (-first coll), 1000000 runs, 114 msecs
[coll (list 1 2 3)], (rest coll), 1000000 runs, 111 msecs
[coll (list 1 2 3)], (-rest coll), 1000000 runs, 88 msecs
[], (list), 1000000 runs, 13 msecs
[], (list 1 2 3), 1000000 runs, 1691 msecs

;;; vector ops
[], [], 1000000 runs, 9 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count [a b c]), 1000000 runs, 715 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vec #object[cljs.tagged_literals.JSValue 0xd0fabc8 "cljs.tagged_literals.JSValue@d0fabc8"])), 1000000 runs, 972 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vector a b c)), 1000000 runs, 638 msecs
[coll [1 2 3]], (transient coll), 100000 runs, 161 msecs
[coll [1 2 3]], (nth coll 0), 1000000 runs, 323 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 361 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 238 msecs
[coll [1 2 3]], (coll 0), 1000000 runs, 211 msecs
[coll [1 2 3]], (conj coll 4), 1000000 runs, 1284 msecs
[coll [1 2 3]], (-conj coll 4), 1000000 runs, 1071 msecs
[coll []], (-conj coll 1), 1000000 runs, 1067 msecs
[coll [1]], (-conj coll 2), 1000000 runs, 1133 msecs
[coll [1 2]], (-conj coll 3), 1000000 runs, 835 msecs
[coll [1 2 3]], (seq coll), 1000000 runs, 472 msecs
[coll [1 2 3]], (-seq coll), 1000000 runs, 557 msecs
[coll (seq [1 2 3])], (first coll), 1000000 runs, 91 msecs
[coll (seq [1 2 3])], (-first coll), 1000000 runs, 104 msecs
[coll (seq [1 2 3])], (rest coll), 1000000 runs, 690 msecs
[coll (seq [1 2 3])], (-rest coll), 1000000 runs, 435 msecs
[coll (seq [1 2 3])], (next coll), 1000000 runs, 425 msecs

;;; large vector ops
[], (reduce conj [] (range 40000)), 10 runs, 251 msecs
[coll (reduce conj [] (range (+ 32768 32)))], (conj coll :foo), 100000 runs, 160 msecs
[coll (reduce conj [] (range 40000))], (assoc coll 123 :foo), 100000 runs, 213 msecs
[coll (reduce conj [] (range (+ 32768 33)))], (pop coll), 100000 runs, 184 msecs

;;; chunked seqs
[], (-first v), 1000000 runs, 207 msecs
[], (-next v), 1000000 runs, 768 msecs
[], (-rest v), 1000000 runs, 326 msecs

;;; transients
transient vector, conj! 1000000 items
"Elapsed time: 679 msecs"


;;; vector equality
[a (into [] (range 1000000)) b (into [] (range 1000000))], (= a b), 1 runs, 781 msecs

;;; keyword compare
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed)))))], (.sort arr compare), 100 runs, 672 msecs
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed) (rand-nth seed)))))], (.sort arr compare), 100 runs, 965 msecs

;;; reduce lazy-seqs, vectors, ranges
[coll (take 100000 (iterate inc 0))], (reduce + 0 coll), 1 runs, 403 msecs
[coll (range 1000000)], (reduce + 0 coll), 1 runs, 20 msecs
[coll (into [] (range 1000000))], (reduce + 0 coll), 1 runs, 267 msecs

;; apply
[coll (into [] (range 1000000))], (apply + coll), 1 runs, 675 msecs
[], (list 1 2 3 4 5), 1000000 runs, 639 msecs
[xs (array-seq (array 1 2 3 4 5))], (apply list xs), 1000000 runs, 2422 msecs
[xs (list 1 2 3 4 5)], (apply list xs), 1000000 runs, 1725 msecs
[xs [1 2 3 4 5]], (apply list xs), 1000000 runs, 1620 msecs
[f (fn [a b & more])], (apply f (range 32)), 1000000 runs, 3240 msecs
[f (fn [a b c d e f g h i j & more])], (apply f (range 32)), 1000000 runs, 2525 msecs

;; update-in
[coll {:foo 1} ks [:foo]], (update-in coll ks inc), 1000000 runs, 2980 msecs
[coll (array-map :foo 1) ks [:foo]], (update-in coll ks inc), 1000000 runs, 453 msecs

;;; obj-map
[coll (obj-map)], (assoc coll :foo :bar), 1000000 runs, 549 msecs
[coll (obj-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 265 msecs
[coll (obj-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 1695 msecs
[coll (obj-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 276 msecs
[coll (obj-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 252 msecs

;;; array-map
[], {[1] true, [2] true, [3] true}, 1000000 runs, 2831 msecs
[coll (array-map)], (assoc coll :foo :bar), 1000000 runs, 373 msecs
[coll (array-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 276 msecs
[coll (array-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 515 msecs
[coll (array-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 320 msecs
[coll (array-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 355 msecs

;;; array-map w/ symbols
[coll (array-map)], (assoc coll a b), 1000000 runs, 322 msecs
[coll (array-map a b)], (-lookup coll a), 1000000 runs, 297 msecs
[coll (array-map a b)], (assoc coll c d), 1000000 runs, 416 msecs
[coll (array-map a b c d)], (-lookup coll c), 1000000 runs, 360 msecs
[coll (array-map a b c d e f)], (-lookup coll e), 1000000 runs, 331 msecs

;;; array-map w/ inline symbols
[coll (array-map)], (assoc coll (quote foo) (quote bar)), 1000000 runs, 894 msecs
[coll (array-map (quote foo) (quote bar))], (-lookup coll (quote foo)), 1000000 runs, 732 msecs
[coll (array-map (quote foo) (quote bar))], (assoc coll (quote baz) (quote woz)), 1000000 runs, 1027 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz))], (-lookup coll (quote baz)), 1000000 runs, 699 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz) (quote lol) (quote rofl))], (-lookup coll (quote lol)), 1000000 runs, 589 msecs

;;; map / record ops
[coll {:foo 1, :bar 2}], (get coll :foo), 1000000 runs, 330 msecs
[coll {(quote foo) 1, (quote bar) 2}], (get coll (quote foo)), 1000000 runs, 523 msecs
[coll {:foo 1, :bar 2}], (-lookup coll :foo nil), 1000000 runs, 307 msecs
[coll {(quote foo) 1, (quote bar) 2}], (-lookup coll (quote foo) nil), 1000000 runs, 530 msecs
[coll {:foo 1, :bar 2}], (:foo coll), 1000000 runs, 295 msecs
[coll {(quote foo) 1, (quote bar) 2}], ((quote foo) coll), 1000000 runs, 574 msecs
[coll {:foo 1, :bar 2}], (kw coll), 1000000 runs, 291 msecs
[coll {(quote foo) 1, (quote bar) 2}], (sym coll), 1000000 runs, 280 msecs
[coll {:foo 1, :bar 2}], (loop [i 0 m coll] (if (< i 100000) (recur (inc i) (assoc m :foo 2)) m)), 1 runs, 9 msecs
[coll (Foo. 1 2)], (:bar coll), 1000000 runs, 251 msecs
[coll (Foo. 1 2)], (-lookup coll :bar), 1000000 runs, 253 msecs
[coll (Foo. 1 2)], (assoc coll :bar 2), 1000000 runs, 322 msecs
[coll (Foo. 1 2)], (assoc coll :baz 3), 1000000 runs, 336 msecs
[coll (Foo. 1 2)], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :bar 2)) m)), 1 runs, 373 msecs

;;; zipmap
[m {:a 1, :b 2, :c 3}], (zipmap (keys m) (map inc (vals m))), 100000 runs, 626 msecs

;;; persistent hash maps
[key :f0], (hash key), 1000000 runs, 266 msecs
[key "f0"], (m3-hash-unencoded-chars key), 1000000 runs, 244 msecs
[key :unsynchronized-mutable], (hash key), 1000000 runs, 267 msecs
[coll hash-coll-test], (hash-coll coll), 100 runs, 340 msecs
[coll hash-coll-test], (hash-ordered-coll coll), 100 runs, 128 msecs
[coll hash-imap-test], (hash-imap coll), 100 runs, 111 msecs
[coll hash-imap-test], (hash-unordered-coll coll), 100 runs, 361 msecs
[coll pmap], (:f0 coll), 1000000 runs, 385 msecs
[coll pmap], (get coll :f0), 1000000 runs, 370 msecs
[coll pmap], (-lookup coll :f0 nil), 1000000 runs, 324 msecs
[coll pmap], (-lookup hash-imap-test :foo500 nil), 1000000 runs, 364 msecs
[coll pmap], (-lookup hash-imap-int-test 500 nil), 1000000 runs, 3598 msecs
[coll pmap], (assoc coll :g0 32), 1000000 runs, 657 msecs
[coll pmap], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :a 1)) m)), 1 runs, 565 msecs
[coll cljs.core.PersistentHashMap.EMPTY], (assoc coll :f0 1), 1000000 runs, 421 msecs

transient map, conj! 100000 items
"Elapsed time: 539 msecs"


;;; set ops
[], #{}, 1000000 runs, 217 msecs
[], #{1 3 2}, 1000000 runs, 0 msecs
[v [1 2 3]], (set v), 1000000 runs, 587 msecs
[], (hash-set 1 2 3), 1000000 runs, 0 msecs
[coll #{1 3 2}], (conj coll 4), 1000000 runs, 477 msecs
[coll #{1 3 2}], (get coll 2), 1000000 runs, 304 msecs
[coll #{1 3 2}], (contains? coll 2), 1000000 runs, 267 msecs
[coll #{1 3 2}], (coll 2), 1000000 runs, 289 msecs

;;; seq ops
[coll (range 500000)], (reduce + coll), 1 runs, 21 msecs

;;; reader
[s "{:foo [1 2 3]}"], (reader/read-string s), 1000 runs, 85 msecs
[s big-str-data], (reader/read-string s), 1000 runs, 1060 msecs

;;; range
[r (range 1000000)], (last r), 1 runs, 77 msecs

;;; lazy-seq
;;; first run
[r r], (last r), 1 runs, 369 msecs
;;; second run
[r r], (last r), 1 runs, 94 msecs

;;; comprehensions
[xs (range 512)], (last (for [x xs y xs] (+ x y))), 1 runs, 233 msecs
[xs (vec (range 512))], (last (for [x xs y xs] (+ x y))), 4 runs, 473 msecs
[a (Box. 0) xs (range 512)], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 1233 msecs
[a (Box. 0) xs (vec (range 512))], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 688 msecs

;; reducers
[xs (into [] (range 1000000))], (r/reduce + (r/map inc (r/map inc (r/map inc xs)))), 1 runs, 53 msecs
;; transducers
[xs (into [] (range 1000000))], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 52 msecs
;; primitive array reduce 1000000 many ops
[xs (into-array (range 1000000))], (-> xs (.map inc) (.map inc) (.map inc) (.reduce (fn [a b] (+ a b)) 0)), 1 runs, 177 msecs
;; reduce range 1000000 many ops
[xs (range 1000000)], (reduce + 0 (map inc (map inc (map inc xs)))), 1 runs, 1298 msecs
;; transduce range 1000000 many ops 
[xs (range 1000000)], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 57 msecs


;; multimethods
[], (simple-multi :foo), 1000000 runs, 569 msecs


;; higher-order variadic function calls
[f array], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 67 msecs
[f vector], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 82 msecs
[], (= 1 1 1 1 1 1 1 1 1 0), 100000 runs, 134 msecs

0002 patch
==========

Benchmarking with SpiderMonkey
[x 1], (identity x), 1000000 runs, 0 msecs
;; symbol construction
[], (symbol (quote foo)), 1000000 runs, 645 msecs

;; array-reduce & ci-reduce
[coll (seq arr)], (ci-reduce coll + 0), 1 runs, 95 msecs
[coll (seq arr)], (ci-reduce coll sum 0), 1 runs, 557 msecs
[coll arr], (array-reduce coll + 0), 1 runs, 2 msecs
[coll arr], (array-reduce coll sum 0), 1 runs, 460 msecs
;;; instance?
[coll []], (instance? PersistentVector coll), 1000000 runs, 18 msecs
;;; satisfies?
[coll (list 1 2 3)], (satisfies? ISeq coll), 1000000 runs, 32 msecs
[coll [1 2 3]], (satisfies? ISeq coll), 1000000 runs, 36 msecs

;;; array & string ops
[coll (array 1 2 3)], (seq coll), 1000000 runs, 613 msecs
[coll "foobar"], (seq coll), 1000000 runs, 1658 msecs
[coll (array 1 2 3)], (first coll), 1000000 runs, 834 msecs
[coll "foobar"], (first coll), 1000000 runs, 1934 msecs
[coll (array 1 2 3)], (nth coll 2), 1000000 runs, 219 msecs
[coll "foobar"], (nth coll 2), 1000000 runs, 1371 msecs

;;; cloning & specify
[coll [1 2 3]], (clone coll), 1000000 runs, 444 msecs
[coll [1 2 3]], (specify coll IFoo (foo [_] :bar)), 1000000 runs, 351 msecs
[coll (specify [1 2 3] IFoo (foo [_] :bar))], (foo coll), 1000000 runs, 125 msecs

;;; list ops
[coll (list 1 2 3)], (first coll), 1000000 runs, 138 msecs
[coll (list 1 2 3)], (-first coll), 1000000 runs, 97 msecs
[coll (list 1 2 3)], (rest coll), 1000000 runs, 109 msecs
[coll (list 1 2 3)], (-rest coll), 1000000 runs, 80 msecs
[], (list), 1000000 runs, 10 msecs
[], (list 1 2 3), 1000000 runs, 1387 msecs

;;; vector ops
[], [], 1000000 runs, 10 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count [a b c]), 1000000 runs, 316 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vec #object[cljs.tagged_literals.JSValue 0x57b33c29 "cljs.tagged_literals.JSValue@57b33c29"])), 1000000 runs, 732 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vector a b c)), 1000000 runs, 281 msecs
[coll [1 2 3]], (transient coll), 100000 runs, 484 msecs
[coll [1 2 3]], (nth coll 0), 1000000 runs, 112 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 162 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 194 msecs
[coll [1 2 3]], (coll 0), 1000000 runs, 125 msecs
[coll [1 2 3]], (conj coll 4), 1000000 runs, 756 msecs
[coll [1 2 3]], (-conj coll 4), 1000000 runs, 606 msecs
[coll []], (-conj coll 1), 1000000 runs, 515 msecs
[coll [1]], (-conj coll 2), 1000000 runs, 648 msecs
[coll [1 2]], (-conj coll 3), 1000000 runs, 422 msecs
[coll [1 2 3]], (seq coll), 1000000 runs, 566 msecs
[coll [1 2 3]], (-seq coll), 1000000 runs, 89 msecs
[coll (seq [1 2 3])], (first coll), 1000000 runs, 154 msecs
[coll (seq [1 2 3])], (-first coll), 1000000 runs, 89 msecs
[coll (seq [1 2 3])], (rest coll), 1000000 runs, 631 msecs
[coll (seq [1 2 3])], (-rest coll), 1000000 runs, 450 msecs
[coll (seq [1 2 3])], (next coll), 1000000 runs, 547 msecs

;;; large vector ops
[], (reduce conj [] (range 40000)), 10 runs, 589 msecs
[coll (reduce conj [] (range (+ 32768 32)))], (conj coll :foo), 100000 runs, 204 msecs
[coll (reduce conj [] (range 40000))], (assoc coll 123 :foo), 100000 runs, 177 msecs
[coll (reduce conj [] (range (+ 32768 33)))], (pop coll), 100000 runs, 143 msecs

;;; chunked seqs
[], (-first v), 1000000 runs, 141 msecs
[], (-next v), 1000000 runs, 529 msecs
[], (-rest v), 1000000 runs, 236 msecs

;;; transients
transient vector, conj! 1000000 items
"Elapsed time: 924 msecs"


;;; vector equality
[a (into [] (range 1000000)) b (into [] (range 1000000))], (= a b), 1 runs, 633 msecs

;;; keyword compare
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed)))))], (.sort arr compare), 100 runs, 610 msecs
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed) (rand-nth seed)))))], (.sort arr compare), 100 runs, 1138 msecs

;;; reduce lazy-seqs, vectors, ranges
[coll (take 100000 (iterate inc 0))], (reduce + 0 coll), 1 runs, 545 msecs
[coll (range 1000000)], (reduce + 0 coll), 1 runs, 121 msecs
[coll (into [] (range 1000000))], (reduce + 0 coll), 1 runs, 281 msecs

;; apply
[coll (into [] (range 1000000))], (apply + coll), 1 runs, 597 msecs
[], (list 1 2 3 4 5), 1000000 runs, 560 msecs
[xs (array-seq (array 1 2 3 4 5))], (apply list xs), 1000000 runs, 2573 msecs
[xs (list 1 2 3 4 5)], (apply list xs), 1000000 runs, 1927 msecs
[xs [1 2 3 4 5]], (apply list xs), 1000000 runs, 6163 msecs
[f (fn [a b & more])], (apply f (range 32)), 1000000 runs, 3149 msecs
[f (fn [a b c d e f g h i j & more])], (apply f (range 32)), 1000000 runs, 1883 msecs

;; update-in
[coll {:foo 1} ks [:foo]], (update-in coll ks inc), 1000000 runs, 659 msecs
[coll (array-map :foo 1) ks [:foo]], (update-in coll ks inc), 1000000 runs, 611 msecs

;;; obj-map
[coll (obj-map)], (assoc coll :foo :bar), 1000000 runs, 556 msecs
[coll (obj-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 368 msecs
[coll (obj-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 1707 msecs
[coll (obj-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 280 msecs
[coll (obj-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 266 msecs

;;; array-map
[], {[1] true, [2] true, [3] true}, 1000000 runs, 2862 msecs
[coll (array-map)], (assoc coll :foo :bar), 1000000 runs, 356 msecs
[coll (array-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 391 msecs
[coll (array-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 439 msecs
[coll (array-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 363 msecs
[coll (array-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 321 msecs

;;; array-map w/ symbols
[coll (array-map)], (assoc coll a b), 1000000 runs, 405 msecs
[coll (array-map a b)], (-lookup coll a), 1000000 runs, 328 msecs
[coll (array-map a b)], (assoc coll c d), 1000000 runs, 444 msecs
[coll (array-map a b c d)], (-lookup coll c), 1000000 runs, 330 msecs
[coll (array-map a b c d e f)], (-lookup coll e), 1000000 runs, 353 msecs

;;; array-map w/ inline symbols
[coll (array-map)], (assoc coll (quote foo) (quote bar)), 1000000 runs, 1427 msecs
[coll (array-map (quote foo) (quote bar))], (-lookup coll (quote foo)), 1000000 runs, 589 msecs
[coll (array-map (quote foo) (quote bar))], (assoc coll (quote baz) (quote woz)), 1000000 runs, 1087 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz))], (-lookup coll (quote baz)), 1000000 runs, 674 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz) (quote lol) (quote rofl))], (-lookup coll (quote lol)), 1000000 runs, 719 msecs

;;; map / record ops
[coll {:foo 1, :bar 2}], (get coll :foo), 1000000 runs, 287 msecs
[coll {(quote foo) 1, (quote bar) 2}], (get coll (quote foo)), 1000000 runs, 841 msecs
[coll {:foo 1, :bar 2}], (-lookup coll :foo nil), 1000000 runs, 327 msecs
[coll {(quote foo) 1, (quote bar) 2}], (-lookup coll (quote foo) nil), 1000000 runs, 625 msecs
[coll {:foo 1, :bar 2}], (:foo coll), 1000000 runs, 294 msecs
[coll {(quote foo) 1, (quote bar) 2}], ((quote foo) coll), 1000000 runs, 630 msecs
[coll {:foo 1, :bar 2}], (kw coll), 1000000 runs, 314 msecs
[coll {(quote foo) 1, (quote bar) 2}], (sym coll), 1000000 runs, 312 msecs
[coll {:foo 1, :bar 2}], (loop [i 0 m coll] (if (< i 100000) (recur (inc i) (assoc m :foo 2)) m)), 1 runs, 10 msecs
[coll (Foo. 1 2)], (:bar coll), 1000000 runs, 269 msecs
[coll (Foo. 1 2)], (-lookup coll :bar), 1000000 runs, 268 msecs
[coll (Foo. 1 2)], (assoc coll :bar 2), 1000000 runs, 309 msecs
[coll (Foo. 1 2)], (assoc coll :baz 3), 1000000 runs, 440 msecs
[coll (Foo. 1 2)], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :bar 2)) m)), 1 runs, 404 msecs

;;; zipmap
[m {:a 1, :b 2, :c 3}], (zipmap (keys m) (map inc (vals m))), 100000 runs, 756 msecs

;;; persistent hash maps
[key :f0], (hash key), 1000000 runs, 290 msecs
[key "f0"], (m3-hash-unencoded-chars key), 1000000 runs, 326 msecs
[key :unsynchronized-mutable], (hash key), 1000000 runs, 279 msecs
[coll hash-coll-test], (hash-coll coll), 100 runs, 338 msecs
[coll hash-coll-test], (hash-ordered-coll coll), 100 runs, 138 msecs
[coll hash-imap-test], (hash-imap coll), 100 runs, 177 msecs
[coll hash-imap-test], (hash-unordered-coll coll), 100 runs, 385 msecs
[coll pmap], (:f0 coll), 1000000 runs, 411 msecs
[coll pmap], (get coll :f0), 1000000 runs, 439 msecs
[coll pmap], (-lookup coll :f0 nil), 1000000 runs, 336 msecs
[coll pmap], (-lookup hash-imap-test :foo500 nil), 1000000 runs, 457 msecs
[coll pmap], (-lookup hash-imap-int-test 500 nil), 1000000 runs, 4330 msecs
[coll pmap], (assoc coll :g0 32), 1000000 runs, 831 msecs
[coll pmap], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :a 1)) m)), 1 runs, 490 msecs
[coll cljs.core.PersistentHashMap.EMPTY], (assoc coll :f0 1), 1000000 runs, 474 msecs

transient map, conj! 100000 items
"Elapsed time: 565 msecs"


;;; set ops
[], #{}, 1000000 runs, 225 msecs
[], #{1 3 2}, 1000000 runs, 0 msecs
[v [1 2 3]], (set v), 1000000 runs, 711 msecs
[], (hash-set 1 2 3), 1000000 runs, 0 msecs
[coll #{1 3 2}], (conj coll 4), 1000000 runs, 608 msecs
[coll #{1 3 2}], (get coll 2), 1000000 runs, 353 msecs
[coll #{1 3 2}], (contains? coll 2), 1000000 runs, 322 msecs
[coll #{1 3 2}], (coll 2), 1000000 runs, 335 msecs

;;; seq ops
[coll (range 500000)], (reduce + coll), 1 runs, 22 msecs

;;; reader
[s "{:foo [1 2 3]}"], (reader/read-string s), 1000 runs, 99 msecs
[s big-str-data], (reader/read-string s), 1000 runs, 1538 msecs

;;; range
[r (range 1000000)], (last r), 1 runs, 37 msecs

;;; lazy-seq
;;; first run
[r r], (last r), 1 runs, 348 msecs
;;; second run
[r r], (last r), 1 runs, 71 msecs

;;; comprehensions
[xs (range 512)], (last (for [x xs y xs] (+ x y))), 1 runs, 433 msecs
[xs (vec (range 512))], (last (for [x xs y xs] (+ x y))), 4 runs, 287 msecs
[a (Box. 0) xs (range 512)], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 1191 msecs
[a (Box. 0) xs (vec (range 512))], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 831 msecs

;; reducers
[xs (into [] (range 1000000))], (r/reduce + (r/map inc (r/map inc (r/map inc xs)))), 1 runs, 52 msecs
;; transducers
[xs (into [] (range 1000000))], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 81 msecs
;; primitive array reduce 1000000 many ops
[xs (into-array (range 1000000))], (-> xs (.map inc) (.map inc) (.map inc) (.reduce (fn [a b] (+ a b)) 0)), 1 runs, 207 msecs
;; reduce range 1000000 many ops
[xs (range 1000000)], (reduce + 0 (map inc (map inc (map inc xs)))), 1 runs, 1375 msecs
;; transduce range 1000000 many ops 
[xs (range 1000000)], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 73 msecs


;; multimethods
[], (simple-multi :foo), 1000000 runs, 429 msecs


;; higher-order variadic function calls
[f array], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 51 msecs
[f vector], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 73 msecs
[], (= 1 1 1 1 1 1 1 1 1 0), 100000 runs, 133 msecs
Comment by David Nolen [ 19/Jul/15 11:06 AM ]

Thanks will review.

Comment by David Nolen [ 20/Jul/15 2:33 PM ]

This ticket should probably be updated with the latest equiv changes in Clojure master no?

Comment by Michał Marczyk [ 20/Jul/15 2:49 PM ]

Right, will do (plus a rebase on top of current master while I'm at it).

Comment by Michał Marczyk [ 20/Jul/15 6:43 PM ]

New 0003 patch superseding the previous ones attached.

See some new benchmark results below. There are some apparent substantial speedups where I would expect them, there's the somewhat expected slowdown for transient with small vectors.

Freak result: most large vector ops stay around their original spots as expected, except for reduce conj [] over a long range, which becomes weirdly slow. This I find hard to explain, particularly since ranges are used in other benchmarks as well, and those behave sensibly.

I tried compiling the benchmark suite with :optimizations :simple to see if the freak result was something obvious maybe. Oddly enough, all/most timings are significantly better under :simple. Am I missing something obvious here…?

1. master:

Benchmarking with SpiderMonkey
[x 1], (identity x), 1000000 runs, 0 msecs
;; symbol construction
[], (symbol (quote foo)), 1000000 runs, 506 msecs

;; array-reduce & ci-reduce
[coll (seq arr)], (ci-reduce coll + 0), 1 runs, 70 msecs
[coll (seq arr)], (ci-reduce coll sum 0), 1 runs, 554 msecs
[coll arr], (array-reduce coll + 0), 1 runs, 3 msecs
[coll arr], (array-reduce coll sum 0), 1 runs, 313 msecs
;;; instance?
[coll []], (instance? PersistentVector coll), 1000000 runs, 15 msecs
;;; satisfies?
[coll (list 1 2 3)], (satisfies? ISeq coll), 1000000 runs, 19 msecs
[coll [1 2 3]], (satisfies? ISeq coll), 1000000 runs, 33 msecs

;;; array & string ops
[coll (array 1 2 3)], (seq coll), 1000000 runs, 401 msecs
[coll "foobar"], (seq coll), 1000000 runs, 1202 msecs
[coll (array 1 2 3)], (first coll), 1000000 runs, 563 msecs
[coll "foobar"], (first coll), 1000000 runs, 1307 msecs
[coll (array 1 2 3)], (nth coll 2), 1000000 runs, 161 msecs
[coll "foobar"], (nth coll 2), 1000000 runs, 949 msecs

;;; cloning & specify
[coll [1 2 3]], (clone coll), 1000000 runs, 379 msecs
[coll [1 2 3]], (specify coll IFoo (foo [_] :bar)), 1000000 runs, 1025 msecs
[coll (specify [1 2 3] IFoo (foo [_] :bar))], (foo coll), 1000000 runs, 59 msecs

;;; list ops
[coll (list 1 2 3)], (first coll), 1000000 runs, 88 msecs
[coll (list 1 2 3)], (-first coll), 1000000 runs, 67 msecs
[coll (list 1 2 3)], (rest coll), 1000000 runs, 80 msecs
[coll (list 1 2 3)], (-rest coll), 1000000 runs, 62 msecs
[], (list), 1000000 runs, 10 msecs
[], (list 1 2 3), 1000000 runs, 1132 msecs

;;; vector ops
[], [], 1000000 runs, 10 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count [a b c]), 1000000 runs, 495 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vec #object[cljs.tagged_literals.JSValue 0x56b66a26 "cljs.tagged_literals.JSValue@56b66a26"])), 1000000 runs, 547 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vector a b c)), 1000000 runs, 435 msecs
[coll [1 2 3]], (transient coll), 100000 runs, 120 msecs
[coll [1 2 3]], (nth coll 0), 1000000 runs, 197 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 95 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 199 msecs
[coll [1 2 3]], (coll 0), 1000000 runs, 209 msecs
[coll [1 2 3]], (conj coll 4), 1000000 runs, 893 msecs
[coll [1 2 3]], (-conj coll 4), 1000000 runs, 842 msecs
[coll []], (-conj coll 1), 1000000 runs, 765 msecs
[coll [1]], (-conj coll 2), 1000000 runs, 854 msecs
[coll [1 2]], (-conj coll 3), 1000000 runs, 631 msecs
[coll [1 2 3]], (seq coll), 1000000 runs, 413 msecs
[coll [1 2 3]], (-seq coll), 1000000 runs, 668 msecs
[coll (seq [1 2 3])], (first coll), 1000000 runs, 163 msecs
[coll (seq [1 2 3])], (-first coll), 1000000 runs, 89 msecs
[coll (seq [1 2 3])], (rest coll), 1000000 runs, 497 msecs
[coll (seq [1 2 3])], (-rest coll), 1000000 runs, 319 msecs
[coll (seq [1 2 3])], (next coll), 1000000 runs, 316 msecs

;;; large vector ops
[], (reduce conj [] (range 40000)), 10 runs, 172 msecs
[coll (reduce conj [] (range (+ 32768 32)))], (conj coll :foo), 100000 runs, 240 msecs
[coll (reduce conj [] (range 40000))], (assoc coll 123 :foo), 100000 runs, 128 msecs
[coll (reduce conj [] (range (+ 32768 33)))], (pop coll), 100000 runs, 80 msecs

;;; chunked seqs
[], (-first v), 1000000 runs, 105 msecs
[], (-next v), 1000000 runs, 460 msecs
[], (-rest v), 1000000 runs, 166 msecs

;;; transients
transient vector, conj! 1000000 items
"Elapsed time: 746 msecs"


;;; vector equality
[a (into [] (range 1000000)) b (into [] (range 1000000))], (= a b), 1 runs, 557 msecs

;;; keyword compare
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed)))))], (.sort arr compare), 100 runs, 437 msecs
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed) (rand-nth seed)))))], (.sort arr compare), 100 runs, 820 msecs

;;; reduce lazy-seqs, vectors, ranges
[coll (take 100000 (iterate inc 0))], (reduce + 0 coll), 1 runs, 308 msecs
[coll (range 1000000)], (reduce + 0 coll), 1 runs, 20 msecs
[coll (into [] (range 1000000))], (reduce + 0 coll), 1 runs, 250 msecs

;; apply
[coll (into [] (range 1000000))], (apply + coll), 1 runs, 471 msecs
[], (list 1 2 3 4 5), 1000000 runs, 410 msecs
[xs (array-seq (array 1 2 3 4 5))], (apply list xs), 1000000 runs, 1898 msecs
[xs (list 1 2 3 4 5)], (apply list xs), 1000000 runs, 1506 msecs
[xs [1 2 3 4 5]], (apply list xs), 1000000 runs, 954 msecs
[f (fn [a b & more])], (apply f (range 32)), 1000000 runs, 2495 msecs
[f (fn [a b c d e f g h i j & more])], (apply f (range 32)), 1000000 runs, 1864 msecs

;; update-in
[coll {:foo 1} ks [:foo]], (update-in coll ks inc), 1000000 runs, 2799 msecs
[coll (array-map :foo 1) ks [:foo]], (update-in coll ks inc), 1000000 runs, 2367 msecs

;;; obj-map
[coll (obj-map)], (assoc coll :foo :bar), 1000000 runs, 465 msecs
[coll (obj-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 268 msecs
[coll (obj-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 1228 msecs
[coll (obj-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 251 msecs
[coll (obj-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 270 msecs

;;; array-map
[], {[1] true, [2] true, [3] true}, 1000000 runs, 3502 msecs
[coll (array-map)], (assoc coll :foo :bar), 1000000 runs, 330 msecs
[coll (array-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 294 msecs
[coll (array-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 528 msecs
[coll (array-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 282 msecs
[coll (array-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 333 msecs

;;; array-map w/ symbols
[coll (array-map)], (assoc coll a b), 1000000 runs, 318 msecs
[coll (array-map a b)], (-lookup coll a), 1000000 runs, 286 msecs
[coll (array-map a b)], (assoc coll c d), 1000000 runs, 409 msecs
[coll (array-map a b c d)], (-lookup coll c), 1000000 runs, 341 msecs
[coll (array-map a b c d e f)], (-lookup coll e), 1000000 runs, 353 msecs

;;; array-map w/ inline symbols
[coll (array-map)], (assoc coll (quote foo) (quote bar)), 1000000 runs, 878 msecs
[coll (array-map (quote foo) (quote bar))], (-lookup coll (quote foo)), 1000000 runs, 589 msecs
[coll (array-map (quote foo) (quote bar))], (assoc coll (quote baz) (quote woz)), 1000000 runs, 972 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz))], (-lookup coll (quote baz)), 1000000 runs, 582 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz) (quote lol) (quote rofl))], (-lookup coll (quote lol)), 1000000 runs, 850 msecs

;;; map / record ops
[coll {:foo 1, :bar 2}], (get coll :foo), 1000000 runs, 269 msecs
[coll {(quote foo) 1, (quote bar) 2}], (get coll (quote foo)), 1000000 runs, 793 msecs
[coll {:foo 1, :bar 2}], (-lookup coll :foo nil), 1000000 runs, 269 msecs
[coll {(quote foo) 1, (quote bar) 2}], (-lookup coll (quote foo) nil), 1000000 runs, 596 msecs
[coll {:foo 1, :bar 2}], (:foo coll), 1000000 runs, 311 msecs
[coll {(quote foo) 1, (quote bar) 2}], ((quote foo) coll), 1000000 runs, 586 msecs
[coll {:foo 1, :bar 2}], (kw coll), 1000000 runs, 321 msecs
[coll {(quote foo) 1, (quote bar) 2}], (sym coll), 1000000 runs, 280 msecs
[coll {:foo 1, :bar 2}], (loop [i 0 m coll] (if (< i 100000) (recur (inc i) (assoc m :foo 2)) m)), 1 runs, 10 msecs
[coll (Foo. 1 2)], (:bar coll), 1000000 runs, 254 msecs
[coll (Foo. 1 2)], (-lookup coll :bar), 1000000 runs, 250 msecs
[coll (Foo. 1 2)], (assoc coll :bar 2), 1000000 runs, 288 msecs
[coll (Foo. 1 2)], (assoc coll :baz 3), 1000000 runs, 322 msecs
[coll (Foo. 1 2)], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :bar 2)) m)), 1 runs, 305 msecs

;;; zipmap
[m {:a 1, :b 2, :c 3}], (zipmap (keys m) (map inc (vals m))), 100000 runs, 537 msecs

;;; persistent hash maps
[key :f0], (hash key), 1000000 runs, 257 msecs
[key "f0"], (m3-hash-unencoded-chars key), 1000000 runs, 250 msecs
[key :unsynchronized-mutable], (hash key), 1000000 runs, 238 msecs
[coll hash-coll-test], (hash-coll coll), 100 runs, 338 msecs
[coll hash-coll-test], (hash-ordered-coll coll), 100 runs, 123 msecs
[coll hash-imap-test], (hash-imap coll), 100 runs, 114 msecs
[coll hash-imap-test], (hash-unordered-coll coll), 100 runs, 342 msecs
[coll pmap], (:f0 coll), 1000000 runs, 368 msecs
[coll pmap], (get coll :f0), 1000000 runs, 356 msecs
[coll pmap], (-lookup coll :f0 nil), 1000000 runs, 274 msecs
[coll pmap], (-lookup hash-imap-test :foo500 nil), 1000000 runs, 290 msecs
[coll pmap], (-lookup hash-imap-int-test 500 nil), 1000000 runs, 3028 msecs
[coll pmap], (assoc coll :g0 32), 1000000 runs, 641 msecs
[coll pmap], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :a 1)) m)), 1 runs, 412 msecs
[coll cljs.core.PersistentHashMap.EMPTY], (assoc coll :f0 1), 1000000 runs, 411 msecs

transient map, conj! 100000 items
"Elapsed time: 505 msecs"


;;; set ops
[], #{}, 1000000 runs, 215 msecs
[], #{1 3 2}, 1000000 runs, 0 msecs
[v [1 2 3]], (set v), 1000000 runs, 460 msecs
[], (hash-set 1 2 3), 1000000 runs, 0 msecs
[coll #{1 3 2}], (conj coll 4), 1000000 runs, 516 msecs
[coll #{1 3 2}], (get coll 2), 1000000 runs, 293 msecs
[coll #{1 3 2}], (contains? coll 2), 1000000 runs, 269 msecs
[coll #{1 3 2}], (coll 2), 1000000 runs, 290 msecs

;;; seq ops
[coll (range 500000)], (reduce + coll), 1 runs, 18 msecs

;;; reader
[s "{:foo [1 2 3]}"], (reader/read-string s), 1000 runs, 77 msecs
[s big-str-data], (reader/read-string s), 1000 runs, 957 msecs

;;; range
[r (range 1000000)], (last r), 1 runs, 42 msecs

;;; lazy-seq
;;; first run
[r r], (last r), 1 runs, 310 msecs
;;; second run
[r r], (last r), 1 runs, 71 msecs

;;; comprehensions
[xs (range 512)], (last (for [x xs y xs] (+ x y))), 1 runs, 234 msecs
[xs (vec (range 512))], (last (for [x xs y xs] (+ x y))), 4 runs, 416 msecs
[a (Box. 0) xs (range 512)], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 981 msecs
[a (Box. 0) xs (vec (range 512))], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 699 msecs

;; reducers
[xs (into [] (range 1000000))], (r/reduce + (r/map inc (r/map inc (r/map inc xs)))), 1 runs, 50 msecs
;; transducers
[xs (into [] (range 1000000))], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 52 msecs
;; primitive array reduce 1000000 many ops
[xs (into-array (range 1000000))], (-> xs (.map inc) (.map inc) (.map inc) (.reduce (fn [a b] (+ a b)) 0)), 1 runs, 184 msecs
;; reduce range 1000000 many ops
[xs (range 1000000)], (reduce + 0 (map inc (map inc (map inc xs)))), 1 runs, 1278 msecs
;; transduce range 1000000 many ops 
[xs (range 1000000)], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 46 msecs


;; multimethods
[], (simple-multi :foo), 1000000 runs, 333 msecs


;; higher-order variadic function calls
[f array], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 216 msecs
[f vector], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 71 msecs
[], (= 1 1 1 1 1 1 1 1 1 0), 100000 runs, 142 msecs

2. 0003 patch:

Benchmarking with SpiderMonkey
[x 1], (identity x), 1000000 runs, 0 msecs
;; symbol construction
[], (symbol (quote foo)), 1000000 runs, 480 msecs

;; array-reduce & ci-reduce
[coll (seq arr)], (ci-reduce coll + 0), 1 runs, 71 msecs
[coll (seq arr)], (ci-reduce coll sum 0), 1 runs, 476 msecs
[coll arr], (array-reduce coll + 0), 1 runs, 3 msecs
[coll arr], (array-reduce coll sum 0), 1 runs, 621 msecs
;;; instance?
[coll []], (instance? PersistentVector coll), 1000000 runs, 28 msecs
;;; satisfies?
[coll (list 1 2 3)], (satisfies? ISeq coll), 1000000 runs, 30 msecs
[coll [1 2 3]], (satisfies? ISeq coll), 1000000 runs, 54 msecs

;;; array & string ops
[coll (array 1 2 3)], (seq coll), 1000000 runs, 542 msecs
[coll "foobar"], (seq coll), 1000000 runs, 1209 msecs
[coll (array 1 2 3)], (first coll), 1000000 runs, 564 msecs
[coll "foobar"], (first coll), 1000000 runs, 1257 msecs
[coll (array 1 2 3)], (nth coll 2), 1000000 runs, 140 msecs
[coll "foobar"], (nth coll 2), 1000000 runs, 913 msecs

;;; cloning & specify
[coll [1 2 3]], (clone coll), 1000000 runs, 424 msecs
[coll [1 2 3]], (specify coll IFoo (foo [_] :bar)), 1000000 runs, 170 msecs
[coll (specify [1 2 3] IFoo (foo [_] :bar))], (foo coll), 1000000 runs, 58 msecs

;;; list ops
[coll (list 1 2 3)], (first coll), 1000000 runs, 89 msecs
[coll (list 1 2 3)], (-first coll), 1000000 runs, 69 msecs
[coll (list 1 2 3)], (rest coll), 1000000 runs, 80 msecs
[coll (list 1 2 3)], (-rest coll), 1000000 runs, 61 msecs
[], (list), 1000000 runs, 10 msecs
[], (list 1 2 3), 1000000 runs, 1142 msecs

;;; vector ops
[], [], 1000000 runs, 10 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count [a b c]), 1000000 runs, 272 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vec #object[cljs.tagged_literals.JSValue 0x3ff26c9 "cljs.tagged_literals.JSValue@3ff26c9"])), 1000000 runs, 585 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vector a b c)), 1000000 runs, 240 msecs
[coll [1 2 3]], (transient coll), 100000 runs, 273 msecs
[coll [1 2 3]], (nth coll 0), 1000000 runs, 101 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 102 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 102 msecs
[coll [1 2 3]], (coll 0), 1000000 runs, 38 msecs
[coll [1 2 3]], (conj coll 4), 1000000 runs, 429 msecs
[coll [1 2 3]], (-conj coll 4), 1000000 runs, 392 msecs
[coll []], (-conj coll 1), 1000000 runs, 368 msecs
[coll [1]], (-conj coll 2), 1000000 runs, 395 msecs
[coll [1 2]], (-conj coll 3), 1000000 runs, 364 msecs
[coll [1 2 3]], (seq coll), 1000000 runs, 383 msecs
[coll [1 2 3]], (-seq coll), 1000000 runs, 75 msecs
[coll (seq [1 2 3])], (first coll), 1000000 runs, 142 msecs
[coll (seq [1 2 3])], (-first coll), 1000000 runs, 79 msecs
[coll (seq [1 2 3])], (rest coll), 1000000 runs, 395 msecs
[coll (seq [1 2 3])], (-rest coll), 1000000 runs, 408 msecs
[coll (seq [1 2 3])], (next coll), 1000000 runs, 383 msecs

;;; large vector ops
[], (reduce conj [] (range 40000)), 10 runs, 406 msecs
[coll (reduce conj [] (range (+ 32768 32)))], (conj coll :foo), 100000 runs, 269 msecs
[coll (reduce conj [] (range 40000))], (assoc coll 123 :foo), 100000 runs, 131 msecs
[coll (reduce conj [] (range (+ 32768 33)))], (pop coll), 100000 runs, 80 msecs

;;; chunked seqs
[], (-first v), 1000000 runs, 104 msecs
[], (-next v), 1000000 runs, 461 msecs
[], (-rest v), 1000000 runs, 171 msecs

;;; transients
transient vector, conj! 1000000 items
"Elapsed time: 592 msecs"


;;; vector equality
[a (into [] (range 1000000)) b (into [] (range 1000000))], (= a b), 1 runs, 562 msecs

;;; keyword compare
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed)))))], (.sort arr compare), 100 runs, 467 msecs
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed) (rand-nth seed)))))], (.sort arr compare), 100 runs, 830 msecs

;;; reduce lazy-seqs, vectors, ranges
[coll (take 100000 (iterate inc 0))], (reduce + 0 coll), 1 runs, 426 msecs
[coll (range 1000000)], (reduce + 0 coll), 1 runs, 15 msecs
[coll (into [] (range 1000000))], (reduce + 0 coll), 1 runs, 265 msecs

;; apply
[coll (into [] (range 1000000))], (apply + coll), 1 runs, 580 msecs
[], (list 1 2 3 4 5), 1000000 runs, 386 msecs
[xs (array-seq (array 1 2 3 4 5))], (apply list xs), 1000000 runs, 1885 msecs
[xs (list 1 2 3 4 5)], (apply list xs), 1000000 runs, 1362 msecs
[xs [1 2 3 4 5]], (apply list xs), 1000000 runs, 4564 msecs
[f (fn [a b & more])], (apply f (range 32)), 1000000 runs, 2536 msecs
[f (fn [a b c d e f g h i j & more])], (apply f (range 32)), 1000000 runs, 1940 msecs

;; update-in
[coll {:foo 1} ks [:foo]], (update-in coll ks inc), 1000000 runs, 1948 msecs
[coll (array-map :foo 1) ks [:foo]], (update-in coll ks inc), 1000000 runs, 452 msecs

;;; obj-map
[coll (obj-map)], (assoc coll :foo :bar), 1000000 runs, 484 msecs
[coll (obj-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 264 msecs
[coll (obj-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 1540 msecs
[coll (obj-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 294 msecs
[coll (obj-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 251 msecs

;;; array-map
[], {[1] true, [2] true, [3] true}, 1000000 runs, 3150 msecs
[coll (array-map)], (assoc coll :foo :bar), 1000000 runs, 378 msecs
[coll (array-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 278 msecs
[coll (array-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 507 msecs
[coll (array-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 288 msecs
[coll (array-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 339 msecs

;;; array-map w/ symbols
[coll (array-map)], (assoc coll a b), 1000000 runs, 324 msecs
[coll (array-map a b)], (-lookup coll a), 1000000 runs, 301 msecs
[coll (array-map a b)], (assoc coll c d), 1000000 runs, 533 msecs
[coll (array-map a b c d)], (-lookup coll c), 1000000 runs, 355 msecs
[coll (array-map a b c d e f)], (-lookup coll e), 1000000 runs, 309 msecs

;;; array-map w/ inline symbols
[coll (array-map)], (assoc coll (quote foo) (quote bar)), 1000000 runs, 757 msecs
[coll (array-map (quote foo) (quote bar))], (-lookup coll (quote foo)), 1000000 runs, 514 msecs
[coll (array-map (quote foo) (quote bar))], (assoc coll (quote baz) (quote woz)), 1000000 runs, 844 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz))], (-lookup coll (quote baz)), 1000000 runs, 622 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz) (quote lol) (quote rofl))], (-lookup coll (quote lol)), 1000000 runs, 765 msecs

;;; map / record ops
[coll {:foo 1, :bar 2}], (get coll :foo), 1000000 runs, 271 msecs
[coll {(quote foo) 1, (quote bar) 2}], (get coll (quote foo)), 1000000 runs, 521 msecs
[coll {:foo 1, :bar 2}], (-lookup coll :foo nil), 1000000 runs, 276 msecs
[coll {(quote foo) 1, (quote bar) 2}], (-lookup coll (quote foo) nil), 1000000 runs, 515 msecs
[coll {:foo 1, :bar 2}], (:foo coll), 1000000 runs, 314 msecs
[coll {(quote foo) 1, (quote bar) 2}], ((quote foo) coll), 1000000 runs, 534 msecs
[coll {:foo 1, :bar 2}], (kw coll), 1000000 runs, 324 msecs
[coll {(quote foo) 1, (quote bar) 2}], (sym coll), 1000000 runs, 327 msecs
[coll {:foo 1, :bar 2}], (loop [i 0 m coll] (if (< i 100000) (recur (inc i) (assoc m :foo 2)) m)), 1 runs, 10 msecs
[coll (Foo. 1 2)], (:bar coll), 1000000 runs, 290 msecs
[coll (Foo. 1 2)], (-lookup coll :bar), 1000000 runs, 254 msecs
[coll (Foo. 1 2)], (assoc coll :bar 2), 1000000 runs, 301 msecs
[coll (Foo. 1 2)], (assoc coll :baz 3), 1000000 runs, 347 msecs
[coll (Foo. 1 2)], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :bar 2)) m)), 1 runs, 365 msecs

;;; zipmap
[m {:a 1, :b 2, :c 3}], (zipmap (keys m) (map inc (vals m))), 100000 runs, 496 msecs

;;; persistent hash maps
[key :f0], (hash key), 1000000 runs, 242 msecs
[key "f0"], (m3-hash-unencoded-chars key), 1000000 runs, 254 msecs
[key :unsynchronized-mutable], (hash key), 1000000 runs, 262 msecs
[coll hash-coll-test], (hash-coll coll), 100 runs, 319 msecs
[coll hash-coll-test], (hash-ordered-coll coll), 100 runs, 128 msecs
[coll hash-imap-test], (hash-imap coll), 100 runs, 124 msecs
[coll hash-imap-test], (hash-unordered-coll coll), 100 runs, 368 msecs
[coll pmap], (:f0 coll), 1000000 runs, 446 msecs
[coll pmap], (get coll :f0), 1000000 runs, 511 msecs
[coll pmap], (-lookup coll :f0 nil), 1000000 runs, 328 msecs
[coll pmap], (-lookup hash-imap-test :foo500 nil), 1000000 runs, 319 msecs
[coll pmap], (-lookup hash-imap-int-test 500 nil), 1000000 runs, 4954 msecs
[coll pmap], (assoc coll :g0 32), 1000000 runs, 963 msecs
[coll pmap], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :a 1)) m)), 1 runs, 425 msecs
[coll cljs.core.PersistentHashMap.EMPTY], (assoc coll :f0 1), 1000000 runs, 421 msecs

transient map, conj! 100000 items
"Elapsed time: 531 msecs"


;;; set ops
[], #{}, 1000000 runs, 230 msecs
[], #{1 3 2}, 1000000 runs, 0 msecs
[v [1 2 3]], (set v), 1000000 runs, 679 msecs
[], (hash-set 1 2 3), 1000000 runs, 0 msecs
[coll #{1 3 2}], (conj coll 4), 1000000 runs, 605 msecs
[coll #{1 3 2}], (get coll 2), 1000000 runs, 295 msecs
[coll #{1 3 2}], (contains? coll 2), 1000000 runs, 273 msecs
[coll #{1 3 2}], (coll 2), 1000000 runs, 321 msecs

;;; seq ops
[coll (range 500000)], (reduce + coll), 1 runs, 22 msecs

;;; reader
[s "{:foo [1 2 3]}"], (reader/read-string s), 1000 runs, 73 msecs
[s big-str-data], (reader/read-string s), 1000 runs, 934 msecs

;;; range
[r (range 1000000)], (last r), 1 runs, 33 msecs

;;; lazy-seq
;;; first run
[r r], (last r), 1 runs, 310 msecs
;;; second run
[r r], (last r), 1 runs, 60 msecs

;;; comprehensions
[xs (range 512)], (last (for [x xs y xs] (+ x y))), 1 runs, 230 msecs
[xs (vec (range 512))], (last (for [x xs y xs] (+ x y))), 4 runs, 400 msecs
[a (Box. 0) xs (range 512)], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 865 msecs
[a (Box. 0) xs (vec (range 512))], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 627 msecs

;; reducers
[xs (into [] (range 1000000))], (r/reduce + (r/map inc (r/map inc (r/map inc xs)))), 1 runs, 49 msecs
;; transducers
[xs (into [] (range 1000000))], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 55 msecs
;; primitive array reduce 1000000 many ops
[xs (into-array (range 1000000))], (-> xs (.map inc) (.map inc) (.map inc) (.reduce (fn [a b] (+ a b)) 0)), 1 runs, 197 msecs
;; reduce range 1000000 many ops
[xs (range 1000000)], (reduce + 0 (map inc (map inc (map inc xs)))), 1 runs, 1296 msecs
;; transduce range 1000000 many ops 
[xs (range 1000000)], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 48 msecs


;; multimethods
[], (simple-multi :foo), 1000000 runs, 502 msecs


;; higher-order variadic function calls
[f array], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 50 msecs
[f vector], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 434 msecs
[], (= 1 1 1 1 1 1 1 1 1 0), 100000 runs, 132 msecs
Comment by David Nolen [ 20/Jul/15 10:35 PM ]

Michal it might be a GC thing? Not sure. These tests need to be run on more engines, kinda wish we had something a bit more visual by now

Comment by Michał Marczyk [ 20/Jul/15 11:32 PM ]

Indeed… I got the V8 situation sorted in the meantime and benchmarked master vs 0003 with a fresh build; I thought the results were pretty encouraging, particularly the 2x speedup for "small vector conj".

1. master:

Benchmarking with V8
[x 1], (identity x), 1000000 runs, 0 msecs
;; symbol construction
[], (symbol (quote foo)), 1000000 runs, 63 msecs

;; array-reduce & ci-reduce
[coll (seq arr)], (ci-reduce coll + 0), 1 runs, 24 msecs
[coll (seq arr)], (ci-reduce coll sum 0), 1 runs, 21 msecs
[coll arr], (array-reduce coll + 0), 1 runs, 14 msecs
[coll arr], (array-reduce coll sum 0), 1 runs, 14 msecs
;;; instance?
[coll []], (instance? PersistentVector coll), 1000000 runs, 6 msecs
;;; satisfies?
[coll (list 1 2 3)], (satisfies? ISeq coll), 1000000 runs, 12 msecs
[coll [1 2 3]], (satisfies? ISeq coll), 1000000 runs, 21 msecs

;;; array & string ops
[coll (array 1 2 3)], (seq coll), 1000000 runs, 26 msecs
[coll "foobar"], (seq coll), 1000000 runs, 31 msecs
[coll (array 1 2 3)], (first coll), 1000000 runs, 39 msecs
[coll "foobar"], (first coll), 1000000 runs, 59 msecs
[coll (array 1 2 3)], (nth coll 2), 1000000 runs, 37 msecs
[coll "foobar"], (nth coll 2), 1000000 runs, 139 msecs

;;; cloning & specify
[coll [1 2 3]], (clone coll), 1000000 runs, 26 msecs
[coll [1 2 3]], (specify coll IFoo (foo [_] :bar)), 1000000 runs, 61 msecs
[coll (specify [1 2 3] IFoo (foo [_] :bar))], (foo coll), 1000000 runs, 20 msecs

;;; list ops
[coll (list 1 2 3)], (first coll), 1000000 runs, 16 msecs
[coll (list 1 2 3)], (-first coll), 1000000 runs, 13 msecs
[coll (list 1 2 3)], (rest coll), 1000000 runs, 10 msecs
[coll (list 1 2 3)], (-rest coll), 1000000 runs, 11 msecs
[], (list), 1000000 runs, 5 msecs
[], (list 1 2 3), 1000000 runs, 67 msecs

;;; vector ops
[], [], 1000000 runs, 4 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count [a b c]), 1000000 runs, 71 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vec #object[cljs.tagged_literals.JSValue 0x158e6fc2 "cljs.tagged_literals.JSValue@158e6fc2"])), 1000000 runs, 56 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vector a b c)), 1000000 runs, 83 msecs
[coll [1 2 3]], (transient coll), 100000 runs, 28 msecs
[coll [1 2 3]], (nth coll 0), 1000000 runs, 23 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 25 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 22 msecs
[coll [1 2 3]], (coll 0), 1000000 runs, 27 msecs
[coll [1 2 3]], (conj coll 4), 1000000 runs, 64 msecs
[coll [1 2 3]], (-conj coll 4), 1000000 runs, 60 msecs
[coll []], (-conj coll 1), 1000000 runs, 53 msecs
[coll [1]], (-conj coll 2), 1000000 runs, 54 msecs
[coll [1 2]], (-conj coll 3), 1000000 runs, 53 msecs
[coll [1 2 3]], (seq coll), 1000000 runs, 26 msecs
[coll [1 2 3]], (-seq coll), 1000000 runs, 25 msecs
[coll (seq [1 2 3])], (first coll), 1000000 runs, 19 msecs
[coll (seq [1 2 3])], (-first coll), 1000000 runs, 16 msecs
[coll (seq [1 2 3])], (rest coll), 1000000 runs, 24 msecs
[coll (seq [1 2 3])], (-rest coll), 1000000 runs, 22 msecs
[coll (seq [1 2 3])], (next coll), 1000000 runs, 26 msecs

;;; large vector ops
[], (reduce conj [] (range 40000)), 10 runs, 56 msecs
[coll (reduce conj [] (range (+ 32768 32)))], (conj coll :foo), 100000 runs, 27 msecs
[coll (reduce conj [] (range 40000))], (assoc coll 123 :foo), 100000 runs, 64 msecs
[coll (reduce conj [] (range (+ 32768 33)))], (pop coll), 100000 runs, 23 msecs

;;; chunked seqs
[], (-first v), 1000000 runs, 14 msecs
[], (-next v), 1000000 runs, 32 msecs
[], (-rest v), 1000000 runs, 33 msecs

;;; transients
transient vector, conj! 1000000 items
"Elapsed time: 41 msecs"


;;; vector equality
[a (into [] (range 1000000)) b (into [] (range 1000000))], (= a b), 1 runs, 36 msecs

;;; keyword compare
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed)))))], (.sort arr compare), 100 runs, 327 msecs
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed) (rand-nth seed)))))], (.sort arr compare), 100 runs, 974 msecs

;;; reduce lazy-seqs, vectors, ranges
[coll (take 100000 (iterate inc 0))], (reduce + 0 coll), 1 runs, 74 msecs
[coll (range 1000000)], (reduce + 0 coll), 1 runs, 16 msecs
[coll (into [] (range 1000000))], (reduce + 0 coll), 1 runs, 28 msecs

;; apply
[coll (into [] (range 1000000))], (apply + coll), 1 runs, 61 msecs
[], (list 1 2 3 4 5), 1000000 runs, 146 msecs
[xs (array-seq (array 1 2 3 4 5))], (apply list xs), 1000000 runs, 121 msecs
[xs (list 1 2 3 4 5)], (apply list xs), 1000000 runs, 809 msecs
[xs [1 2 3 4 5]], (apply list xs), 1000000 runs, 141 msecs
[f (fn [a b & more])], (apply f (range 32)), 1000000 runs, 201 msecs
[f (fn [a b c d e f g h i j & more])], (apply f (range 32)), 1000000 runs, 483 msecs

;; update-in
[coll {:foo 1} ks [:foo]], (update-in coll ks inc), 1000000 runs, 290 msecs
[coll (array-map :foo 1) ks [:foo]], (update-in coll ks inc), 1000000 runs, 295 msecs

;;; obj-map
[coll (obj-map)], (assoc coll :foo :bar), 1000000 runs, 271 msecs
[coll (obj-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 27 msecs
[coll (obj-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 711 msecs
[coll (obj-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 23 msecs
[coll (obj-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 24 msecs

;;; array-map
[], {[1] true, [2] true, [3] true}, 1000000 runs, 1284 msecs
[coll (array-map)], (assoc coll :foo :bar), 1000000 runs, 66 msecs
[coll (array-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 43 msecs
[coll (array-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 72 msecs
[coll (array-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 52 msecs
[coll (array-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 56 msecs

;;; array-map w/ symbols
[coll (array-map)], (assoc coll a b), 1000000 runs, 79 msecs
[coll (array-map a b)], (-lookup coll a), 1000000 runs, 57 msecs
[coll (array-map a b)], (assoc coll c d), 1000000 runs, 87 msecs
[coll (array-map a b c d)], (-lookup coll c), 1000000 runs, 61 msecs
[coll (array-map a b c d e f)], (-lookup coll e), 1000000 runs, 70 msecs

;;; array-map w/ inline symbols
[coll (array-map)], (assoc coll (quote foo) (quote bar)), 1000000 runs, 142 msecs
[coll (array-map (quote foo) (quote bar))], (-lookup coll (quote foo)), 1000000 runs, 91 msecs
[coll (array-map (quote foo) (quote bar))], (assoc coll (quote baz) (quote woz)), 1000000 runs, 171 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz))], (-lookup coll (quote baz)), 1000000 runs, 99 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz) (quote lol) (quote rofl))], (-lookup coll (quote lol)), 1000000 runs, 106 msecs

;;; map / record ops
[coll {:foo 1, :bar 2}], (get coll :foo), 1000000 runs, 34 msecs
[coll {(quote foo) 1, (quote bar) 2}], (get coll (quote foo)), 1000000 runs, 84 msecs
[coll {:foo 1, :bar 2}], (-lookup coll :foo nil), 1000000 runs, 32 msecs
[coll {(quote foo) 1, (quote bar) 2}], (-lookup coll (quote foo) nil), 1000000 runs, 82 msecs
[coll {:foo 1, :bar 2}], (:foo coll), 1000000 runs, 40 msecs
[coll {(quote foo) 1, (quote bar) 2}], ((quote foo) coll), 1000000 runs, 119 msecs
[coll {:foo 1, :bar 2}], (kw coll), 1000000 runs, 47 msecs
[coll {(quote foo) 1, (quote bar) 2}], (sym coll), 1000000 runs, 70 msecs
[coll {:foo 1, :bar 2}], (loop [i 0 m coll] (if (< i 100000) (recur (inc i) (assoc m :foo 2)) m)), 1 runs, 9 msecs
[coll (Foo. 1 2)], (:bar coll), 1000000 runs, 36 msecs
[coll (Foo. 1 2)], (-lookup coll :bar), 1000000 runs, 29 msecs
[coll (Foo. 1 2)], (assoc coll :bar 2), 1000000 runs, 60 msecs
[coll (Foo. 1 2)], (assoc coll :baz 3), 1000000 runs, 69 msecs
[coll (Foo. 1 2)], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :bar 2)) m)), 1 runs, 47 msecs

;;; zipmap
[m {:a 1, :b 2, :c 3}], (zipmap (keys m) (map inc (vals m))), 100000 runs, 257 msecs

;;; persistent hash maps
[key :f0], (hash key), 1000000 runs, 13 msecs
[key "f0"], (m3-hash-unencoded-chars key), 1000000 runs, 24 msecs
[key :unsynchronized-mutable], (hash key), 1000000 runs, 13 msecs
[coll hash-coll-test], (hash-coll coll), 100 runs, 80 msecs
[coll hash-coll-test], (hash-ordered-coll coll), 100 runs, 75 msecs
[coll hash-imap-test], (hash-imap coll), 100 runs, 91 msecs
[coll hash-imap-test], (hash-unordered-coll coll), 100 runs, 83 msecs
[coll pmap], (:f0 coll), 1000000 runs, 64 msecs
[coll pmap], (get coll :f0), 1000000 runs, 56 msecs
[coll pmap], (-lookup coll :f0 nil), 1000000 runs, 45 msecs
[coll pmap], (-lookup hash-imap-test :foo500 nil), 1000000 runs, 78 msecs
[coll pmap], (-lookup hash-imap-int-test 500 nil), 1000000 runs, 224 msecs
[coll pmap], (assoc coll :g0 32), 1000000 runs, 405 msecs
[coll pmap], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :a 1)) m)), 1 runs, 83 msecs
[coll cljs.core.PersistentHashMap.EMPTY], (assoc coll :f0 1), 1000000 runs, 155 msecs

transient map, conj! 100000 items
"Elapsed time: 48 msecs"


;;; set ops
[], #{}, 1000000 runs, 5 msecs
[], #{1 3 2}, 1000000 runs, 0 msecs
[v [1 2 3]], (set v), 1000000 runs, 355 msecs
[], (hash-set 1 2 3), 1000000 runs, 0 msecs
[coll #{1 3 2}], (conj coll 4), 1000000 runs, 243 msecs
[coll #{1 3 2}], (get coll 2), 1000000 runs, 48 msecs
[coll #{1 3 2}], (contains? coll 2), 1000000 runs, 38 msecs
[coll #{1 3 2}], (coll 2), 1000000 runs, 54 msecs

;;; seq ops
[coll (range 500000)], (reduce + coll), 1 runs, 24 msecs

;;; reader
[s "{:foo [1 2 3]}"], (reader/read-string s), 1000 runs, 23 msecs
[s big-str-data], (reader/read-string s), 1000 runs, 654 msecs

;;; range
[r (range 1000000)], (last r), 1 runs, 42 msecs

;;; lazy-seq
;;; first run
[r r], (last r), 1 runs, 319 msecs
;;; second run
[r r], (last r), 1 runs, 87 msecs

;;; comprehensions
[xs (range 512)], (last (for [x xs y xs] (+ x y))), 1 runs, 246 msecs
[xs (vec (range 512))], (last (for [x xs y xs] (+ x y))), 4 runs, 163 msecs
[a (Box. 0) xs (range 512)], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 134 msecs
[a (Box. 0) xs (vec (range 512))], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 22 msecs

;; reducers
[xs (into [] (range 1000000))], (r/reduce + (r/map inc (r/map inc (r/map inc xs)))), 1 runs, 85 msecs
;; transducers
[xs (into [] (range 1000000))], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 105 msecs
;; primitive array reduce 1000000 many ops
[xs (into-array (range 1000000))], (-> xs (.map inc) (.map inc) (.map inc) (.reduce (fn [a b] (+ a b)) 0)), 1 runs, 359 msecs
;; reduce range 1000000 many ops
[xs (range 1000000)], (reduce + 0 (map inc (map inc (map inc xs)))), 1 runs, 1413 msecs
;; transduce range 1000000 many ops 
[xs (range 1000000)], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 80 msecs


;; multimethods
[], (simple-multi :foo), 1000000 runs, 134 msecs


;; higher-order variadic function calls
[f array], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 8 msecs
[f vector], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 30 msecs
[], (= 1 1 1 1 1 1 1 1 1 0), 100000 runs, 95 msecs

2. 0003:

Benchmarking with V8
[x 1], (identity x), 1000000 runs, 0 msecs
;; symbol construction
[], (symbol (quote foo)), 1000000 runs, 51 msecs

;; array-reduce & ci-reduce
[coll (seq arr)], (ci-reduce coll + 0), 1 runs, 23 msecs
[coll (seq arr)], (ci-reduce coll sum 0), 1 runs, 19 msecs
[coll arr], (array-reduce coll + 0), 1 runs, 13 msecs
[coll arr], (array-reduce coll sum 0), 1 runs, 11 msecs
;;; instance?
[coll []], (instance? PersistentVector coll), 1000000 runs, 6 msecs
;;; satisfies?
[coll (list 1 2 3)], (satisfies? ISeq coll), 1000000 runs, 12 msecs
[coll [1 2 3]], (satisfies? ISeq coll), 1000000 runs, 22 msecs

;;; array & string ops
[coll (array 1 2 3)], (seq coll), 1000000 runs, 27 msecs
[coll "foobar"], (seq coll), 1000000 runs, 39 msecs
[coll (array 1 2 3)], (first coll), 1000000 runs, 34 msecs
[coll "foobar"], (first coll), 1000000 runs, 44 msecs
[coll (array 1 2 3)], (nth coll 2), 1000000 runs, 35 msecs
[coll "foobar"], (nth coll 2), 1000000 runs, 137 msecs

;;; cloning & specify
[coll [1 2 3]], (clone coll), 1000000 runs, 23 msecs
[coll [1 2 3]], (specify coll IFoo (foo [_] :bar)), 1000000 runs, 69 msecs
[coll (specify [1 2 3] IFoo (foo [_] :bar))], (foo coll), 1000000 runs, 20 msecs

;;; list ops
[coll (list 1 2 3)], (first coll), 1000000 runs, 16 msecs
[coll (list 1 2 3)], (-first coll), 1000000 runs, 13 msecs
[coll (list 1 2 3)], (rest coll), 1000000 runs, 10 msecs
[coll (list 1 2 3)], (-rest coll), 1000000 runs, 10 msecs
[], (list), 1000000 runs, 4 msecs
[], (list 1 2 3), 1000000 runs, 67 msecs

;;; vector ops
[], [], 1000000 runs, 4 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count [a b c]), 1000000 runs, 40 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vec #object[cljs.tagged_literals.JSValue 0x3e5ebdfe "cljs.tagged_literals.JSValue@3e5ebdfe"])), 1000000 runs, 55 msecs
[[a b c] (take 3 (repeatedly (fn* [] (rand-int 10))))], (-count (vector a b c)), 1000000 runs, 46 msecs
[coll [1 2 3]], (transient coll), 100000 runs, 31 msecs
[coll [1 2 3]], (nth coll 0), 1000000 runs, 16 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 16 msecs
[coll [1 2 3]], (-nth coll 0), 1000000 runs, 16 msecs
[coll [1 2 3]], (coll 0), 1000000 runs, 24 msecs
[coll [1 2 3]], (conj coll 4), 1000000 runs, 31 msecs
[coll [1 2 3]], (-conj coll 4), 1000000 runs, 29 msecs
[coll []], (-conj coll 1), 1000000 runs, 25 msecs
[coll [1]], (-conj coll 2), 1000000 runs, 22 msecs
[coll [1 2]], (-conj coll 3), 1000000 runs, 26 msecs
[coll [1 2 3]], (seq coll), 1000000 runs, 26 msecs
[coll [1 2 3]], (-seq coll), 1000000 runs, 26 msecs
[coll (seq [1 2 3])], (first coll), 1000000 runs, 28 msecs
[coll (seq [1 2 3])], (-first coll), 1000000 runs, 24 msecs
[coll (seq [1 2 3])], (rest coll), 1000000 runs, 30 msecs
[coll (seq [1 2 3])], (-rest coll), 1000000 runs, 26 msecs
[coll (seq [1 2 3])], (next coll), 1000000 runs, 29 msecs

;;; large vector ops
[], (reduce conj [] (range 40000)), 10 runs, 60 msecs
[coll (reduce conj [] (range (+ 32768 32)))], (conj coll :foo), 100000 runs, 32 msecs
[coll (reduce conj [] (range 40000))], (assoc coll 123 :foo), 100000 runs, 63 msecs
[coll (reduce conj [] (range (+ 32768 33)))], (pop coll), 100000 runs, 22 msecs

;;; chunked seqs
[], (-first v), 1000000 runs, 14 msecs
[], (-next v), 1000000 runs, 36 msecs
[], (-rest v), 1000000 runs, 33 msecs

;;; transients
transient vector, conj! 1000000 items
"Elapsed time: 44 msecs"


;;; vector equality
[a (into [] (range 1000000)) b (into [] (range 1000000))], (= a b), 1 runs, 37 msecs

;;; keyword compare
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed)))))], (.sort arr compare), 100 runs, 281 msecs
[arr (into-array (repeatedly 10000 (fn* [] (keyword (rand-nth seed) (rand-nth seed)))))], (.sort arr compare), 100 runs, 1025 msecs

;;; reduce lazy-seqs, vectors, ranges
[coll (take 100000 (iterate inc 0))], (reduce + 0 coll), 1 runs, 75 msecs
[coll (range 1000000)], (reduce + 0 coll), 1 runs, 17 msecs
[coll (into [] (range 1000000))], (reduce + 0 coll), 1 runs, 25 msecs

;; apply
[coll (into [] (range 1000000))], (apply + coll), 1 runs, 69 msecs
[], (list 1 2 3 4 5), 1000000 runs, 206 msecs
[xs (array-seq (array 1 2 3 4 5))], (apply list xs), 1000000 runs, 121 msecs
[xs (list 1 2 3 4 5)], (apply list xs), 1000000 runs, 757 msecs
[xs [1 2 3 4 5]], (apply list xs), 1000000 runs, 924 msecs
[f (fn [a b & more])], (apply f (range 32)), 1000000 runs, 184 msecs
[f (fn [a b c d e f g h i j & more])], (apply f (range 32)), 1000000 runs, 453 msecs

;; update-in
[coll {:foo 1} ks [:foo]], (update-in coll ks inc), 1000000 runs, 320 msecs
[coll (array-map :foo 1) ks [:foo]], (update-in coll ks inc), 1000000 runs, 301 msecs

;;; obj-map
[coll (obj-map)], (assoc coll :foo :bar), 1000000 runs, 267 msecs
[coll (obj-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 27 msecs
[coll (obj-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 727 msecs
[coll (obj-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 24 msecs
[coll (obj-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 25 msecs

;;; array-map
[], {[1] true, [2] true, [3] true}, 1000000 runs, 762 msecs
[coll (array-map)], (assoc coll :foo :bar), 1000000 runs, 66 msecs
[coll (array-map :foo :bar)], (-lookup coll :foo), 1000000 runs, 50 msecs
[coll (array-map :foo :bar)], (assoc coll :baz :woz), 1000000 runs, 74 msecs
[coll (array-map :foo :bar :baz :woz)], (-lookup coll :baz), 1000000 runs, 56 msecs
[coll (array-map :foo :bar :baz :woz :lol :rofl)], (-lookup coll :lol), 1000000 runs, 62 msecs

;;; array-map w/ symbols
[coll (array-map)], (assoc coll a b), 1000000 runs, 82 msecs
[coll (array-map a b)], (-lookup coll a), 1000000 runs, 61 msecs
[coll (array-map a b)], (assoc coll c d), 1000000 runs, 90 msecs
[coll (array-map a b c d)], (-lookup coll c), 1000000 runs, 65 msecs
[coll (array-map a b c d e f)], (-lookup coll e), 1000000 runs, 72 msecs

;;; array-map w/ inline symbols
[coll (array-map)], (assoc coll (quote foo) (quote bar)), 1000000 runs, 142 msecs
[coll (array-map (quote foo) (quote bar))], (-lookup coll (quote foo)), 1000000 runs, 92 msecs
[coll (array-map (quote foo) (quote bar))], (assoc coll (quote baz) (quote woz)), 1000000 runs, 163 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz))], (-lookup coll (quote baz)), 1000000 runs, 102 msecs
[coll (array-map (quote foo) (quote bar) (quote baz) (quote woz) (quote lol) (quote rofl))], (-lookup coll (quote lol)), 1000000 runs, 105 msecs

;;; map / record ops
[coll {:foo 1, :bar 2}], (get coll :foo), 1000000 runs, 35 msecs
[coll {(quote foo) 1, (quote bar) 2}], (get coll (quote foo)), 1000000 runs, 86 msecs
[coll {:foo 1, :bar 2}], (-lookup coll :foo nil), 1000000 runs, 31 msecs
[coll {(quote foo) 1, (quote bar) 2}], (-lookup coll (quote foo) nil), 1000000 runs, 80 msecs
[coll {:foo 1, :bar 2}], (:foo coll), 1000000 runs, 42 msecs
[coll {(quote foo) 1, (quote bar) 2}], ((quote foo) coll), 1000000 runs, 116 msecs
[coll {:foo 1, :bar 2}], (kw coll), 1000000 runs, 47 msecs
[coll {(quote foo) 1, (quote bar) 2}], (sym coll), 1000000 runs, 67 msecs
[coll {:foo 1, :bar 2}], (loop [i 0 m coll] (if (< i 100000) (recur (inc i) (assoc m :foo 2)) m)), 1 runs, 5 msecs
[coll (Foo. 1 2)], (:bar coll), 1000000 runs, 35 msecs
[coll (Foo. 1 2)], (-lookup coll :bar), 1000000 runs, 30 msecs
[coll (Foo. 1 2)], (assoc coll :bar 2), 1000000 runs, 52 msecs
[coll (Foo. 1 2)], (assoc coll :baz 3), 1000000 runs, 61 msecs
[coll (Foo. 1 2)], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :bar 2)) m)), 1 runs, 44 msecs

;;; zipmap
[m {:a 1, :b 2, :c 3}], (zipmap (keys m) (map inc (vals m))), 100000 runs, 230 msecs

;;; persistent hash maps
[key :f0], (hash key), 1000000 runs, 13 msecs
[key "f0"], (m3-hash-unencoded-chars key), 1000000 runs, 22 msecs
[key :unsynchronized-mutable], (hash key), 1000000 runs, 11 msecs
[coll hash-coll-test], (hash-coll coll), 100 runs, 70 msecs
[coll hash-coll-test], (hash-ordered-coll coll), 100 runs, 65 msecs
[coll hash-imap-test], (hash-imap coll), 100 runs, 73 msecs
[coll hash-imap-test], (hash-unordered-coll coll), 100 runs, 96 msecs
[coll pmap], (:f0 coll), 1000000 runs, 64 msecs
[coll pmap], (get coll :f0), 1000000 runs, 52 msecs
[coll pmap], (-lookup coll :f0 nil), 1000000 runs, 47 msecs
[coll pmap], (-lookup hash-imap-test :foo500 nil), 1000000 runs, 79 msecs
[coll pmap], (-lookup hash-imap-int-test 500 nil), 1000000 runs, 216 msecs
[coll pmap], (assoc coll :g0 32), 1000000 runs, 405 msecs
[coll pmap], (loop [i 0 m coll] (if (< i 1000000) (recur (inc i) (assoc m :a 1)) m)), 1 runs, 80 msecs
[coll cljs.core.PersistentHashMap.EMPTY], (assoc coll :f0 1), 1000000 runs, 156 msecs

transient map, conj! 100000 items
"Elapsed time: 53 msecs"


;;; set ops
[], #{}, 1000000 runs, 5 msecs
[], #{1 3 2}, 1000000 runs, 0 msecs
[v [1 2 3]], (set v), 1000000 runs, 515 msecs
[], (hash-set 1 2 3), 1000000 runs, 0 msecs
[coll #{1 3 2}], (conj coll 4), 1000000 runs, 266 msecs
[coll #{1 3 2}], (get coll 2), 1000000 runs, 50 msecs
[coll #{1 3 2}], (contains? coll 2), 1000000 runs, 38 msecs
[coll #{1 3 2}], (coll 2), 1000000 runs, 62 msecs

;;; seq ops
[coll (range 500000)], (reduce + coll), 1 runs, 23 msecs

;;; reader
[s "{:foo [1 2 3]}"], (reader/read-string s), 1000 runs, 30 msecs
[s big-str-data], (reader/read-string s), 1000 runs, 636 msecs

;;; range
[r (range 1000000)], (last r), 1 runs, 44 msecs

;;; lazy-seq
;;; first run
[r r], (last r), 1 runs, 322 msecs
;;; second run
[r r], (last r), 1 runs, 90 msecs

;;; comprehensions
[xs (range 512)], (last (for [x xs y xs] (+ x y))), 1 runs, 229 msecs
[xs (vec (range 512))], (last (for [x xs y xs] (+ x y))), 4 runs, 196 msecs
[a (Box. 0) xs (range 512)], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 133 msecs
[a (Box. 0) xs (vec (range 512))], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 4 runs, 23 msecs

;; reducers
[xs (into [] (range 1000000))], (r/reduce + (r/map inc (r/map inc (r/map inc xs)))), 1 runs, 85 msecs
;; transducers
[xs (into [] (range 1000000))], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 108 msecs
;; primitive array reduce 1000000 many ops
[xs (into-array (range 1000000))], (-> xs (.map inc) (.map inc) (.map inc) (.reduce (fn [a b] (+ a b)) 0)), 1 runs, 349 msecs
;; reduce range 1000000 many ops
[xs (range 1000000)], (reduce + 0 (map inc (map inc (map inc xs)))), 1 runs, 1387 msecs
;; transduce range 1000000 many ops 
[xs (range 1000000)], (transduce (comp (map inc) (map inc) (map inc)) + 0 xs), 1 runs, 79 msecs


;; multimethods
[], (simple-multi :foo), 1000000 runs, 122 msecs


;; higher-order variadic function calls
[f array], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 8 msecs
[f vector], (f 1 2 3 4 5 6 7 8 9 0), 100000 runs, 154 msecs
[], (= 1 1 1 1 1 1 1 1 1 0), 100000 runs, 94 msecs
Comment by Michał Marczyk [ 20/Jul/15 11:35 PM ]

(No rebase this time, as 0003 still applies cleanly and all tests pass.)

Comment by David Nolen [ 10/Nov/15 8:41 AM ]

De-prioritized. We need to be able to prove the issues around the proposed JVM approach doesn't also appear under popular JS engines.





[CLJS-1446] autodoc + gh-pages for cljs.*.api namespaces Created: 11/Sep/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Task Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: newbie


 Comments   
Comment by W. David Jarvis [ 11/Sep/15 6:07 PM ]

I just tried to get this working - unfortunately, autodoc doesn't currently have support for ClojureScript. An issue is currently open on the GH project here but it doesn't look like it's seen any movement in nearly two years.

Comment by Tom Faulhaber [ 13/Sep/15 2:26 PM ]

I would love to see this work as well and, as the author of autodoc, am happy to help move it forward. I've added some commentary to the issue in autodoc about how to do this. If it's going to happen soon, though, I will need some help from the ClojureScript community as outlined over there.

Comment by David Nolen [ 14/Sep/15 10:42 AM ]

This ticket is about generating docs for Clojure code. Getting autodoc to work for ClojureScript files is worth pursuing but unrelated to this ticket.

Comment by Sebastian Bensusan [ 11/Oct/15 5:54 PM ]

I took at stab at this and only got it running using autodoc-0.9.0-standalone.jar from the command line. My results are not useful at all but those issues should be sorted out in autodoc.

David, do you have a preference in how the docs and artifacts needed should be managed? Should it be a lein plugin or can it be a script that assumes that the correct jars have been installed?

Comment by Tom Faulhaber [ 12/Oct/15 12:37 AM ]

Oh, I did misunderstand this and then didn't see David Nolen's follow-up until now. Let me take a look at whether I can make this happen pretty easily. I wouldn't think it would be too difficult. (Famous last words!)





[CLJS-1447] IFn implementors have a broken call implementation, all args after 20th argument should be collected into a seq Created: 11/Sep/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Task Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

Regular fns (which are just JavaScript fns) have no such limit. For IFn implementors we should not allow arities above 21 args, and we should transform the 21st arity into a var args signature.






[CLJS-1461] Convert analyzer to conform to tools.analyzer's spec Created: 28/Sep/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Enhancement Priority: Major
Reporter: Ambrose Bonnaire-Sergeant Assignee: Ambrose Bonnaire-Sergeant
Resolution: Unresolved Votes: 3
Labels: None


 Description   

tools.analyzer has a handy common AST format for map-based analysis results. We should use this format in the ClojureScript analyzer so tooling that already accepts this format can work seamlessly with ClojureScript.






[CLJS-1497] `find` on an associative collection does not return collection key Created: 30/Nov/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Major
Reporter: David Nolen Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: None


 Description   

Instead find returns the passed in key. This means metadata on the key will appear to be lost. Related to CLJS-1496.






[CLJS-1501] Add :parallel-build support to REPLs Created: 05/Dec/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Task Priority: Major
Reporter: David Nolen Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: None


 Description   

The :parallel-build option does not currently work in REPLs due to the implementation of cljs.repl/load-namespace






[CLJS-1453] cljs.compiler/load-libs does not preserve user expressed require order Created: 17/Sep/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

Due to putting the requires into a map the original order is lost. This is a problem primarily when order specific side effects are present in the required namespaces.






[CLJS-1485] Error when requiring `goog` namespace in a ns declaration Created: 10/Nov/15  Updated: 11/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: Next

Type: Defect Priority: Minor
Reporter: Avicenna Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None


 Description   

I wanted to use functions from goog namespace although--as I found out later, I didn't have to because goog is already exists in my namespace. So, I put (:require [goog]) in a ns declaration. Then, when I tried to reload that particular namespace by doing :require :reload in a cljs repl, I got:

Error: Namespace "x.x.x" already declared.

Doing :require :reload again in the cljs repl makes the repl throws

Error: Namespace "cljs.user" already declared.
(NO_SOURCE_FILE)
(out/goog/base.js:273:40)

I tested the steps below using clojurescript 1.7.145 and 1.7.170.

Here are the steps to reproduce which are taken from clojurescript quickstart-browser repl section:

1. Download the standalone clojurescript 1.7.170 jar https://github.com/clojure/clojurescript/releases/download/r1.7.170/cljs.jar

2. Create a directory hello_world and copy the JAR into that directory, then from inside the hello_world directory:

mkdir -p src/hello_world;touch repl.clj;touch index.html;touch src/hello_world/core.cljs

3. repl.clj content

(require 'cljs.repl)
(require 'cljs.build.api)
(require 'cljs.repl.browser)

(cljs.build.api/build "src"
  {:main 'hello-world.core
   :output-to "out/main.js"
   :verbose true})

(cljs.repl/repl (cljs.repl.browser/repl-env)
  :watch "src"
  :output-dir "out")

4. index.html content

<html>
    <body>
        <script type="text/javascript" src="out/main.js"></script>
    </body>
</html>

5. src/hello_world/core.cljs content

(ns hello-world.core
  (:require [clojure.browser.repl :as repl]))

(defonce conn
  (repl/connect "http://localhost:9000/repl"))

(enable-console-print!)

(println "Hello world!")

(defn foo [a b]
  (+ a b))

6. run clojurescript repl

java -cp cljs.jar:src clojure.main repl.clj

7. Open http://localhost:9000 in browser (I use google chrome). Open javascript console.

8. enter expression below in the clojurescript repl

(require '[hello-world.core :as hello] :reload)

10. Look the browser javascript console. Nothing new shown.

11. Quit from the repl using :cljs/quit

12. Add [goog] in ns declaration in src/hello_world/core.cljs so that the content of the file becomes:

(ns hello-world.core
  (:require [clojure.browser.repl :as repl]
            [goog]))

(defonce conn
  (repl/connect "http://localhost:9000/repl"))

(enable-console-print!)

(println "Hello world!")

(defn foo [a b]
  (+ a b))

13. Run the clojurescript repl again

java -cp cljs.jar:src clojure.main repl.clj

14. Now refresh the http://localhost:9000 in browser. Make sure the javascript console stays open.

13. enter expression below in the clojurescript repl

(require '[hello-world.core :as hello] :reload)
;;=> nil

it just returns nil

15. See the javascript console, it shows

Uncaught Error: Namespace "hello_world.core" already declared.

16. Executing this expression again (require '[hello-world.core :as hello] :reload) shows nothing new in the browser's javascript console while the clojurescript repl throws

Error: Namespace "cljs.user" already declared.
(NO_SOURCE_FILE)
(out/goog/base.js:273:40)





[CLJS-1538] Type hint some cljs.core predicates Created: 06/Jan/16  Updated: 06/Jan/16  Resolved: 06/Jan/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: None

Type: Enhancement Priority: Minor
Reporter: Mike Fikes Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: performance

Attachments: Text File CLJS-1538-2.patch     Text File CLJS-1538.patch    
Patch: Code

 Description   

There are a handful of predicates in cljs.core that can be type hinted. They all delegate directly to either instance? or satisfies?.

The set comprises: var?, iterable?, cloneable?, volatile?, tagged-literal?



 Comments   
Comment by Mike Fikes [ 06/Jan/16 4:30 PM ]

2nd patch employs ^boolean not ^:boolean

Comment by David Nolen [ 06/Jan/16 5:27 PM ]

fixed https://github.com/clojure/clojurescript/commit/bc6f93e937f3f80cd8c47097863399752189d561





[CLJS-1539] Parallel compilation fails on circular dependencies Created: 06/Jan/16  Updated: 06/Jan/16  Resolved: 06/Jan/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: None

Type: Defect Priority: Major
Reporter: David Nolen Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: None


 Description   

Master test will not run due to the circular dependency between circular-deps.a and circular-deps.b test namespaces.



 Comments   
Comment by David Nolen [ 06/Jan/16 2:34 PM ]

We should probably just validate that the inputs do not include a circular dependency before starting parallel compilation.

Comment by David Nolen [ 06/Jan/16 4:15 PM ]

fixed https://github.com/clojure/clojurescript/commit/5724f72ad92d62b93cdf1afe19e4bbfc7b6ddecc





[CLJS-1537] Circular dependency detection regression Created: 06/Jan/16  Updated: 06/Jan/16  Resolved: 06/Jan/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.145
Fix Version/s: 1.7.228

Type: Defect Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Completed Votes: 0
Labels: None


 Description   

The following will result in a StackOverflow error - somehow the circular dependency checking in place in cljs.analyzer/analyze-deps is no longer working.

(ns hello-world.core
  (:require [hello-world.foo]))

(defn hello-world []
  (println "Hello world!"))
(ns hello-world.foo
  (:require [hello-world.core]))

(defn yadda [x y]
  (/ x y))

The patch should include a analysis/compiler test that can be checked with `lein test`.



 Comments   
Comment by David Nolen [ 06/Jan/16 12:33 PM ]

fixed https://github.com/clojure/clojurescript/commit/27bbf822902506c1c0c63c1345cbf7fc6f8c819d





[CLJS-374] satisfies? produces strange code when the protocol is not in the fast-path list Created: 06/Sep/12  Updated: 05/Jan/16

Status: Open
Project: ClojureScript
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Minor
Reporter: David Nolen Assignee: David Nolen
Resolution: Unresolved Votes: 0
Labels: None





[CLJS-1482] Returning function from let with attached metadata results in invalid Javascript Created: 05/Nov/15  Updated: 05/Jan/16  Resolved: 05/Jan/16

Status: Closed
Project: ClojureScript
Component/s: None
Affects Version/s: 1.7.28, 1.7.48, 1.7.145
Fix Version/s: None

Type: Defect Priority: Major
Reporter: rt Assignee: Unassigned
Resolution: Completed Votes: 0
Labels: javascript
Environment:

Linux & FreeBSD + 64bit OpenJDK8



 Description   

Consider the following code:

core.cljs
(defn this-is-messed-up []
  (let [x 1]
    ^{:my-metadata "oh no!"}
    (fn [] (+ x 1))))

(println ((this-is-messed-up)))

It works and prints 2 in regular Clojure (1.7.0), but compiles to the following Javascript with ClojureScript:

core.js
let_fn_test.core.this_is_messed_up = (function let_fn_test$core$this_is_messed_up(){
var x = (1);
return cljs.core.with_meta(((function (x){