<< Back to previous view

[CLJS-2368] Self-host: Never compile macro namespaces with `:optimize-constants true` Created: 23/Sep/17  Updated: 25/Sep/17  Resolved: 25/Sep/17

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

Type: Defect Priority: Major
Reporter: António Nuno Monteiro Assignee: António Nuno Monteiro
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Description   

Macro namespaces may be evaluated in a compiler environment that is different from the one which has emitted the constants table, which leads to cryptic errors because the constants are not available in the evaluating environment.



 Comments   
Comment by David Nolen [ 24/Sep/17 4:43 AM ]

Looks like this one needs a rebase

Comment by David Nolen [ 25/Sep/17 1:34 AM ]

fixed https://github.com/clojure/clojurescript/commit/7916a6782b672c80a8c31621b0e66d3dc88db73a





[CLJS-2367] Self-host: :def-emits-var leaks into loaded namespace processing Created: 20/Sep/17  Updated: 24/Sep/17  Resolved: 24/Sep/17

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

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

Attachments: Text File CLJS-2367.patch    
Patch: Code and Test
Approval: Accepted

 Description   

If you require a namespace, any defs in that namespace should return the value, not the Var. On the other hand, defs evaluated at the REPL return Vars because :def-emits-var is set to true.

In self-hosted ClojureScript, defs in loaded namespaces produce Vars if :def-emits-var is set to true.

Here is a minimal repro:

(require 'cljs.js)

(def st (cljs.js/empty-state))

(cljs.js/eval st
  '(require (quote foo.core))
  {:context :expr
   :def-emits-var true
   :eval cljs.js/js-eval
   :load (fn [_ cb]
           (cb {:lang :clj
                :source "(ns foo.core) (def b (def a 3))"}))}
  prn)

(cljs.js/eval st
  'foo.core/b
  {:context :expr
   :eval cljs.js/js-eval}
  prn)

The last form should cause

{:value 3}

to be printed, but instead you get

{:value #'foo.core/a}
.

Similarly, for a macros namespace, this minimal repro

(cljs.js/eval st
  '(require-macros (quote bar.core))
  {:context :expr
   :def-emits-var true
   :eval cljs.js/js-eval
   :load (fn [_ cb]
           (cb {:lang :clj
                :source "(ns bar.core) (def b (def a 3)) (defmacro c [] b)"}))}
  prn)

(cljs.js/eval st
  '(bar.core/c)
  {:context :expr
   :eval cljs.js/js-eval}
  prn)

Should cause

{:value 3}

to be printed, but currently this will cause things to really derail with

Error: failed compiling constant: #'bar.core$macros/a; ...


 Comments   
Comment by David Nolen [ 24/Sep/17 4:41 AM ]

fixed https://github.com/clojure/clojurescript/commit/4607affd1f399839b44eef1aa01e0645cee539d4





[CLJS-2365] Self-host: Unable to reload namespace while in it Created: 18/Sep/17  Updated: 20/Sep/17

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

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


 Description   

There is an unreleased self-host regression where requiring a namespace while in that namespace triggers circular dependency detection.

As a concrete example, let's say you are in a REPL, and you require a namespace, go into that namespace (using in-ns), exercise it a little, and then change the code to fix something and then reload it. This now fails on master for self-hosted code.

A repro following this example is the following:

(require 'cljs.js)

(def st (cljs.js/empty-state))

(cljs.js/eval st
  '(require (quote foo.core))
  {:context :expr
   :eval cljs.js/js-eval
   :load (fn [_ cb]
           (cb {:lang :clj
                :source "(ns foo.core) (def x 1)"}))}
  prn)

(cljs.js/eval st
  '(require (quote foo.core) :reload)
  {:context :expr
   :ns 'foo.core
   :eval cljs.js/js-eval
   :load (fn [_ cb]
           (cb {:lang :clj
                :source "(ns foo.core) (def x 2)"}))}
  prn)

This causes the following on master, but not with the 1.9.908 release:

{:error #error {:message "Circular dependency detected foo.core -> foo.core", :data {:tag :cljs/analysis-error}}}

(Strictly speaking, the above example is not minimal in that :reload is not required in order to reproduce it: It will happen if you simply attempt to require the namespace while "in" it.)



 Comments   
Comment by Mike Fikes [ 18/Sep/17 10:19 AM ]

Git bisect result implicates CLJS-2356:

238028ccc51afe45de98fb853be4396a71afb602 is the first bad commit
commit 238028ccc51afe45de98fb853be4396a71afb602
Author: Antonio Nuno Monteiro <anmonteiro@gmail.com>
Date:   Sun Sep 10 21:24:22 2017 -0700

    CLJS-2356: Self-host: circular dependency detection is not correct

:040000 040000 a93d466e3f1ea042e730fb78ca911f92319880d0 29108cab4b45247e641d430d85dda85c436e95fe M	src
Comment by Mike Fikes [ 18/Sep/17 3:22 PM ]

Here is the result from some analysis by António and me: There are a few places in the self-host compiler code which make use of :def-emits-var to deduce that self-host is being used to implement a REPL. In particular, the code being exercised in the ticket description works if you include :def-emits-var true in the options passed. But, if you are evaluating a "load" form, such as require and others, if :def-emits-var is set, then it can be seen that code inside the loaded namespaces gets compiled with def (and derived) forms producing Vars. (This can be seen if you make use of the self-hosted caching option.) Perhaps this is incorrect behavior (I believe it doesn't occur with JVM ClojureScript, for example). With the current behavior, if a REPL chooses to not set :def-emits-var true for "load" forms, then you encounter the issue described in the ticket description. So, in short, the underlying issue in this ticket could either be fixed or deemed OK, and the other issue mentioned here regarding def forms inside required namespaces could be split off as a separate ticket that could be pursued on its own.

Comment by Mike Fikes [ 20/Sep/17 1:10 PM ]

With CLJS-2367, I suspect this ticket becomes a non-issue, because REPLs can unconditionally (always) set :def-emits-var.





[CLJS-2361] Self-host: circular dependency detection doesn't handle REPL self-require Created: 13/Sep/17  Updated: 15/Sep/17  Resolved: 15/Sep/17

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

Type: Defect Priority: Major
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-2361.patch    
Patch: Code and Test
Approval: Accepted

 Comments   
Comment by David Nolen [ 15/Sep/17 3:22 PM ]

fixed https://github.com/clojure/clojurescript/commit/3c0df9c6e712ea1cb2e8a469b5ceaf0dff17d458





[CLJS-2357] Self-host: run all async tests Created: 10/Sep/17  Updated: 11/Sep/17  Resolved: 11/Sep/17

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

Type: Enhancement Priority: Major
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap, test

Attachments: Text File CLJS-2357.patch    
Patch: Code and Test
Approval: Accepted

 Comments   
Comment by David Nolen [ 11/Sep/17 6:37 AM ]

fixed https://github.com/clojure/clojurescript/commit/33ce3d5c1c5d9fd4c38fbc6798a8d7085338eb4d





[CLJS-2356] Self-host: circular dependency detection is not correct Created: 10/Sep/17  Updated: 18/Sep/17  Resolved: 11/Sep/17

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

Type: Defect Priority: Major
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-2356.patch    
Patch: Code and Test
Approval: Accepted

 Description   

Patch should be applied after CLJS-2354



 Comments   
Comment by David Nolen [ 11/Sep/17 6:36 AM ]

fixed https://github.com/clojure/clojurescript/commit/238028ccc51afe45de98fb853be4396a71afb602

Comment by Mike Fikes [ 18/Sep/17 10:20 AM ]

See regression in CLJS-2365.





[CLJS-2354] Self-host: `compile-str` doesn't handle `clojure` -> `cljs` aliasing Created: 10/Sep/17  Updated: 11/Sep/17  Resolved: 11/Sep/17

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

Type: Defect Priority: Major
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-2354.patch    
Patch: Code and Test
Approval: Accepted

 Comments   
Comment by David Nolen [ 11/Sep/17 6:35 AM ]

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





[CLJS-2303] Disable duplicate alias checking for self-host Created: 05/Aug/17  Updated: 07/Aug/17  Resolved: 07/Aug/17

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

Type: Defect Priority: Major
Reporter: António Nuno Monteiro Assignee: António Nuno Monteiro
Resolution: Completed Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-2303.patch     Text File CLJS-2303-rebased.patch    
Patch: Code and Test
Approval: Accepted

 Description   

Because self-host has its own logic for `clojure` -> `cljs` namespace aliasing, the following snippet fails:

(require 'clojure.test)
(require 'clojure.test)
Alias clojure.test already exists in namespace cljs.user, aliasing cljs.test


 Comments   
Comment by António Nuno Monteiro [ 05/Aug/17 9:30 PM ]

The patch for this ticket should be applied after CLJS-2266, or it will demonstrate that issue.

Comment by David Nolen [ 07/Aug/17 7:19 AM ]

Patch needs to be rebased on master.

Comment by David Nolen [ 07/Aug/17 8:59 PM ]

fixed https://github.com/clojure/clojurescript/commit/6e0715ca03d642700e9f538a95961a3dca4104f1





[CLJS-2293] Self-host: Can't load cljs.js owing to set alias Created: 02/Aug/17  Updated: 03/Aug/17  Resolved: 03/Aug/17

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

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

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

 Description   

On master with script/noderepljs:

cljs.user=> (require 'cljs.js)
WARNING: No such namespace: set, could not locate set.cljs, set.cljc, or JavaScript source providing "" at line 361 /Users/mfikes/Projects/clojurescript/src/main/clojure/cljs/compiler.cljc
WARNING: Use of undeclared Var set/difference at line 361 /Users/mfikes/Projects/clojurescript/src/main/clojure/cljs/compiler.cljc
nil


 Comments   
Comment by David Nolen [ 03/Aug/17 6:44 AM ]

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





[CLJS-2287] Self-host: `require` prints result of loading node deps / global exports Created: 30/Jul/17  Updated: 01/Aug/17  Resolved: 01/Aug/17

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

Type: Defect Priority: Major
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-2287.patch    
Patch: Code and Test
Approval: Accepted

 Comments   
Comment by António Nuno Monteiro [ 30/Jul/17 11:43 PM ]

The attached patch emits `null` when `:def-emits-var` is true, since there's no `:repl-env` in bootstrap.

We could also make it so that the patch always emits `null`, but that would result in potentially extraneous code being emitted if not at the REPL.

Comment by David Nolen [ 01/Aug/17 7:22 AM ]

fixed https://github.com/clojure/clojurescript/commit/9ac09b2d0bcf6155302c2054d92d150d2d29d990





[CLJS-2276] Self-host: Need test.check dep for CLJS-2275 Created: 27/Jul/17  Updated: 27/Jul/17  Resolved: 27/Jul/17

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

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

Attachments: Text File CLJS-2276.patch    
Patch: Code and Test
Approval: Accepted

 Description   

The change in CLJS-2275 requires that we be able to load test.check in self host.



 Comments   
Comment by Mike Fikes [ 27/Jul/17 2:54 PM ]

The attached patch re-adds the support in script/test-self-parity.

Comment by Mike Fikes [ 27/Jul/17 3:11 PM ]

For historical context, this patch re-adds the stuff that was in CLJS-2082, which we had later reverted owing to the fact that it added a dep on org.clojure/test.check 0.10.0-alpha1, which introduced a bug TCHECK-131 which would end up in the shipping cljs.jar. That bug has now been fixed, with the fixe released in org.clojure/test.check 0.10.0-alpha2. We are actually now on that version of test.check owing to CLJS-2273, so all this patch really does is add the infrastructural stuff to script/test-self-parity so that it can load test.check, along with the sample generative tests. This is sufficient to allow test.check to be loaded for CLJS-2275.

Comment by David Nolen [ 27/Jul/17 8:15 PM ]

fixed https://github.com/clojure/clojurescript/commit/190fa6489c9578ec7dba8235e5c905ae32ff7fda





[CLJS-2270] Support AOT compilation of macro namespaces (bootstrap) Created: 24/Jul/17  Updated: 18/Aug/17

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

Type: Enhancement Priority: Major
Reporter: David Nolen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: bootstrap

Approval: Vetted




[CLJS-2266] Self-host: Cannot require clojure.x where clojure.x has no macros namespace Created: 21/Jul/17  Updated: 07/Aug/17  Resolved: 07/Aug/17

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

Type: Defect Priority: Minor
Reporter: Viktor Magyari Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-2266.patch    
Patch: Code and Test
Approval: Accepted

 Description   

Repro:

(require 'cljs.js)

(cljs.js/eval-str (cljs.js/empty-state)
                  "(require 'clojure.x)"
                  nil
                  {:eval cljs.js/js-eval
                   :load (fn [{:keys [name macros]} cb]
                           (cb (when (and (= name 'cljs.x)
                                          (not macros))
                                 {:lang   :clj
                                  :source "(ns cljs.x)"})))}
                  println)

Expected result:

{:ns cljs.user, :value nil}

Actual result:

{:error #error {:message No such macros namespace: cljs.x, could not locate cljs/x.clj or cljs/x.cljc, :data {:tag :cljs/analysis-error}}}

Git bisect indicates CLJS-2069:

d4db18970c8eec587b2c9e022034983e29eb8e81 is the first bad commit
commit d4db18970c8eec587b2c9e022034983e29eb8e81
Author: António Nuno Monteiro <anmonteiro@gmail.com>
Date:   Sat Jun 3 15:10:40 2017 -0700

    CLJS-2069: Self-host: automatic `clojure` -> `cljs` aliasing doesn't work when loading macro namespaces

:040000 040000 31b0ec3b5346c8959e48487449576114b9d9a2ea 59d730263393923274257ea1eadaf4c2828c4199 M      src


 Comments   
Comment by Mike Fikes [ 21/Jul/17 1:20 PM ]

A concrete example of this is the inability to require cljs.tools.reader by indicating clojure.tools.reader.

Comment by António Nuno Monteiro [ 05/Aug/17 9:15 PM ]

Attached patch with fix.

Comment by David Nolen [ 07/Aug/17 7:14 AM ]

fixed https://github.com/clojure/clojurescript/commit/9b7847ff78b96cb7e82c76f8a1073f7590ebfe61





[CLJS-2252] Self-host: :redef-in-file doesn't trigger for bootstrapped Created: 16/Jul/17  Updated: 16/Jul/17

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

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


 Description   

If you redefine a symbol in a file and require that file using self-hosted ClojureScript, the :redef-in-file diagnostic doesn't trigger.

It is difficult to create a minimal repro for this, as it requires a setup that loads files. (Perhaps one can be made with the script/test-self-parity infrastructure).

It appears that this can be resolved by setting ana/file-defs at the right places and unsetting it at the right async completion points.






[CLJS-2243] Self-host: Add support for :global-exports Created: 15/Jul/17  Updated: 15/Jul/17  Resolved: 15/Jul/17

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

Type: Enhancement Priority: Blocker
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap, foreign-libs

Attachments: Text File CLJS-2243.patch    
Patch: Code and Test
Approval: Accepted

 Comments   
Comment by David Nolen [ 15/Jul/17 8:14 AM ]

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





[CLJS-2239] Self-host: Add `:target :nodejs` to the docstrings in cljs.js Created: 14/Jul/17  Updated: 16/Jul/17  Resolved: 16/Jul/17

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

Type: Enhancement Priority: Critical
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-2239.patch    
Patch: Code
Approval: Accepted

 Comments   
Comment by David Nolen [ 16/Jul/17 1:39 AM ]

fixed https://github.com/clojure/clojurescript/commit/8429372b13a06fd90c69eb296c6fd63980557326





[CLJS-2232] Self-host: Add support for string-based requires Created: 14/Jul/17  Updated: 14/Jul/17  Resolved: 14/Jul/17

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

Type: Enhancement Priority: Blocker
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Comments   
Comment by António Nuno Monteiro [ 14/Jul/17 12:43 AM ]

Patch attached.

Comment by David Nolen [ 14/Jul/17 5:57 AM ]

fixed https://github.com/clojure/clojurescript/commit/2d08f2e999fbf4b524d4c248ef39b46d9a1b6432





[CLJS-2223] Self-host: Undeclared Var deps/native-node-modules Created: 13/Jul/17  Updated: 13/Jul/17  Resolved: 13/Jul/17

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

Type: Defect Priority: Minor
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap, test

Attachments: Text File CLJS-2223.patch    
Patch: Code
Approval: Accepted

 Comments   
Comment by David Nolen [ 13/Jul/17 3:10 PM ]

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





[CLJS-2201] Self-host: test-js-filename failing Created: 09/Jul/17  Updated: 09/Jul/17  Resolved: 09/Jul/17

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

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

Attachments: Text File CLJS-2201.patch    
Patch: Code and Test
Approval: Accepted

 Description   

With the change made for CLJS-1966, script/test-self-parity started failing with:

FAIL in (test-js-filename) (at cljs/test.js?rel=1499608143677:427:14)
expected: (= "core-advanced-test.js" (ct/js-filename "nW@builds/out-adv/core-advanced-test.js:1191:77"))
  actual: (not (= "core-advanced-test.js" "nW@builds/out-adv/core-advanced-test.js"))


 Comments   
Comment by David Nolen [ 09/Jul/17 3:17 PM ]

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





[CLJS-2185] Self-host: Docstrings for bootstrap helpers Created: 06/Jul/17  Updated: 07/Jul/17  Resolved: 07/Jul/17

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

Type: Enhancement Priority: Minor
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

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

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

fixed https://github.com/clojure/clojurescript/commit/11700bb7c4fa4175875baa8f81c9304430b04f52





[CLJS-2164] Self-host: Require cljs.js results in warning about new unsafe-get macro Created: 04/Jul/17  Updated: 04/Jul/17  Resolved: 04/Jul/17

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

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

Attachments: Text File CLJS-2164.patch    
Patch: Code
Approval: Accepted

 Description   
$ script/noderepljs
ClojureScript Node.js REPL server listening on 56493
To quit, type: :cljs/quit
cljs.user=> (require 'cljs.js)
WARNING: unsafe-get already refers to: cljs.core/unsafe-get being replaced by: cljs.core$macros/unsafe-get at line 996 /Users/mfikes/Projects/clojurescript/src/main/clojure/cljs/core.cljc
true


 Comments   
Comment by David Nolen [ 04/Jul/17 9:35 AM ]

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





[CLJS-2141] Self-host: cljs.js is using undeclared symbol lib Created: 30/Jun/17  Updated: 01/Jul/17  Resolved: 01/Jul/17

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

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

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

 Description   

With CLJS-2069 an undeclared symbol lib is being used in cljs.js/load-macros in the call to patch-alias-map:

https://github.com/clojure/clojurescript/blob/e86c36bb5408a0778bde6b56a292819d6d2af4c6/src/main/cljs/cljs/js.cljs#L450

With the 1.9.671 release, this shows up as:

WARNING: Use of undeclared Var cljs.js/lib at line 450 out/cljs/js.cljs


 Comments   
Comment by David Nolen [ 01/Jul/17 11:02 AM ]

fixed https://github.com/clojure/clojurescript/commit/179758f6f0f6945903df4e08b29ab61527345a5c





[CLJS-2130] Self-host: Add `:fn-invoke-direct` to public API docstrings Created: 26/Jun/17  Updated: 26/Jun/17  Resolved: 26/Jun/17

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

Type: Enhancement Priority: Minor
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Comments   
Comment by David Nolen [ 26/Jun/17 8:48 PM ]

fixed https://github.com/clojure/clojurescript/commit/3ec81ca771393c96ea20ef30bcbe78153f2bcc63





[CLJS-2124] Self-host: Tests failing wth Could not find tag parser for :cljs.spec.alpha Created: 24/Jun/17  Updated: 24/Jun/17  Resolved: 24/Jun/17

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

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

Attachments: Text File CLJS-2124.patch    
Patch: Code
Approval: Accepted

 Description   
$ script/test-self-parity | tee test-out.txt
Testing with Node
WARNING: baz is a single segment namespace at line 1 src/test/cljs/baz.cljs
/home/travis/build/mfikes/clojurescript/builds/out-self-parity/cljs/reader.js:163
throw (new Error(cljs.core.apply.call(null,cljs.core.str,msg)));
^
Error: Could not find tag parser for :cljs.spec.alpha in ("inst" "uuid" "queue" "js" "cljs/tag" "cljs/inc" "cljs/union")
    at Function.cljs.reader.reader_error.cljs$core$IFn$_invoke$arity$variadic (/home/travis/build/mfikes/clojurescript/builds/out-self-parity/cljs/reader.js:163:8)
    at cljs$reader$reader_error (/home/travis/build/mfikes/clojurescript/builds/out-self-parity/cljs/reader.js:159:33)
    at cljs$reader$maybe_read_tagged_type (/home/travis/build/mfikes/clojurescript/builds/out-self-parity/cljs/reader.js:1239:33)
    at cljs$reader$read_dispatch (/home/travis/build/mfikes/clojurescript/builds/out-self-parity/cljs/reader.js:432:61)
    at cljs$reader$read_delimited_list (/home/travis/build/mfikes/clojurescript/builds/out-self-parity/cljs/reader.js:397:20)
    at cljs$reader$read_list (/home/travis/build/mfikes/clojurescript/builds/out-self-parity/cljs/reader.js:445:43)
    at cljs$reader$read_delimited_list (/home/travis/build/mfikes/clojurescript/builds/out-self-parity/cljs/reader.js:397:20)
    at cljs$reader$read_list (/home/travis/build/mfikes/clojurescript/builds/out-self-parity/cljs/reader.js:445:43)
    at cljs$reader$read_delimited_list (/home/travis/build/mfikes/clojurescript/builds/out-self-parity/cljs/reader.js:397:20)
    at cljs$reader$read_list (/home/travis/build/mfikes/clojurescript/builds/out-self-parity/cljs/reader.js:445:43)


 Comments   
Comment by Mike Fikes [ 24/Jun/17 7:44 AM ]

Cause is that /Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/spec/alpha.cljs.cache.edn contains a map using the new namespace map syntax:

#:cljs.spec.alpha{:k k, :v v}
Comment by Mike Fikes [ 24/Jun/17 8:27 AM ]

The attached patch switches the self-host test setup to using tools.reader which can read the new namespace maps syntax.

Presumably there is no deeper issue here: Even though bin/cljsc is used with a Clojure 1.9 alpha, and it is surprising that *print-namespace-maps\8 defaults to true (even though we are not in a Clojure REPL), it is possible for someone to invoke the ClojureScript compiler from a REPL, where this would be defaulted to true. I suppose all this really means is that with the new feature to save spec metadata in the analysis cache, if a user causes analysis cache to be written using a newer Clojure compiler, they should use the same when reading those cache files. (And, of course, this is unlikely to be a problem given the system leans towards using Transit instead of EDN.)

Comment by David Nolen [ 24/Jun/17 10:37 AM ]

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





[CLJS-2122] Self-host: Non-symbol ns names dumped into env Created: 24/Jun/17  Updated: 24/Jun/17  Resolved: 24/Jun/17

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

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

Attachments: Text File CLJS-2122.patch    
Patch: Code and Test
Approval: Accepted

 Description   

With CLJS-2117, a regression was introduced where a user of cljs.js that passes in a non-symbol name will have it added as a namespace in the environment.

Including a test which checks to ensure that this doesn't occur if the user opts out of passing the name (which would result in a nil as well as covering the string case.



 Comments   
Comment by David Nolen [ 24/Jun/17 10:29 AM ]

fixed https://github.com/clojure/clojurescript/commit/055f39bed26bc85af962e85f3bfb6e3a33016714





[CLJS-2121] Self-host: Document string as valid name arg Created: 24/Jun/17  Updated: 24/Jun/17  Resolved: 24/Jun/17

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

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

Attachments: Text File CLJS-2121.patch    
Patch: Code
Approval: Accepted

 Description   

The cljs.js/analyze-str, cljs.js/compile-str, and cljs.js/eval-str functions all validate the name argument using valid-name? which accepts nil a symbol or a string.

Update the docstrings to match.



 Comments   
Comment by David Nolen [ 24/Jun/17 10:42 AM ]

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





[CLJS-2117] Self-host: Port CLJS-1989 to self-hosted Created: 23/Jun/17  Updated: 23/Jun/17  Resolved: 23/Jun/17

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

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

Attachments: Text File CLJS-2117.patch     Text File CLJS-2117-v2.patch     Text File CLJS-2117-v3.patch    
Patch: Code
Approval: Accepted

 Description   

Same as CLJS-1989 but similar changes for cljs.js.



 Comments   
Comment by Mike Fikes [ 23/Jun/17 7:02 PM ]

Attaching -v3 patch which passes various tests. (The original Nashorn test, testing the same scenario downstream with Planck, the unit tests, etc.)

Comment by David Nolen [ 23/Jun/17 7:13 PM ]

fixed https://github.com/clojure/clojurescript/commit/38c12da934284780779889125faa6667fc4fe13a





[CLJS-2116] Self-host: Need to handle un-namespaced symbol when evaluating `foo.core Created: 23/Jun/17  Updated: 23/Jun/17  Resolved: 23/Jun/17

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

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

Attachments: Text File CLJS-2116.patch    
Patch: Code
Approval: Accepted

 Description   

With the fix in CLJS-2109:

$ script/noderepljs
ClojureScript Node.js REPL server listening on 57662
To quit, type: :cljs/quit
cljs.user=> (require 'cljs.js)
true
cljs.user=> (cljs.js/eval-str (cljs.js/empty-state)
"`foo.core" nil {:eval cljs.js/js-eval :context :expr} identity)
{:error #error {:message "Could not eval ", :data {:tag :cljs/analysis-error}, :cause #error {:message "Cannot read property 'length' of null", :data {:type :reader-exception, :line 1, :column 10, :file nil}, :cause #object[TypeError TypeError: Cannot read property 'length' of null]}}}


 Comments   
Comment by Mike Fikes [ 23/Jun/17 11:42 AM ]

No need to add a unit test for this patch—tests added with CLJS-2109 are sufficient and failing via script/test-self-parity.

Comment by David Nolen [ 23/Jun/17 12:11 PM ]

fixed https://github.com/clojure/clojurescript/commit/18f580cf76015cbec0cfe213c49feff85a222706





[CLJS-2088] In bootstrap, find-ns messes up subsequent macros resolution Created: 15/Jun/17  Updated: 15/Jun/17  Resolved: 15/Jun/17

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

Type: Defect Priority: Major
Reporter: Christophe Grand Assignee: Unassigned
Resolution: Completed Votes: 0
Labels: bootstrap

Attachments: Text File cljs-2088-1.patch    
Patch: Code

 Description   

In lumo (or planck), try:

(find-ns 'lump.repl) ; resp. planck.repl
(doc inc)

it results in:

WARNING: Use of undeclared Var cljs.user/doc at line 1
TypeError: Cannot read property 'call' of undefined

Same thing goes for cljs.core but in a more subtle manner

cljs.user=> (find-ns 'cljs.core)
#object[cljs.core.Namespace]
cljs.user=> (cond :else 1)
WARNING: Use of undeclared Var cljs.core/cond at line 1
1


 Comments   
Comment by Christophe Grand [ 15/Jun/17 5:02 AM ]

The attached patch change find-macros-ns: the key is ensured to contain $macros before the cache lookup

Comment by David Nolen [ 15/Jun/17 8:20 AM ]

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





[CLJS-2081] Self-host: Regression with CLJS-2079 Created: 12/Jun/17  Updated: 12/Jun/17  Resolved: 12/Jun/17

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

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

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

 Description   

With the commit for CLJS-2079, self-host tests fail:

$ script/test-self-parity
Testing with Node
Could not eval cljs.pprint in file src/main/cljs/cljs/pprint.cljs
	 (new)
	 Function.cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3 (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core.cljs:35715:9)
	 cljs$core$ex_info (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core.cljs:35701:26)
	 Function.cljs.analyzer.error.cljs$core$IFn$_invoke$arity$3 (.cljs:1073:26)
	 cljs$analyzer$error (.cljs:1059:28)
	 (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/js.cljs:1893:57)
	 cljs$js$eval_str_STAR__$_compile_loop (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/js.cljs:1894:4)
	 (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/js.cljs:1925:46)
	 (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/js.cljs:1008:11)
	 cljs$js$load_macros (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/js.cljs:815:11)

caused by:
Parameter declaration missing at line 230 src/main/cljs/cljs/pprint.cljs
	 (new)
	 Function.cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3 (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core.cljs:35715:9)
	 cljs$core$ex_info (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core.cljs:35701:26)
	 Function.cljs.analyzer.error.cljs$core$IFn$_invoke$arity$3 (.cljs:1073:26)
	 cljs$analyzer$error (.cljs:1059:28)
	 cljs$analyzer$macroexpand_1 (.cljs:5337:27)
	 Function.cljs.analyzer.analyze_seq.cljs$core$IFn$_invoke$arity$4 (.cljs:5411:41)
	 cljs$analyzer$analyze_seq (.cljs:5383:34)
	 cljs$analyzer$analyze_form (.cljs:5554:34)
	 cljs$analyzer$analyze_STAR_ (.cljs:5595:38)

caused by:
Parameter declaration missing
	 (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core$macros.cljs:638:105)
	 Function.cljs.core$macros.fn.cljs$core$IFn$_invoke$arity$variadic (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core$macros.cljs:638:473)
	 cljs$core$macros$fn (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core$macros.cljs:630:28)
	 (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core$macros.cljs:6185:50)
	 cljs$core$macros$emit_defrecord (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core$macros.cljs:6209:3)
	 (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core$macros.cljs:6498:73)
	 Function.cljs.core$macros.defrecord.cljs$core$IFn$_invoke$arity$variadic (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core$macros.cljs:6500:3)
	 cljs$core$macros$defrecord (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core$macros.cljs:6488:35)
	 (Object.cljs$core$apply_to)
	 Function.cljs.core.apply.cljs$core$IFn$_invoke$arity$4 (/Users/mfikes/Projects/clojurescript/builds/out-self-parity/cljs/core.cljs:13084:18)


 Comments   
Comment by António Nuno Monteiro [ 12/Jun/17 11:29 AM ]

Attached patch with fix.

Comment by Mike Fikes [ 12/Jun/17 11:45 AM ]

Confirmed that this patch, along with https://github.com/clojure/clojurescript/commit/f701e7946a6c1ad41edfc0b0bbb5b8a6103ae911 clear the issue and also clear an issue downstream in Planck (different symptom but likely same root cause).

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

fixed https://github.com/clojure/clojurescript/commit/48db4fa69c52af66153d7c1e62429d72ced8cf8a





[CLJS-2069] Self-host: auto `clojure`->`cljs` aliasing doesn't work when loading macros Created: 03/Jun/17  Updated: 21/Jul/17  Resolved: 04/Jun/17

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

Type: Defect Priority: Minor
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Comments   
Comment by António Nuno Monteiro [ 03/Jun/17 5:16 PM ]

Attached patch with fix & test.

Comment by Mike Fikes [ 03/Jun/17 5:47 PM ]

I can confirm downstream Planck passes all of its tests with the patch and this works:

cljs.user=> (require-macros 'clojure.spec.alpha)
nil

while without the patch the issue is exhibited:

cljs.user=> (require-macros 'clojure.spec.alpha)
No such macros namespace: clojure.spec.alpha, could not locate clojure/spec/alpha.clj or clojure/spec/alpha.cljc
Comment by David Nolen [ 04/Jun/17 6:59 AM ]

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

Comment by Mike Fikes [ 21/Jul/17 1:14 PM ]

See regression CLJS-2266





[CLJS-2056] Self-host: test-self-parity failing wrt cljs.core/fn symbol Created: 28/May/17  Updated: 02/Jun/17  Resolved: 02/Jun/17

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

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

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

 Description   

With the latest backport of Spec features, script/test-self-parity is failing due to fn not being expanded to cljs.core/fn in the returned :pred from explain-data.

An example:

explain failures
	expect= [{:pred (cljs.core/fn [%] (cljs.spec.alpha/int-in-range? 7 42 %)), :val 42}]
	actual failures= [{:path [], :pred (fn [%] (cljs.spec.alpha/int-in-range? 7 42 %)), :via [], :val 42, :in []}]
	submap?= (false)


 Comments   
Comment by Mike Fikes [ 28/May/17 4:24 PM ]

The attached patch addresses the issue. Unfortunately, I can't provide a satisfactory explanation for why things are broken and why this fixes it, apart from speculation that fn isn't properly expanding to in the script/test-self-parity tests.

Comment by David Nolen [ 02/Jun/17 12:43 PM ]

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





[CLJS-2035] Self-host: Add map-entry-test to self-parity Created: 12/May/17  Updated: 15/May/17  Resolved: 15/May/17

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

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

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

 Description   

Add the new tests added with CLJS-2013 to self-parity.test.



 Comments   
Comment by David Nolen [ 15/May/17 8:06 AM ]

fixed https://github.com/clojure/clojurescript/commit/5cc7865a1e2e9aecc24f975454721f621ba8ee60





[CLJS-2025] Self-host: spec tests fail Created: 07/May/17  Updated: 08/May/17  Resolved: 08/May/17

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

Type: Defect Priority: Minor
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Description   

Self-host doesn't seem to be able to resolve `s/tuple` to `cljs.spec.alpha/tuple`

Looks related to automatic macro inference in self-host



 Comments   
Comment by Mike Fikes [ 08/May/17 7:53 AM ]

Confirmed that this patch doesn't break downstream Planck.

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

fixed https://github.com/clojure/clojurescript/commit/947ccb4c45ab6ec283da6e29de94e83a56892454





[CLJS-2015] Self-host: `defmacro` should return the Var Created: 24/Apr/17  Updated: 28/Apr/17  Resolved: 28/Apr/17

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

Type: Defect Priority: Minor
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Comments   
Comment by David Nolen [ 28/Apr/17 3:30 PM ]

fixed https://github.com/clojure/clojurescript/commit/3c0c775b8c731806765d425781d0bfd16c0d7f51





[CLJS-2008] Self-host: backport fixes to threading macros Created: 13/Apr/17  Updated: 15/May/17  Resolved: 15/May/17

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

Type: Defect Priority: Minor
Reporter: Christophe Grand Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Description   

Backport the fix for CLJ-1562 and CLJ-1418 (commit https://github.com/clojure/clojure/commit/5e655b5b12bde5d2b1434b82b1ed445815ea9a95)



 Comments   
Comment by David Nolen [ 15/May/17 8:01 AM ]

fixed https://github.com/clojure/clojurescript/commit/1ed7091056324d5bed26bbf1e317e1cbaeaee008





[CLJS-1981] ./script/bootstrap fails on FreeBSD 11.0 Created: 15/Mar/17  Updated: 16/Jun/17  Resolved: 16/Jun/17

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

Type: Defect Priority: Minor
Reporter: Duncan Bayne Assignee: Unassigned
Resolution: Declined Votes: 0
Labels: bootstrap, bug
Environment:

$ git rev-list HEAD | head -n 1
f7d08ba3f837f3e2d20ebdaf487221b18bb640c7

$ uname -a
FreeBSD x220 11.0-RELEASE-p1 FreeBSD 11.0-RELEASE-p1 #0 r306420: Thu Sep 29 01:43:23 UTC 2016 root@releng2.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC amd64

$ java -version
openjdk version "1.8.0_112"
OpenJDK Runtime Environment (build 1.8.0_112-b16)
OpenJDK 64-Bit Server VM (build 25.112-b16, mixed mode)



 Description   

When I run ./script/bootstrap, it fails when trying to invoke unzip. I think it's expecting GNU/Linux unzip, or something similar:

$ ./script/bootstrap
Usage: unzip [-aCcfjLlnopqtuvyZ1] [-d dir] [-x pattern] zipfile
The 'unzip' utility is missing, or not on your system path.



 Comments   
Comment by David Nolen [ 17/Mar/17 1:51 PM ]

I'm assuming you can install unzip no? If not then please provide a patch that generalize the bootstrap script. Thanks.

Comment by Duncan Bayne [ 06/Apr/17 2:08 AM ]

Yes, unzip is already installed. I'll attempt to generalize it.

If that fails - that is, if there is no suitable set of common arguments to GNU unzip and BSD unzip - I'll detect the unzip type and send the correct commands.

Comment by David Nolen [ 07/Apr/17 11:08 AM ]

This just doesn't seem like a problem. Just install unzip, just like you need to install Java etc.

Comment by David Nolen [ 16/Jun/17 10:03 AM ]

This just doesn't seem like a real issue to me.





[CLJS-1943] Self-host: `cljs.pprint`'s macros can't be compiled Created: 15/Feb/17  Updated: 16/Jun/17  Resolved: 20/Feb/17

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

Type: Defect Priority: Major
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-1943-2.patch     Text File CLJS-1943-3.patch     Text File CLJS-1943.patch    
Patch: Code and Test

 Comments   
Comment by António Nuno Monteiro [ 15/Feb/17 6:46 PM ]

Attached patch with fix and enabled running the cljs.pprint tests when running the self-parity tests.

Comment by David Nolen [ 20/Feb/17 1:50 PM ]

fixed https://github.com/clojure/clojurescript/commit/6c5fb679bf843bfbd065d0576e1a3d350f11d4b0





[CLJS-1942] Self-host: `cljs.env.macros` and `cljs.analyzer.macros` can't be loaded Created: 14/Feb/17  Updated: 15/Feb/17  Resolved: 15/Feb/17

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

Type: Defect Priority: Major
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Comments   
Comment by António Nuno Monteiro [ 14/Feb/17 3:50 PM ]

Attached patch with fix.

Comment by David Nolen [ 15/Feb/17 5:41 PM ]

fixed https://github.com/clojure/clojurescript/commit/47cd1cef8f7ed5b16cffc7e2ae4d223328091ab7





[CLJS-1934] Self-host: require-macros :reload / :reload-all fails Created: 09/Feb/17  Updated: 10/Feb/17  Resolved: 10/Feb/17

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

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

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

 Description   

In a self-hosted environment set up to work with cljs.js/*load-fn*, evaluating an expression like

(require-macros 'foo.core :reload)

fails to request a reload of the code.



 Comments   
Comment by Mike Fikes [ 09/Feb/17 5:55 PM ]

This was caused by a simple typo. With the typo and the example in the description, reloads would be passed in as an empty map instead of reload which would contain the key :reload-macros and the value :reload. Deleting the extra s makes it consistent with the other nearby calls and does the trick.

Comment by David Nolen [ 10/Feb/17 9:45 AM ]

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





[CLJS-1932] Self-host: Perf regression macroexpand-check Created: 08/Feb/17  Updated: 09/Feb/17  Resolved: 09/Feb/17

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

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

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

 Description   

With https://github.com/clojure/clojurescript/commit/cebfb586355b526253fdd25965de976b49a6973e you can observe a compilation perf regression. This is particularly noticeable if you load cljs.core.async (from Andare) into a self-hosted environment (both Lumo and Planck exhibit 2-3x slowdowns).



 Comments   
Comment by Mike Fikes [ 08/Feb/17 11:30 PM ]

With the attached patch, downstream perf in loading cljs.core.async in Planck is confirmed to return to the previous good perf.

Also, confirmed downstream that the change doesn't break the ability to have specs on macros:

With this macros namespace:

(ns foo.core
  (:require [clojure.spec :as s]))

(defmacro add [a b]
  `(+ ~a ~b))

(s/fdef add
  :args (s/cat :a int? :b int?))

The spec works properly downstream in Planck:

cljs.user=> (require-macros 'foo.core)
nil
cljs.user=> (foo.core/add "a" 3)
            ^
Call to foo.core$macros/add did not conform to spec:
In: [0] val: "a" fails at: [:args :a] predicate: int?
:cljs.spec/args  ("a" 3)
 at line 1
cljs.user=> (foo.core/add 2 3)
5
Comment by David Nolen [ 09/Feb/17 5:35 AM ]

fixed https://github.com/clojure/clojurescript/commits/master





[CLJS-1928] Self-host: Macro namespace alias in keyword Created: 02/Feb/17  Updated: 24/Feb/17  Resolved: 24/Feb/17

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

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

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

 Description   

If, in self-hosted ClojureScript you require a macro namespace and establish an alias, as in

(require-macros '[cljs.spec :as s])

You won't be able to use to use the alias in a keyword, as in

::s/foo

The root cause is that when r/*alias-map* is bound to (current-alias-map) this fails to set up mappings for macro namespaces.



 Comments   
Comment by Mike Fikes [ 02/Feb/17 9:27 PM ]

The attached patch revises (current-alias-map) to additionally consult macros namespaces when setting up the alias map. This is tested by adding the (previously-disabled) keyword unit tests, adding a specific test for a macros namespace alias.

(FWIW, a similar technique is also used in Lumo and Planck and, as a consequence, they can properly read forms involving macros namespace aliases, but the resulting forms cannot be compiled in those environments owing to the change needed in cljs.js).

Comment by David Nolen [ 24/Feb/17 1:23 PM ]

fixed https://github.com/clojure/clojurescript/commit/46dcd22713a924bfd90f0a19449bb09f128d11df





[CLJS-1910] Self-host: Need to eliminate use of cljs.nodejs/require Created: 26/Jan/17  Updated: 27/Jan/17  Resolved: 27/Jan/17

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

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

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

 Description   

Need to change this:

https://github.com/clojure/clojurescript/blob/master/src/test/self/self_parity/test.cljs#L56



 Comments   
Comment by António Nuno Monteiro [ 27/Jan/17 12:50 AM ]

The change from `require` to `nodeGlobalRequire` in this commit
https://github.com/clojure/clojurescript/commit/59a7f265fac02c931cc3d5615727da861db62e3b#diff-db201d3634488851510ee2fbce327924R75
means that loading every file will go through `vm.runInThisContext`.

The above causes `require` to not be bound, since `require` is a "free variable" and not a property of the global object (more context here https://github.com/nodejs/node-v0.x-archive/issues/9211#issuecomment-134412415).

A suggested fix is to add `global.require = require;` to `cljs/bootstrap_node.js`. I tested that fix and it worked.

Note that this is not only breaking the self-host tests. It will break every ClojureScript build which targets Node.js under `:none` optimizations, which should therefore be considered critical.

Comment by Mike Fikes [ 27/Jan/17 1:18 AM ]

The attached patch addresses (and only addresses) the primary issue in this ticket: The need to use js/require.

Given the critical and subtle nature of the side issue discovered and detailed in António's comment above, that issue is split off to CLJS-1911 in case some other more appropriate solution is found for it.

Comment by David Nolen [ 27/Jan/17 9:20 AM ]

fixed by removing the breaking change https://github.com/clojure/clojurescript/commit/18d1e5792f6c712b6c8e426ac9123ee4b898a374, CLJS-1911 was the root cause





[CLJS-1906] Self-host: script/test-self-parity fails Created: 25/Jan/17  Updated: 26/Jan/17  Resolved: 26/Jan/17

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

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

Attachments: Text File CLJS-1906.patch    

 Description   

With master as of the writing of this ticket

script/test-self-parity fails with:

#error {:message "Could not parse ns form cljs.clojure-alias-test", :data {:tag :cljs/analysis-error}, :cause #object[Error Error: No protocol method IDeref.-deref defined for type null: ]}


 Comments   
Comment by David Nolen [ 26/Jan/17 10:10 PM ]

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





[CLJS-1905] Self-host: Stacktraces for script/test-self-parity Created: 25/Jan/17  Updated: 06/Feb/17  Resolved: 06/Feb/17

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

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

Attachments: Text File CLJS-1905-2.patch     Text File CLJS-1905.patch    
Patch: Code

 Description   

If script/test-self-parity fails, you currently only get a prn of the error, which makes it difficult to locate the cause of the error. Add some infrastructure to print stacktraces.



 Comments   
Comment by Mike Fikes [ 05/Feb/17 12:29 PM ]

Previous patch no longer applies; attaching re-baselined patch.

Comment by David Nolen [ 06/Feb/17 3:22 PM ]

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





[CLJS-1874] Self-host: :fn-var true for macros Created: 16/Dec/16  Updated: 21/Jan/17  Resolved: 21/Jan/17

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

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

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

 Description   

In self-host ClojureScript, :fn-var is unconditionally set to true for macros.

One issue this creates is for cljs.test/function?, here

https://github.com/clojure/clojurescript/blob/d1b8b31f7247688098d9e61bb33302a6edc57c2c/src/main/cljs/cljs/test.cljc#L23

in that it causes macros in is expressions, like (is (or true)) to be mis-handled
as if they were functions.

Here is a minimal repro illustrating :fn-var being set:

$ java -jar cljs.jar -m cljs.repl.node
ClojureScript Node.js REPL server listening on 52055
To quit, type: :cljs/quit
cljs.user=> (require 'cljs.js)
true
cljs.user=> (let [st (cljs.js/empty-state)]
  (cljs.js/eval-str st
    "(ns cljs.user (:require-macros foo.core))"
    nil
    {:eval    cljs.js/js-eval
     :load    (fn [_ cb]
                (cb {:lang   :clj
                     :source "(ns foo.core) (defmacro add [a b] `(+ ~a ~b))"}))
     :context :expr}
    (fn [_]
      (-> @st
        (get-in [:cljs.analyzer/namespaces 'foo.core$macros :defs 'add])
        (select-keys [:macro :fn-var])))))
{:macro true, :fn-var true}
cljs.user=>

Note in the repro above both :macro and :fn-var are set to true.



 Comments   
Comment by David Nolen [ 21/Jan/17 6:55 AM ]

fixed https://github.com/clojure/clojurescript/commit/51ca92b7260bfa22f309766e6ae914d044e5cc5e





[CLJS-1873] Self-host: Unit tests fail owing to test.check dep Created: 16/Dec/16  Updated: 21/Jan/17  Resolved: 21/Jan/17

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

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

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

 Description   

Currently the self-host unit tests fail to run with:

$ script/test-self-parity
Testing with Node
WARNING: baz is a single segment namespace at line 1 src/test/cljs/baz.cljs
#error {:message "No such namespace: cljs.test.check, could not locate cljs/test/check.cljs, cljs/test/check.cljc, or Closure namespace \"cljs.test.check\"", :data {:tag :cljs/analysis-error}}

Reason:

With https://github.com/clojure/clojurescript/commit/d1b8b31f7247688098d9e61bb33302a6edc57c2c
the cljs.spec-test namespace was revised to require the cljs.spec.test namespace, which, in turn requires the clojure.test.check namespace. (The auto-aliasing to cljs.test.check is tried an this fails, and this is the diagnostic you ultimately see.)

The port of test.check to self-hosted ClojureScript (TCHECK-105) hasn't yet been released, and, so far, the self-host tests have been avoiding the need for test.check.



 Comments   
Comment by Mike Fikes [ 16/Dec/16 7:07 PM ]

Attached patch fixes the self-test unit tests by moving the test.check-dependent portion into a test namespace for cljs.spec.test (namely cljs.spec.test-test) which is skipped in self-host tests. (When TCHECK-105 is released we can re-visit and revise the self-host test runner to load the needed source from the test check JAR that is placed in lib by script/bootstrap.

Comment by David Nolen [ 21/Jan/17 6:57 AM ]

fixed https://github.com/clojure/clojurescript/commit/1f9fad5ee4450e579f1659f62dcdbcafc20298f4





[CLJS-1856] Self-host: load-deps doesn't delegate to itself Created: 17/Nov/16  Updated: 18/Nov/16  Resolved: 18/Nov/16

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

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

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

 Description   

The first arity of cljs.js/load-deps should be calling the second arity of itself, but it is currently inadvertently making a call to cljs.js/analyze-deps.

Note: This arity is not being used. The arguments being passed along were properly updated with CLJS-1826, but it is now actually inadvertently calling analyze-deps with an arity error. (The real fix is to make it call load-deps).



 Comments   
Comment by Alex Miller [ 18/Nov/16 7:54 PM ]

dnolen comment lost in system migration:

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





[CLJS-1854] Self-host: Reload ns with const Created: 16/Nov/16  Updated: 28/Jul/17  Resolved: 28/Jul/17

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

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

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

 Description   

Bootstrapped ClojureScript fails to allow you to reload a namespace containing a constant.

To reproduce, evaluate the following forms in a REPL:

(require 'cljs.js)

(def st (cljs.js/empty-state))

(cljs.js/eval st
  '(require (quote foo.core))
  {:context :expr
   :eval cljs.js/js-eval
   :load (fn [_ cb]
           (cb {:lang :clj
                :source "(ns foo.core) (def ^:const x 1)"}))}
  prn)

(cljs.js/eval st
  '(require (quote foo.core) :reload)
  {:context :expr
   :eval cljs.js/js-eval
   :load (fn [_ cb]
           (cb {:lang :clj
                :source "(ns foo.core) (def ^:const x 2)"}))}
  prn)

The expectation is that the :reload directive in the last require will allow the namespace to be loaded with the const def being re-defined.

Instead, you get the following in the eval callback:

{:error #error {:message "Could not eval foo.core", :data {:tag :cljs/analysis-error}, :cause #error {:message "Can't redefine a constant at line 1 ", :data {:file nil, :line 1, :column 15, :tag :cljs/analysis-error}}}}

Note: This has probably been a defect in bootstrapped ClojureScript for quite a while (maybe forever). In particular, it is not a regression introduced with the new require capability (CLJS-1346).

FWIW, Planck has been working around this (and violating public API), manipulating cljs.js/*loaded* via its require REPL special, essentially purging portions of the analysis cache when reloading: https://github.com/mfikes/planck/blob/1.17/planck-cljs/src/planck/repl.cljs#L329-L348



 Comments   
Comment by David Nolen [ 08/Jul/17 10:50 AM ]

I'm now inclined to say that throwing an error on this is misfeature. We should just warn.

Comment by Mike Fikes [ 27/Jul/17 9:07 AM ]

The reason this use case works in JVM ClojureScript is that any existing analysis metadata for a namespace is flushed before analysis occurs. The flushing occurs here https://github.com/clojure/clojurescript/blob/r1.9.671/src/main/clojure/cljs/compiler.cljc#L1458

Comment by David Nolen [ 28/Jul/17 8:41 AM ]

fixed https://github.com/clojure/clojurescript/commit/09d596934682a682502cc9469d4cddfbc7412f0d





[CLJS-1831] Self-host: Improperly munge ns names Created: 22/Oct/16  Updated: 03/Feb/17  Resolved: 03/Feb/17

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

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

Attachments: Text File CLJS-1831-2.patch     Text File CLJS-1831-3.patch     Text File CLJS-1831.patch    

 Description   

If you have a namespace containing a reserved JavaScript keyword, in self-hosted ClojureScript the namespace isn't properly munged for the goog.provide call. A result is that symbols defined in the namespace will be attached to a nonexistent JavaScript object.

To reproduce, add a test namespace, say static.core that does nothing but have an assert that (= 1 1).



 Comments   
Comment by Mike Fikes [ 22/Oct/16 1:04 PM ]

Without the prod code fixes in cljs.js, a new unit test fails, producing the desired warning but then tripping up on attempting to attach to an undefined JavaScript static$ object, with the root cause being a goog.provide('static.core-test') call instead of the needed goog.provide('static$.core-test') as is done in regular ClojureScript:

WARNING: Namespace static.core-test contains a reserved JavaScript keyword, the corresponding Google Closure namespace will be munged to static$.core_test at line 1 src/test/cljs/static/core_test.cljs
#error {:message "ERROR in file src/test/cljs/static/core_test.cljs", :data {:tag :cljs/analysis-error}, :cause #object[ReferenceError ReferenceError: static$ is not defined]}

The production fix is to simply call cljs.compiler/munge instead of cljs.core/munge.

Comment by Mike Fikes [ 16/Dec/16 2:50 PM ]

Previous patch no longer applies. Attaching CLJS-1831-2.patch

Comment by Mike Fikes [ 02/Feb/17 10:04 PM ]

The previous patch no longer applies; attaching re-baselined patch.

Comment by David Nolen [ 03/Feb/17 1:34 PM ]

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





[CLJS-1826] Self-host: load-deps doesn't honor `:reload` and `reload-all` Created: 18/Oct/16  Updated: 18/Oct/16  Resolved: 18/Oct/16

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

Type: Defect Priority: Major
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Comments   
Comment by António Nuno Monteiro [ 18/Oct/16 1:38 PM ]

Patch attached.

Comment by David Nolen [ 18/Oct/16 2:01 PM ]

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





[CLJS-1804] Self-host: process namespace side-effects for new require without NS Created: 01/Oct/16  Updated: 01/Oct/16  Resolved: 01/Oct/16

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

Type: Defect Priority: Major
Reporter: António Nuno Monteiro Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Comments   
Comment by António Nuno Monteiro [ 01/Oct/16 10:36 AM ]

Attached fix.

Comment by David Nolen [ 01/Oct/16 1:03 PM ]

fixed https://github.com/clojure/clojurescript/commit/2f2b7f253cd2bc5156bf74caeb1145823570470b





[CLJS-1774] Self-host: Report filenames in warns in test-self-parity Created: 07/Sep/16  Updated: 16/Jun/17  Resolved: 14/Sep/16

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

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

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

 Description   

When running script/test-self-parity, make use of the new feature introduced with CLJS-1515 to add the capability of reporting filenames when diagnostics are emitted.

For example, you currently see

WARNING: baz is a single segment namespace at line 1

when running script/test-self-parity while script/test gives more info for the same diagnostic:

WARNING: baz is a single segment namespace at line 1 src/test/cljs/baz.cljs


 Comments   
Comment by David Nolen [ 14/Sep/16 3:37 PM ]

fixed https://github.com/clojure/clojurescript/commit/5f4ee993bcc39c055bdc05bc16d70f8fc8b02263





[CLJS-1773] Self-host: Don't resolve unqualified symbols / keywords with $macros Created: 05/Sep/16  Updated: 16/Sep/16  Resolved: 16/Sep/16

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

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

Attachments: Text File CLJS-1773.patch    

 Description   

Background: Since, in self-hosted ClojureScript, macro namespaces are compiled as ClojureScript, a $macros suffix is appended to macros namespace names in order to differentiate them from same-named runtime namespaces. As a concrete example: The foo.core runtime namespace will be processed normally, but the same, when compiled as a macro namespace is internally renamed to be foo.core$macros.

A consequence is that the internal $macros suffix surfaces in a few places where it is undesired. Specifically this ticket focuses on the cases of unqualified symbols subject to syntax-quote resolution and namespaced keywords that use the :: construct (as in ::bar). When these are used in macro namespaces, and then compiled with bootstrapped ClojureScript, a symbol like `baz would turn in to foo.core$macros/baz, and a keyword like ::bar would turn in to :foo.core$macros/bar.

In the case of symbols, it might be the case that the user wanted the symbol to refer to a var in the runtime namespace, in which case foo.core/baz is desired. And, even if the desire was that it end up referring to a macro named baz, then foo.core/baz works just fine. To achieve this, when porting regular ClojureScript code to be compatible with bootstrapped ClojureScript, one common pattern is the need to qualify symbols inside of syntax-quote scope so that they don't end up with the $macros suffix.

The same, parallel arguments essentially go for keywords: You want ::bar to turn into :foo.core/bar in both JVM and bootstrapped ClojureScript, and today, to achieve that, you must qualify those kinds of keywords when they appear in macros namespaces.

This ticket asks that when unqualified symbols in syntax quote are resolved and when the analogous thing occurs for keywords, that the $macros suffix be avoided as experience has shown now that it is practically always not the thing that you want (and perhaps also not correct from the desired language semantics.)



 Comments   
Comment by David Nolen [ 16/Sep/16 2:20 PM ]

fixed https://github.com/clojure/clojurescript/commit/7e90ad51452ec5edd8ee7f2b7af9c7e7fb759c97





[CLJS-1760] Self-host: test-cljs-1757 failing in test-self-parity Created: 19/Aug/16  Updated: 19/Aug/16  Resolved: 19/Aug/16

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

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

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

 Description   
$ script/test-self-parity
Testing with Node
WARNING: baz is a single segment namespace at line 1
WARNING: Use of undeclared Var cljs.spec$macros/gen at line 77

Testing cljs.core-test

Testing cljs.reader-test

Testing clojure.string-test

Testing clojure.data-test

Testing cljs.letfn-test

Testing cljs.reducers-test

Testing cljs.binding-test

Testing cljs.macro-test

Testing cljs.top-level

Testing cljs.ns-test.foo

Testing foo.ns-shadow-test

Testing cljs.import-test

Testing cljs.spec-test

ERROR in (test-cljs-1757) (TypeError:NaN:NaN)
expected: (s/exercise-fn (quote cljs.spec-test/cljs-1757-x))
  actual: #object[TypeError TypeError: Cannot read property 'call' of undefined]

Testing cljs.clojure-alias-test

Ran 215 tests containing 17428 assertions.
0 failures, 1 errors.


 Comments   
Comment by António Nuno Monteiro [ 19/Aug/16 10:25 AM ]

Attached path with fix.

Comment by Mike Fikes [ 19/Aug/16 10:39 AM ]

LGTM. It is the “correct” fix; I missed when putting together CLJS-1720. All tests pass for me with António's patch.

Comment by David Nolen [ 19/Aug/16 10:42 AM ]

fixed https://github.com/clojure/clojurescript/commit/86a83d720beb44deb5d55d7d9c0bc2d5174816a3





[CLJS-1740] Self-host: Need to port more of CLJS-1733 Created: 12/Aug/16  Updated: 16/Jun/17  Resolved: 13/Aug/16

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

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

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

 Description   

With CLJS-1733 some changes were made that needed to be carried over to self-host.

CLJS-1738 took care of a simple argument refactoring, thus leading to script/test-self-parity passing.

But, script/test-self-host is still failing with failures surrounding unit tests involving the ability to disable analyze deps.

Looking further at the changes made for CLJS-1733, you can see two additional things that need to be ported over:

  1. cljs.js makes a few calls to the cljs.analyzer namespace were cljs.analyzer/analyze-deps is used internally and thus needs to be bound (this fixes script/test-self-host).
  2. With https://github.com/clojure/clojurescript/commit/d197bcb2bef327e00bcb39346258ed314a69b8d9 there is a missing that was previously calculated early in a let and its calculation was moved down to occur later at its use point.


 Comments   
Comment by Mike Fikes [ 12/Aug/16 8:09 PM ]

With the attached patch script/test-self-host goes from failing to passing.

Comment by David Nolen [ 13/Aug/16 10:23 AM ]

fixed https://github.com/clojure/clojurescript/commit/712a8d8f1e69b4f440088ce21d32f63a2e363988





[CLJS-1738] Self-host: need to update call to check-use-macros-inferring-missing Created: 12/Aug/16  Updated: 12/Aug/16  Resolved: 12/Aug/16

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

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

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

 Description   

script/test-self-parity fails owing to a slight simplification in arguments to check-use-macros-inferring-missing. Also, should incorporate call to check-rename-macros-inferring-missing.



 Comments   
Comment by David Nolen [ 12/Aug/16 3:55 PM ]

fixed https://github.com/clojure/clojurescript/commit/5d30d79b9e1fc3394f02de66504b496933458825





[CLJS-1737] Self-host: clojure alias implicit macro use regression Created: 11/Aug/16  Updated: 13/Aug/16  Resolved: 13/Aug/16

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

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

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

 Description   

If you add a new test case to cljs.clojure-alias-test

(deftest use-macros
  (s/def ::even? (s/and number? even?))
  (is? (s/valid? ::even? 2)))

then script/test-self-parity will fail with

ERROR in (use-macros) (TypeError:NaN:NaN)
Uncaught exception, not in assertion.
expected: nil
  actual: #object[TypeError TypeError: Cannot read property 'call' of undefined]

and issue warnings while failing:

WARNING: Can't take value of macro cljs.spec/def at line 14
WARNING: Can't take value of macro cljs.spec/and at line 14

This appears to be a regression associated with the change made for CLJS-1716. If you check with the previous commit, it will pass. (Note that the proposed unit test needs to be revised slightly to use is instead of is? in order to be applicable to the older code.)



 Comments   
Comment by António Nuno Monteiro [ 13/Aug/16 8:42 AM ]

Attached patch with fix and test.

Comment by Mike Fikes [ 13/Aug/16 9:09 AM ]

I tested this locally and it passes script/test-self-parity. With CLJS-1740 it passes script/test-self-host.

I also tried it downstream with Planck and it works there:

cljs.user=> (require '[clojure.spec :as s])
nil
cljs.user=> (s/def ::even? (s/and number? even?))
:cljs.user/even?
cljs.user=> (s/valid? ::even? 3)
false
cljs.user=> (s/valid? ::even? 4)
true

I also tried the above successfully in script/noderepljs, and I successfully ran script/test (both with and without CLJS-1740).

Comment by David Nolen [ 13/Aug/16 10:07 AM ]

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





[CLJS-1735] Self-host: cljs.spec speced-vars instance Created: 11/Aug/16  Updated: 11/Aug/16  Resolved: 11/Aug/16

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

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

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

 Description   

Similar to CLJS-1656 but a new instance here: https://github.com/clojure/clojurescript/blob/85bab0736aae442d55d7f25ffc502b5195afe5c1/src/main/cljs/cljs/spec/test.cljc#L105



 Comments   
Comment by David Nolen [ 11/Aug/16 12:32 PM ]

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





[CLJS-1731] Self-host: do_template problem with script/test-self-parity Created: 10/Aug/16  Updated: 11/Aug/16  Resolved: 11/Aug/16

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

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

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

 Description   
Testing cljs.spec-test

ERROR in (conform-explain) (TypeError:NaN:NaN)
Uncaught exception, not in assertion.
expected: nil
  actual: #object[TypeError TypeError: Cannot read property 'do_template' of undefined]


 Comments   
Comment by Mike Fikes [ 10/Aug/16 4:04 PM ]

The attached patch makes some slight adjustments to the self-host parity unit test namespace loading logic so that it can successfully load the clojure.template namespace.

Note that the patch fixes this issue, but at the same time it reveals that there are now 6 new test failures related to cljs.spec.

Comment by Mike Fikes [ 10/Aug/16 10:05 PM ]

Good news: The changes in CLJS-1720 cover the newly failing unit tests mentioned above.

Comment by David Nolen [ 11/Aug/16 8:08 AM ]

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





[CLJS-1720] Self-host: Qualify symbols and namespaced keywords in spec macros Created: 31/Jul/16  Updated: 11/Aug/16  Resolved: 11/Aug/16

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

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

Attachments: Text File CLJS-1720-2.patch     Text File CLJS-1720-3.patch     Text File CLJS-1720.patch    
Patch: Code

 Description   

There are currently a few symbols and namespaced keywords in the cljs.spec macros namespace that either need to be qualified for proper operation, or should be.

The symbols fall into the category of calls to runtime functions in the cljs.spec namespace, and need qualification in order to avoid the $macros suffix. These comprise with-gen and gen.

In terms of keywords, an example that causes a failure is ::kvs->map in keys*: It resolves to :cljs.spec$macros/kvs->map which doesn't match the :cljs.spec/kvs->map spec registered near the bottom of the cljs.spec runtime namespace.

An example that doesn't cause an outright failure, but arguably inhibits its proper use by client code is ::nil and ::pred in the nilable macro. Ideally these would resolve to :cljs.spec/nil and :cljs.spec/pred so that client code can rely on these namespaced symbols identifying the branches.

Given the nilable example, you could argue that the intent is that all namespaced keywords in the cljs.spec macro namespace that employ :: resolve in :cljs.spec so that they can be used not simply as unique identifiers (the intent is not simply to avoid potential collisions), but so that they can be used as stable identifiers.

The set of keywords that should be qualified comprises: ::kind-form, ::kfn, ::conform-all, ::kvs->map, ::nil, and ::pred



 Comments   
Comment by Mike Fikes [ 10/Aug/16 9:43 PM ]

Patch no longer applies; attaching re-baselined CLJS-1720-2.patch

Comment by Mike Fikes [ 10/Aug/16 9:55 PM ]

Sorry David, I botched that last re-baseline. Attaching a corrected CLJS-1720-3.patch.

Comment by David Nolen [ 11/Aug/16 8:09 AM ]

fixed https://github.com/clojure/clojurescript/commit/20b08fe442a24c46526c812f6c52ad8c7d3f6c9b





[CLJS-1715] Self-host: Symbols in cljs.spec.test/instrument Created: 27/Jul/16  Updated: 07/Nov/16  Resolved: 07/Nov/16

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

Type: Defect Priority: Minor
Reporter: Mike Fikes Assignee: Mike Fikes
Resolution: Not Reproducible Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-1715-2.patch     Text File CLJS-1715.patch    

 Description   

For bootstrapped ClojureScript, within cljs.spec.test/instrument:

1. There is a use of speced-vars that conditionally needs the $macros suffix (analogous to CLJS-1656).
2. The references to the runtime fns instrumentable-syms and distinct-by need to be qualified (otherwise their expansions use $macros.



 Comments   
Comment by Mike Fikes [ 10/Aug/16 4:12 PM ]

Previous patch no longer applies. Attaching a rebased patch. This patch is still relevant to master.

Comment by David Nolen [ 16/Sep/16 2:12 PM ]

Needs a rebase.

Comment by David Nolen [ 16/Sep/16 2:23 PM ]

Does CLJS-1773 address this?

Comment by Mike Fikes [ 07/Nov/16 9:36 AM ]

Item 1 in the description was covered separately via CLJS-1735. (And, interestingly, I don't think CLJS-1773 covers this case; we still need an explicit use of $macros there.)

Item 2 should be covered by CLJS-1773.

So, in short, I think we can close this ticket. I'll do so.

Comment by Mike Fikes [ 07/Nov/16 9:36 AM ]

Covered by other tickets at this point. Issue no longer reproducible.





[CLJS-1708] Self-host: [iu]nstrument-1 needs to qualify [iu]nstrument-1* Created: 15/Jul/16  Updated: 11/Aug/16  Resolved: 11/Aug/16

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

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

Attachments: Text File CLJS-1708-2.patch     Text File CLJS-1708.patch    
Patch: Code

 Description   

The instrument-1 and unstrument-1 macros refer to instrument-1* and unstrument-1* functions which need to be qualified for bootstrap (otherwise they resolve as being in cljs.spec.test$macros).



 Comments   
Comment by Mike Fikes [ 27/Jul/16 8:36 AM ]

Initial patch no longer applies; attaching revised CLJS-1708-2.patch.

Comment by Mike Fikes [ 10/Aug/16 4:18 PM ]

The updated attached patch is still relevant to master in a bootstrapped context.

Comment by David Nolen [ 11/Aug/16 8:14 AM ]

fixed https://github.com/clojure/clojurescript/commit/85bab0736aae442d55d7f25ffc502b5195afe5c1





[CLJS-1707] Self-host: with-instrument-disabled needs to qualify *instrument-enabled* Created: 15/Jul/16  Updated: 11/Aug/16  Resolved: 11/Aug/16

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

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

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

 Description   

The unqualified *instrument-enabled* symbol resolves to cljs.spec.test$macros/*instrument-enabled* in bootstrap. This can be fixed by qualifying the symbol.



 Comments   
Comment by Mike Fikes [ 10/Aug/16 4:26 PM ]

The attached patch is still relevant to master in a bootstrapped context.

Comment by David Nolen [ 11/Aug/16 8:12 AM ]

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





[CLJS-1695] Self-host: Port cljs / clojure namespace aliasing Created: 25/Jun/16  Updated: 06/Jul/16  Resolved: 06/Jul/16

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

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

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

 Description   

CLJS-1692 covers auto-aliasing clojure.* to cljs.* in JVM ClojureScript. This asks for the same for bootstrapped ClojureScript.



 Comments   
Comment by Mike Fikes [ 25/Jun/16 11:47 PM ]

This issue has the use of util/ns->source in common with CLJS-1657. (Perhaps a common solution could be found for both—like making use of something along the lines of the bootstrap source load function.)

Comment by Mike Fikes [ 02/Jul/16 3:30 PM ]

The attached patch employs a "try first and then fall-back and patch things up" strategy with respect to clojure.* -> cljs.*.

Comment by David Nolen [ 06/Jul/16 7:42 AM ]

fixed https://github.com/clojure/clojurescript/commit/16af9f651f09e5c3f91098270ffacb806b907302





[CLJS-1694] Self-host: Port macro var inference in :refer Created: 25/Jun/16  Updated: 29/Jun/16  Resolved: 29/Jun/16

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

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

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

 Description   

CLJS-1507 covers JVM ClojureScript. This ticket requests the same for bootstrapped ClojureScript.



 Comments   
Comment by Mike Fikes [ 26/Jun/16 3:04 PM ]

Attached patch is a straightforward (intended to be faithful) port of the JVM ClojureScript feature.

Comment by David Nolen [ 29/Jun/16 2:09 PM ]

fixed https://github.com/clojure/clojurescript/commit/053d7f1ead6698b38e7ff656e0910ebc8bb8f729





[CLJS-1687] Self-host: cljs.spec: inst-in-range? and int-in-range? need qualification Created: 20/Jun/16  Updated: 20/Jun/16  Resolved: 20/Jun/16

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

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

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

 Description   

The runtime fns ints-in-range? and int-in-range? need to be qualified for self-host. (Otherwise they resolve to the $macros pseudo-namespace.



 Comments   
Comment by David Nolen [ 20/Jun/16 4:29 PM ]

fixed https://github.com/clojure/clojurescript/commit/416f322c25624b042e63e64a0754d5aaf48e552e





[CLJS-1680] Self-host: Don't require items no longer provided by Closure Created: 11/Jun/16  Updated: 11/Jun/16  Resolved: 11/Jun/16

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

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

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

 Description   

goog.array.ArrayLike no longer provided https://github.com/google/closure-library/commit/bf758d3c2ef81b91e7d73608f68ee3c327b709d4
goog.crypt.JpegEncoder no longer provided https://github.com/google/closure-library/commit/756182c7c566898ba0847d80b0c87389f7c037b6

With https://github.com/clojure/clojurescript/commit/aaa281d5cfef89385a484ad5f204ce6973f01222 we minimally need to remove these from the auxiliary namespace used in the self-host testing infrastructure.



 Comments   
Comment by David Nolen [ 11/Jun/16 12:13 PM ]

fixed https://github.com/clojure/clojurescript/commit/178c2c0daa5a52691d9e591425d55273e6176db3





[CLJS-1679] Self-host: Incorporate spec tests Created: 11/Jun/16  Updated: 11/Jun/16  Resolved: 11/Jun/16

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

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

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

 Description   

cljs.spect-test was added with this commit https://github.com/clojure/clojurescript/commit/391d5cf86fbbf3d110ef6bbfc263d8132518a172

This ticket asks for the same for self-host.



 Comments   
Comment by Mike Fikes [ 11/Jun/16 9:06 AM ]

Attached CLJS-1679.patch:

Adds cljs.spec-test to the self-host test suite

To do so involves some adjustments to self-host
loading in this suite (a workaround for CLJS-1657
for some of the spec namespaces) and the need
to skip loading code for cljs.core macros namespace.

This also catches and fixes one production code
issue in the cljs.spec macros namespace: the symbol
instrument-enabled needs to be qualified so that
it refers to the runtime namespace.

Comment by David Nolen [ 11/Jun/16 12:14 PM ]

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





[CLJS-1669] Self-host: s/fdef ns-qualify *ns* name field access Created: 04/Jun/16  Updated: 05/Jun/16  Resolved: 05/Jun/16

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

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

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

 Description   

If you evaluate

(s/fdef foo :args ::s/any :ret ::s/any)

in a self-host context, the code will ultimately call cljs.spec/ns-qualify which involves a form (.name *ns*). While this style of field access works in Clojure, in order to work in self-host, the form needs to be (.-name *ns*).

You can imitate the same in a regular JVM ClojureScript REPL by comparing

(.name (find-ns 'cljs.user))
(.-name (find-ns 'cljs.user))


 Comments   
Comment by David Nolen [ 05/Jun/16 9:07 AM ]

fixed https://github.com/clojure/clojurescript/commit/1dab2d684a4bfb1b2ad31979600b392df689f6ba





[CLJS-1668] Self-host: Macro checking support Created: 04/Jun/16  Updated: 05/Jun/16  Resolved: 05/Jun/16

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

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

Attachments: Text File CLJS-1668-2.patch     Text File CLJS-1668-3.patch     Text File CLJS-1668.patch    
Patch: Code

 Description   

Add support for macro checking in self-host.

In essence, like https://github.com/clojure/clojurescript/commit/d6440795c22e46d2a2f8ab585fb6cfabf62cc147 but perhaps with appropriate code in :cljs reader conditional branches.



 Comments   
Comment by Mike Fikes [ 04/Jun/16 11:14 PM ]

The attached CLJS-1668.patch works. One twist is that you need to refer to a macro symbol using the $macros suffix, but there's probably no easy way around that for now. As a concrete example from the Spec guide, you can set things if you use cljs.core$macros/declare as the symbol passed to s/fdef.

Of interest in the patch, worthy of feedback, is the use of the construct:

^::no-resolve cljs.spec/macroexpand-check

This appears to be efficient (as the JavaScript var is either nil or not), and this works in self-host where the analyzer has direct access to check whether the var is nil.

Comment by Mike Fikes [ 04/Jun/16 11:31 PM ]

Whoops. The first patch fails to pass script/test-self-parity (owing to cljs.spec being nil) Attaching a revised patch CLJS-1688-2.patch that first checks for non-nil using an and.

Comment by David Nolen [ 05/Jun/16 9:25 AM ]

We don't want to leak out $macros, it's an implementation detail. We should automatically do the right thing if we are in a macro namespace. I believe there should be enough information in &env to figure this out in cljs.spec/fdef no? If not we should address this in the same patch.

Comment by Mike Fikes [ 05/Jun/16 11:29 AM ]

I agree. Perhaps one additional aspect to consider is macro-functions (like cljs.core/inc). The CLJS-1668-3.patch would perhaps lead to the ability to catch misuse when these are used either as macros or functions. Instead of detecting and adding $macros inside of fdef, the patch experiments with going the opposite direction: removing $macros in order to find a spec. That way, a single spec would cover the logically equivalent macro and function.

With this, you can see what might be desirable behavior:

cljs.user=> (require '[cljs.spec :as s])
nil
cljs.user=> (s/fdef cljs.core/inc :args number? :ret number?)
cljs.core/inc
cljs.user=> (inc "abc")
            ⬆
Call to cljs.core$macros/inc did not conform to spec:
val: ("abc") fails at: [:args] predicate: number?
:cljs.spec/args  ("abc")
 at line 1
cljs.user=> (map inc [1])
(2)
cljs.user=> (s/instrument cljs.core/inc)
#'cljs.core/inc
cljs.user=> (map inc [1])
Call to [object Object] did not conform to spec:
val: (1) fails at: [:args] predicate: number?
:cljs.spec/args  (1)

Interestingly, you can see that something else is going on with the map inc example at the bottom. This also occurs in a JVM ClojureScript REPL with master and is unrelated to the attached patch; I'd like to understand what's going on with it.

Comment by Mike Fikes [ 05/Jun/16 11:49 AM ]

Actually, in the example in the previous comment, it is the spec I wrote which is bad.

Here is a revised transcript showing the desired behavior with a proper spec:

cljs.user=> (require '[cljs.spec :as s])
nil
cljs.user=> (s/fdef cljs.core/inc
       #_=>   :args (s/cat :x number?)
       #_=>   :ret number?)
cljs.core/inc
cljs.user=> (inc 1)
2
cljs.user=> (inc "abc")
            ⬆
Call to cljs.core$macros/inc did not conform to spec:
In: [0] val: "abc" fails at: [:args :x] predicate: number?
:cljs.spec/args  ("abc")
 at line 1
cljs.user=> (s/instrument cljs.core/inc)
#'cljs.core/inc
cljs.user=> (map inc [1])
(2)
cljs.user=> (map inc ["abc"])
Call to [object Object] did not conform to spec:
In: [0] val: "abc" fails at: [:args :x] predicate: number?
:cljs.spec/args  ("abc")
Comment by David Nolen [ 05/Jun/16 1:43 PM ]

What I'm suggesting would cover us for both macros that shadow fns and the runtime fns. If the fdef is in a macro namespace it covers the macro. If it's a runtime ns it covers the runtime fn. That is a single spec isn't going to cover syntax and runtime behavior - it's desirable to able to spec both.

Comment by Mike Fikes [ 05/Jun/16 2:13 PM ]

Trying with patch 2, relying on the idea that an unqualified name in a macros namespace will automatically have the $macros suffix added internally as an implementation detail, this is a promising experiment: (It is also consistent with the way you can call functions from within macro namespaces in bootstrap as illustrated in the bottom half of http://blog.fikesfarm.com/posts/2016-01-05-clojurescript-macros-calling-functions.html)

$ cat src/foo/core.cljc
(ns foo.core
  (:require [#?(:clj clojure.spec :cljs cljs.spec) :as s]))

(defmacro my-inc
  [x]
  `(inc ~x))

(s/fdef my-inc
 :args (s/cat :x number?)
 :ret number?)
$ cat src/foo/core.cljs
(ns foo.core
  (:require-macros foo.core)
  (:require [cljs.spec :as s]))

(defn my-inc
  [x]
  (inc x))

(s/fdef my-inc
 :args (s/cat :x number?)
 :ret number?)

Using this pair of source files in Planck:

$ planck -c src
Planck 1.15
ClojureScript 1.9.39
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
    Exit: Control+D or :cljs/quit or exit or quit
 Results: Stored in vars *1, *2, *3, an exception in *e

cljs.user=> (require '[foo.core :include-macros true]
       #_=>          '[cljs.spec :as s])
nil
cljs.user=> (foo.core/my-inc 1)
2
cljs.user=> (foo.core/my-inc "a")
            ⬆
Call to foo.core$macros/my-inc did not conform to spec:
In: [0] val: "a" fails at: [:args :x] predicate: number?
:cljs.spec/args  ("a")
 at line 1
cljs.user=> (apply foo.core/my-inc [1])
2
cljs.user=> (apply foo.core/my-inc ["a"])
"a1"
cljs.user=> (s/instrument foo.core/my-inc)
#'foo.core/my-inc
cljs.user=> (apply foo.core/my-inc ["a"])
Call to [object Object] did not conform to spec:
In: [0] val: "a" fails at: [:args :x] predicate: number?
:cljs.spec/args  ("a")

	cljs.core/ExceptionInfo (cljs/core.cljs:10149:11)
	conform! (cljs/spec.cljs:894:54)
	G__12411__delegate (cljs/spec.cljs:924:135)
	cljs/lang/applyTo (cljs/spec.cljs:965:26)
	cljs.core/apply (cljs/core.cljs:3563:1)

cljs.user=>

(Note, I'm doing :include-macros true to work around CLJS-1657)

In script/noderepljs, (slightly modified to include my source path):

$ script/noderepljs
ClojureScript Node.js REPL server listening on 49477
To quit, type: :cljs/quit
cljs.user=> (require '[foo.core :include-macros true]
                     '[cljs.spec :as s])
nil
cljs.user=> (foo.core/my-inc 1)
2
cljs.user=> (foo.core/my-inc "a")
clojure.lang.ExceptionInfo: Call to foo.core/my-inc did not conform to spec:
In: [0] val: "a" fails at: [:args :x] predicate: number?
:clojure.spec/args  ("a")
 at line 1 <cljs repl> {:file "<cljs repl>", :line 1, :column 1, :tag :cljs/analysis-error}
	at clojure.core$ex_info.invokeStatic(core.clj:4631)
	at clojure.core$ex_info.invoke(core.clj:4631)
	at cljs.analyzer$error.invokeStatic(analyzer.cljc:594)
	at cljs.analyzer$error.invoke(analyzer.cljc:590)
	at cljs.analyzer$macroexpand_1.invokeStatic(analyzer.cljc:2432)
	at cljs.analyzer$macroexpand_1.invoke(analyzer.cljc:2428)
	at cljs.analyzer$analyze_seq.invokeStatic(analyzer.cljc:2462)
	at cljs.analyzer$analyze_seq.invoke(analyzer.cljc:2445)
	at cljs.analyzer$analyze_form.invokeStatic(analyzer.cljc:2577)
	at cljs.analyzer$analyze_form.invoke(analyzer.cljc:2573)
	at cljs.analyzer$analyze_STAR_.invokeStatic(analyzer.cljc:2624)
	at cljs.analyzer$analyze_STAR_.invoke(analyzer.cljc:2615)
	at cljs.analyzer$analyze.invokeStatic(analyzer.cljc:2640)
	at cljs.analyzer$analyze.invoke(analyzer.cljc:2627)
	at cljs.repl$evaluate_form.invokeStatic(repl.cljc:450)
	at cljs.repl$evaluate_form.invoke(repl.cljc:440)
	at cljs.repl$eval_cljs.invokeStatic(repl.cljc:570)
	at cljs.repl$eval_cljs.invoke(repl.cljc:563)
	at cljs.repl$repl_STAR_$read_eval_print__6619.invoke(repl.cljc:876)
	at cljs.repl$repl_STAR_$fn__6625$fn__6634.invoke(repl.cljc:915)
	at cljs.repl$repl_STAR_$fn__6625.invoke(repl.cljc:914)
	at cljs.compiler$with_core_cljs.invokeStatic(compiler.cljc:1154)
	at cljs.compiler$with_core_cljs.invoke(compiler.cljc:1145)
	at cljs.repl$repl_STAR_.invokeStatic(repl.cljc:878)
	at cljs.repl$repl_STAR_.invoke(repl.cljc:761)
	at cljs.repl$repl.invokeStatic(repl.cljc:996)
	at cljs.repl$repl.doInvoke(repl.cljc:926)
	at clojure.lang.RestFn.invoke(RestFn.java:410)
	at user$eval6810.invokeStatic(NO_SOURCE_FILE:3)
	at user$eval6810.invoke(NO_SOURCE_FILE:3)
	at clojure.lang.Compiler.eval(Compiler.java:6942)
	at clojure.lang.Compiler.eval(Compiler.java:6905)
	at clojure.core$eval.invokeStatic(core.clj:3105)
	at clojure.main$eval_opt.invokeStatic(main.clj:288)
	at clojure.main$eval_opt.invoke(main.clj:282)
	at clojure.main$initialize.invokeStatic(main.clj:308)
	at clojure.main$null_opt.invokeStatic(main.clj:342)
	at clojure.main$null_opt.invoke(main.clj:339)
	at clojure.main$main.invokeStatic(main.clj:421)
	at clojure.main$main.doInvoke(main.clj:384)
	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)
Caused by: java.lang.IllegalArgumentException: Call to foo.core/my-inc did not conform to spec:
In: [0] val: "a" fails at: [:args :x] predicate: number?
:clojure.spec/args  ("a")

	at clojure.spec$macroexpand_check.invokeStatic(spec.clj:560)
	at clojure.spec$macroexpand_check.invoke(spec.clj:549)
	at clojure.lang.Var.invoke(Var.java:383)
	at cljs.analyzer$macroexpand_1_STAR_.invokeStatic(analyzer.cljc:2383)
	at cljs.analyzer$macroexpand_1_STAR_.invoke(analyzer.cljc:2369)
	... 41 more
cljs.user=> (apply foo.core/my-inc [1])
2
cljs.user=> (apply foo.core/my-inc ["a"])
"a1"
cljs.user=> (s/instrument foo.core/my-inc)
#'foo.core/my-inc
cljs.user=> (apply foo.core/my-inc ["a"])

repl:13
throw e__6482__auto__;
^
Error: Call to [object Object] did not conform to spec:
In: [0] val: "a" fails at: [:args :x] predicate: number?
:cljs.spec/args  ("a")

    at new cljs$core$ExceptionInfo (/Users/mfikes/Projects/clojurescript/.cljs_node_repl/cljs/core.js:34473:10)
    at Function.cljs.core.ex_info.cljs$core$IFn$_invoke$arity$3 (/Users/mfikes/Projects/clojurescript/.cljs_node_repl/cljs/core.js:34549:9)
    at Function.cljs.core.ex_info.cljs$core$IFn$_invoke$arity$2 (/Users/mfikes/Projects/clojurescript/.cljs_node_repl/cljs/core.js:34545:26)
    at cljs$core$ex_info (/Users/mfikes/Projects/clojurescript/.cljs_node_repl/cljs/core.js:34531:26)
    at cljs.spec.spec_checking_fn.conform_BANG_ (/Users/mfikes/Projects/clojurescript/.cljs_node_repl/cljs/spec.js:892:25)
    at cljs.spec.spec_checking_fn.G__15208__delegate (/Users/mfikes/Projects/clojurescript/.cljs_node_repl/cljs/spec.js:922:136)
    at Function.cljs.spec.spec_checking_fn.G__15208.cljs$lang$applyTo (/Users/mfikes/Projects/clojurescript/.cljs_node_repl/cljs/spec.js:963:8)
    at Function.cljs.core.apply.cljs$core$IFn$_invoke$arity$2 (/Users/mfikes/Projects/clojurescript/.cljs_node_repl/cljs/core.js:12759:10)
    at cljs$core$apply (/Users/mfikes/Projects/clojurescript/.cljs_node_repl/cljs/core.js:12730:24)
    at repl:1:105
cljs.user=>
Comment by David Nolen [ 05/Jun/16 2:35 PM ]

fixed https://github.com/clojure/clojurescript/commit/6bd816f0fc6f0c3369b9b03f2561b219de6a69fc





[CLJS-1664] Self-host: The filename aux.cljs is a problem on windows. Created: 02/Jun/16  Updated: 05/Jun/16  Resolved: 05/Jun/16

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

Type: Defect Priority: Minor
Reporter: Oliver George Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Description   

As I understand AUX is a reserved word dating back to MS-DOS Device Driver days. It seems many windows features are hardwired to reject that pattern in filenames.

In my case running windows 10:

  • I can't git clone the full repo (aux.cljs is skipped).
  • Downloading and unzipping throws an error on that file.

I suspect the best solution is to rename that file.



 Comments   
Comment by Mike Fikes [ 02/Jun/16 9:30 PM ]

I created this particular file when adding the capability to run the compiler unit tests under self host. The choice of filename is arbitrary. In fact, it is just an auxiliary namespace is employed to cause certain files to be dumped to the compiler output directory. It could be named anything and there should be no other files making use of that particular namespace name.

Comment by Mike Fikes [ 03/Jun/16 6:36 PM ]

The attached patch simply moves the file to a new name (while updating the namespace in the ns form).

Comment by David Nolen [ 05/Jun/16 9:16 AM ]

fixed https://github.com/clojure/clojurescript/commit/63a4634c3b2aa72f33404901843540fe3302496d





[CLJS-1657] Self-host: Implicit macro loading with alias Created: 01/Jun/16  Updated: 14/Aug/16  Resolved: 14/Aug/16

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

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

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

 Description   

If a namespace relies on implicit macro loading (described here https://github.com/clojure/clojurescript/wiki/Differences-from-Clojure#namespaces), and an alias is used, it is possible for aliased symbol resolution to fail.

This can be reproduced by adding a 10th case in self-host.test/test-load-and-invoke-macros covering this situation:

(let [st (cljs/empty-state)]
        ;; Rely on implicit macro loading (ns loads its own macros), with an alias
        (cljs/eval-str st
          "(ns cljs.user (:require [foo.core :as foo]))"
          nil
          {:eval node-eval
           :load (fn [{:keys [macros]} cb]
                   (if macros
                     (cb {:lang :clj :source "(ns foo.core) (defmacro add [a b] `(+ ~a ~b))"})
                     (cb {:lang :clj :source "(ns foo.core (:require-macros foo.core))"})))}
          (fn [{:keys [value error]}]
            (is (nil? error))
            (cljs/eval-str st
              "(foo/add 300 500)"
              nil
              {:eval    node-eval
               :context :expr}
              (fn [{:keys [error value]}]
                (is (nil? error))
                (is (= 800 value))
                (inc! l))))))

This will result in:

Testing self-host.test

FAIL in (test-load-and-invoke-macros) (at .../clojurescript/builds/out-self/core-self-test.js:11545:454)
expected: (nil? error)
  actual: (not (nil? #error {:message "ERROR", :data {:tag :cljs/analysis-error}, :cause #object[TypeError TypeError: Cannot read property 'call' of undefined]}))

FAIL in (test-load-and-invoke-macros) (at .../clojurescript/builds/out-self/core-self-test.js:11548:49)
expected: (= 800 value)
  actual: (not (= 800 nil))


 Comments   
Comment by Mike Fikes [ 01/Jun/16 7:48 AM ]

Analysis: This is because, this bit of code https://github.com/clojure/clojurescript/blob/19510523ad9de3f16832d287bae86f701e8b4263/src/main/clojure/cljs/analyzer.cljc#L1817-L1820
has a branch that only works in non-bootstrap ClojureScript.

You can also work around the issue (or gain a better understanding) in several ways (if you can control the affected loading namespace—this won't work if this affects code down in a library you are loading):

1. You can add :include-macros true
2. You can load the self-macro-loading namespace twice. (For example, if at the REPL, you can (require [foo.core :as foo]) twice.) This causes the analysis state to be set up so that on the second require, it is taken care of in the first clause of the or in the linked code above.
3. You can even assoc-in enough state prior to the load so that you are effectively doing (2).

In all of these cases, when it fails, vs. when it succeeds, you can see a difference in the :require-macros key in the analysis map of the loading namespace ('cljs.user, for example). When it fails, you will see that this key is empty and when it succeeds, you will see that the key is populated, and in particular, with the foo alias.

In the case where you don't use an alias, implicit macro loading will fail in a way that won't be visible: The :require-macros key will not be set up as described above, but qualified symbol resolution will still succeed (foo.core/add in the example will resolve to foo.core$macros/add), probably simply owing to the way resolution is performed.

Comment by Mike Fikes [ 14/Aug/16 1:48 PM ]

As António Monteiro points out, this is no longer reproducible. My recommendation would be to add the additional unit test in the description and to also remove the workaround on this line

https://github.com/clojure/clojurescript/blob/756fa9bb196a97e0ae40fd644da5e492e0336c1c/src/test/self/self_parity/test.cljs#L233-L237

(and the two calls to it below), and ultimately with a patch to lock down these unit tests, resolve this as fixed.

Comment by António Nuno Monteiro [ 14/Aug/16 5:22 PM ]

As per Mike Fikes's feedback, attached a patch that adds the proposed unit test and removes the workaround for the issue from self parity tests.

Comment by David Nolen [ 14/Aug/16 7:05 PM ]

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





[CLJS-1656] Self-host: cljs.spec: speced-vars* fn not resolving Created: 31/May/16  Updated: 10/Jun/16  Resolved: 10/Jun/16

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

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

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

 Description   

If you load cljs.spec.test in self-hosted ClojureScript, the reference to speced-vars* in the following location will not resolve:

https://github.com/clojure/clojurescript/blob/19510523ad9de3f16832d287bae86f701e8b4263/src/main/cljs/cljs/spec/test.cljc#L22

This is because it is a function in a macros namespace. In self-hosted ClojureScript, this function can be resolved if qualified using the $macros pseudo-namespace suffix.



 Comments   
Comment by Mike Fikes [ 31/May/16 3:32 PM ]

The attached patch resolves the issue by simply using the $macros suffix iff under self-hosted ClojureScript.

(I tried to revise the code to instead call the speced-vars macro, but that doesn't appear easy to accomplish given rest args are involved and you can't apply the macro.)

Comment by David Nolen [ 10/Jun/16 9:17 AM ]

fixed https://github.com/clojure/clojurescript/commit/868c6e426df0a021b3223b47f08ddfa01e492608





[CLJS-1652] Self-host: Avoid alias so cljs.spec loadable Created: 28/May/16  Updated: 28/May/16  Resolved: 28/May/16

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

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

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

 Description   

The cljs.spec macro namespace employs the Clojure alias function to establish c as an alias for clojure.core. This prevents this namespace from being compiled as ClojureScript and thus bootstrapped ClojureScript environments cannot load it.

Proposed fix: Simply avoid alias and inline the namespace to form qualified symbols.



 Comments   
Comment by David Nolen [ 28/May/16 8:21 PM ]

fixed https://github.com/clojure/clojurescript/commit/8477f19dcf67a8f305b46f2fd2e793586e027263





[CLJS-1651] Self-host: Cannot replace core macro-function Created: 28/May/16  Updated: 14/Nov/16  Resolved: 14/Nov/16

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

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

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

 Description   

Replace double to multiply by two in self host and you will see that operator-position resolution chooses the core macro:

ClojureScript Node.js REPL server listening on 54425
To quit, type: :cljs/quit
cljs.user=> (require 'cljs.js)
nil
cljs.user=> (def st (cljs.js/empty-state))
#'cljs.user/st
cljs.user=> (cljs.js/eval-str st "(defn double [x] (* 2 x))" nil {:eval cljs.js/js-eval :context :expr} identity)
WARNING: double already refers to: cljs.core/double being replaced by: cljs.user/double at line 1
{:ns cljs.user, :value #object[cljs$user$double "function cljs$user$double(x){
return ((2) * x);
}"]}
cljs.user=> (cljs.js/eval-str st "[(double 3) (apply double [3])]" nil {:eval cljs.js/js-eval :context :expr} identity)
{:ns cljs.user, :value [3 6]}

The correct result above would be [6 6].



 Comments   
Comment by António Nuno Monteiro [ 13/Nov/16 11:27 AM ]

Attached patch with fix and test.

Comment by Mike Fikes [ 13/Nov/16 12:07 PM ]

Confirmed that António's patch fixes things downstream in Planck.

Comment by David Nolen [ 14/Nov/16 1:43 PM ]

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





[CLJS-1626] cljs.test for bootstrap Created: 18/Apr/16  Updated: 21/Apr/16  Resolved: 21/Apr/16

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

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

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

 Description   

Make it so that the cljs.test namespace can work with bootstrap ClojureScript.

Currently the known obstacles that prevent this largely surround macros, but they are known to be solvable. (It has been done successfully downstream in Planck.)

Primary goals:

  • Preserve existing functionality and performance for regular JVM ClojureScript users of cljs.test
  • Make it so that cljs.test namespace can be loaded in any bootstrap environment that makes use of cljs.js and implements load functions supporting macros.
  • Add scripted facilities so that the ClojureScript compiler's unit tests can be executed (perhaps in Node if installed) as an auxiliarry test capability (like script/test but for self-host)

Secondary goals:

  • Ensure that it is possible for downstream ClojureScript projects that target bootstrap can make use cljs.test to run their test suites in bootstrap mode. (The ClojureScript compiler wouldn't provide any scripts for this—it would just strive to ensure that this is possible.)
  • Support custom asserts assert-expr in bootstrap mode which are written in ClojureScript (as compared to Clojure for the JVM-based approach). (This has been shown to be possible with downstream Planck.)

Rationale:

While bootstrap is of lower priority than regular JVM-based ClojureScript, it is still a burden to support it: It is easy to make a change to the compiler, but forget a conditional branch for bootstrap, or some such, thus causing a regression for bootstrap. With this capability, we'd have the ability to run the very same compiler unit tests in bootstrap mode, thus drastically reducing the support burden for bootstrap's existence.

Secondarily, this would help downstream libraries confidently target bootstrap as an environment by facilitating those libraries in running their own unit tests using cljs.test.



 Comments   
Comment by Mike Fikes [ 20/Apr/16 2:10 PM ]

Attaching CLJS-1616-1.patch for feedback. (It might be good to go.)

It makes some very minor changes to the production code so that cljs.test can be loaded in bootstrap environments.

The renames

src/main/cljs/cljs/test.clj → src/main/cljs/cljs/test.cljc
src/main/clojure/cljs/analyzer/api.clj → src/main/clojure/cljs/analyzer/api.cljc

actually involve very few changes after renames.

In addition to running the regular ClojureScript tests, I've confirmed that you can build an uberjar and still properly {{(require '[cljs.test :refer-macros [deftest is]])}} in a REPL. I've also confirmed that tools.reader, which runs CLJS tests can still do so with these changes.

In addition it adds a new script/test-self-parity which will run (most of) the compiler unit tests in bootstrap mode in Node. This is done by bringing up an :optimizations :none environment in Node and using the cljs.js capability to load the compiler unit tests along with cljs.test. Of interest is that this script pulls out the clojure.template namespace so it can be loaded. (Downstream projects that might end using script/test-self-parity as an example of how to run their own unit tests in bootstrap mode would need to do something similar.)

(Note: If we can come up with a better name than "parity", willing to revise it. script/test-self-host was taken.)

This patch does not address writing custom assert assert-expr in ClojureScript by treating the defaulti as being in the cljs.test namespace (as is illustrated in http://blog.fikesfarm.com/posts/2016-02-25-custom-test-asserts-in-planck.html), but I did confirm that you can easily achieve the same by simply working with cljs.test$macros/assert-expr.

Comment by Mike Fikes [ 21/Apr/16 10:14 AM ]

I've tested this patch using a downstream example repository that illustrates testing a library targeting bootstrap. It also makes use of a custom test assert. This shows that all of the secondary goals in the ticket description are met.

(The downstream repo, for those interested: https://github.com/mfikes/titrate)

Comment by David Nolen [ 21/Apr/16 12:43 PM ]

fixed https://github.com/clojure/clojurescript/commit/28e040d41f3a83901b6391898f51c4bfc2622452





[CLJS-1609] Self-host: Expressions like `(+ 42)` and `(let [x 42] x)` are evaluated to nil. Created: 26/Mar/16  Updated: 14/Apr/16  Resolved: 14/Apr/16

Status: Closed
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: Not Reproducible Votes: 0
Labels: bootstrap


 Description   

Expressions like `(+ 42)` and `(let [x 42] x)` are evaluated to nil.

(cljs/eval-str (cljs/empty-state) "(+ 42)" 'test {:eval cljs/js-eval} identity); => {:ns cljs.user, :value nil}

while

(cljs/eval-str (cljs/empty-state) "(+ 0 42)" 'test {:eval cljs/js-eval} identity); => {:ns cljs.user, :value 42}

(cljs/eval-str (cljs/empty-state) "(let [x 42] x)" 'test {:eval cljs/js-eval} identity); => {:ns cljs.user, :value nil}

while
(cljs/eval-str (cljs/empty-state) "[(let [x 42] x)]" 'test {:eval cljs/js-eval} identity); => {:ns cljs.user, :value [42]}



 Comments   
Comment by Mike Fikes [ 30/Mar/16 10:39 PM ]

If you are evaluating ClojureScript source that reduces expressions to values, then you should add :context :expr to the opts map. (See CLJS-1357.) Otherwise, I believe the default will be :statement. (See https://github.com/clojure/clojurescript/blob/c72e9c52156b3b348aa66857830c2ed1f0179e8c/src/main/clojure/cljs/analyzer.cljc#L512)

Comment by Yehonathan Sharvit [ 04/Apr/16 12:35 PM ]

I tried the following, but it didn't work

(def st (cljs/empty-state (fn [state] (assoc-in state [:options :context] :expr))))
(cljs/eval-str st "(let [x 2])" "bla" {:eval cljs/js-eval} identity); =>{:ns cljs.user, :value nil}

Comment by Mike Fikes [ 10/Apr/16 12:14 AM ]

Sorry, by opts, I was referring to the 4th argument to cljs.js/eval-str. Here's an example:

cljs.user=> (require '[cljs.js :as cljs])
nil
cljs.user=> (def st (cljs/empty-state))
#'cljs.user/st
cljs.user=> (cljs/eval-str st "(let [x 2] x)" "bla" {:eval cljs/js-eval :context :expr} identity)
{:ns cljs.user, :value 2}

On the other hand, if you explicitly set the context to be :statement, you will get the nil you reported:

cljs.user=> (cljs/eval-str st "(let [x 2] x)" "bla" {:eval cljs/js-eval :context :statement} identity)
{:ns cljs.user, :value nil}

I don't think this behavior is a bug for :statement context.

Comment by Yehonathan Sharvit [ 10/Apr/16 1:44 AM ]

Thanks Mike!
It works fine.

Comment by Mike Fikes [ 14/Apr/16 7:00 AM ]

Since it works, closing.





[CLJS-1608] Self-host: Alias-scoped keywords works only for first segment Created: 23/Mar/16  Updated: 23/Mar/16  Resolved: 23/Mar/16

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

Type: Defect Priority: Minor
Reporter: Andrea Richiardi Assignee: Unassigned
Resolution: Declined Votes: 0
Labels: bootstrap
Environment:

ClojureScript 1.8.34



 Description   

An aliased keyword works only if the alias corresponds to the first segment, example:

(ns dummy.core (:require [clojure.string :as s])
cljs.user=> ::s/key
Invalid token: ::s/key

BUT

dummy.core=> (ns dummy.core (:require [clojure.string :as clojure]))
nil
dummy.core=> ::clojure/key
:clojure.string/key


 Comments   
Comment by Andrea Richiardi [ 23/Mar/16 5:42 PM ]

By adding this test, I was actually able to prove that this works here and I must made a mistake:

(deftest test-CLJS-1608
  (let [st (cljs/empty-state)]
    (cljs/eval-str st
      "(ns alias-load.core (:require [clojure.string :as s]))"
      nil
      {:ns      'cljs.user
       :context :expr
       :eval    cljs.js/js-eval
       :load    (fn [_ cb]
                  (cb {:lang :clj :source "(ns clojure.string)"}))}
      (fn [{:keys [error value]}]
        (is (nil? error))
        (cljs.js/eval-str st
          "::s/bar"
          nil
          {:ns      'alias-load.core
           :context :expr
           :eval    cljs.js/js-eval}
          (fn [{:keys [error value]}]
            (is (nil? error))
            (is (= :clojure.string/bar value))))))))
Comment by Andrea Richiardi [ 23/Mar/16 5:42 PM ]

Sorry for the noise





[CLJS-1604] Self-host: cljs.js/compile-str causes a javascript error Created: 19/Mar/16  Updated: 16/Jun/17  Resolved: 16/Jun/17

Status: Closed
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: Declined Votes: 0
Labels: bootstrap, bug


 Description   

When requiring `cljs.js` and calling `cljs.js/compile-str` with `:optimizations :advanced`
I get the following error in the browser:
"Uncaught TypeError: Cannot set property 'rd' of undefined"

Steps to reproduce:

1. Make a directory
2. Copy shipping cljs.jar into the directory
3. Make an index.html, src/hello_world/core.cljs, and build.clj file with contents as below.
4. java -cp cljs.jar:src clojure.main build.clj
5. Open index.html with Chrome and view the JavaScriptConsole in Chrome.

index.html:

<html>
<body>
<script type="text/javascript" src="out/main.js"></script>
</body>
</html>
src/hello_world/core.cljs:
(ns hello-world.core
(:require [cljs.js :as cljs]))

(set! (.. js/window -cljs -user) #js {})

(cljs/compile-str (cljs/empty-state) "" indentity)

build.clj:

(require 'cljs.build.api)

(cljs.build.api/build "src"
{:output-to "out/main.js"
:optimizations :whitespace})

(System/exit 0)



 Comments   
Comment by Yehonathan Sharvit [ 19/Mar/16 5:31 PM ]

I need to fix the title of the issue: "Self-host: in advanced compilation - cljs.js/compile-str causes a javascript error"

Comment by Mike Fikes [ 30/Mar/16 11:14 PM ]

You can only use up to :optimizations :simple with self-host. See https://github.com/clojure/clojurescript/wiki/Optional-Self-hosting#production-builds

Discussion: One rationale for this is that the emitted code, in order to be executable, needs access to non-Closure-munged/DCEd symbols from the standard ClojureScript lib. Perhaps this limitation need only exist for eval-str, (while not for compile-str, analyze-str, etc.)

Comment by Mike Fikes [ 14/Apr/16 7:02 AM ]

I'd recommend closing this as declined (no plans exist to support self-host with :advanced).





[CLJS-1601] Optimize cljs.core dump Created: 12/Mar/16  Updated: 05/Oct/17

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

Type: Enhancement Priority: Minor
Reporter: Nikita Beloglazov Assignee: David Nolen
Resolution: Unresolved Votes: 1
Labels: bootstrap

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

 Description   

When building cljs source that uses cljs.js namespace the final js file is quite huge: 6.4M. As described in wiki: https://github.com/clojure/clojurescript/wiki/Optional-Self-hosting it mostly consists of analysis cache of the cljs.core namespace. As a workaround, the wiki article suggests dumping cache to a separate file and load it at runtime instead of bundling in js binary. I think it is possible to have something in between that doesn't require additional efforts from a user and also optimizes the size of the js file. The idea that instead of dumping cache as raw clojure data-structure it is serialized to string. This way compiler won't compile cache into js (which adds a lot of code) and leave it a string. At runtime, this string will be parsed back to clojure using tools.reader.

Here is the proposal: https://gist.github.com/nbeloglazov/0bf163fb62fa4b61d446

Checking locally it reduces the size of js file from 6.4M to 2.7M which I think quite good. The downside is that now js has to do more work on runtime (parse huge string) when today it simply read js code and evaluates it. But I don't think if it's a big concern. If it is desired to keep all behavior a new option can be added for :dump-core compiler setting, something like :dump-core :string that enables string serialization of the cache.

Does it sound reasonable?



 Comments   
Comment by Nikita Beloglazov [ 27/Mar/16 8:54 PM ]

Attaching suggested fix. Analysis cache is serialized to string and read back to clojure datastructure when cljs.js is initialized.

Comment by David Nolen [ 28/Mar/16 6:39 AM ]

Please change the patch so this optional as you've suggested.

Comment by David Nolen [ 28/Mar/16 6:40 AM ]

Also have you submitted your Clojure CA yet?

Comment by Nikita Beloglazov [ 28/Mar/16 1:35 PM ]

Will do. Yes, I've submitted CA. I used my official name, Mikita Belahlazau there.

Comment by Nikita Beloglazov [ 29/Mar/16 12:16 AM ]

Updated patch that adds option to serialize core analysis cache as string. Possible values of :dump-core are :raw, :string, :none. Old true/false values supported for backward compatibility.

As for default, current patch uses :raw, but I think it makes more sense to use :string. Saving extra few mb of final js is quite good. I think most devs won't go deep into figuring out why js is big and just leave it as it is. Additional one-time parsing performance hit :string introduces acceptable: when :string is used, page loads in 1s while with :raw the time is ~800ms.

Comment by David Nolen [ 16/Jun/17 12:41 PM ]

I'm questioning whether this actual valuable? It seems to me if you're serious about code size you would just use Transit and them load the analysis asynchronously?

Comment by Nikita Beloglazov [ 17/Jun/17 2:39 AM ]

Yes, if size is critical then there are better ways to hand-tune the way of loading analysis. At the same time having 3m vs 6m file for local/simple development is a nice win. The only downside is speed, but I feel like big reduction in size is better than small speed penalty.





[CLJS-1596] Self-host: :load-macros and :analyze-deps don't work in cljs.js Created: 01/Mar/16  Updated: 11/Mar/16  Resolved: 11/Mar/16

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

Type: Defect Priority: Minor
Reporter: Nikita Beloglazov Assignee: Mike Fikes
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Description   

Playing with bootstrapped cljs I noticed that :analyze-deps doesn't work correctly. Setting it to false doesn't make any effect and deps are still being analyzed. I checked source code and it seems like :analyze-deps and :load-macros are always true regardless what you provide:

For example:
https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/js.cljs#L225

{
:*load-macros*  (or (:load-macros opts) true)
:*analyze-deps* (or (:analyze-deps opts) true)
}

Both these variables are always truthy. I think correct version is (:load-macros opts true) instead of using or in this case unless it is intentionally written this way to "disable" :load-macros/:analyze-deps options.



 Comments   
Comment by Mike Fikes [ 04/Mar/16 3:01 PM ]

Revised binding forms and added tests.

Comment by David Nolen [ 11/Mar/16 1:59 PM ]

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





[CLJS-1593] Self-host: Munged minus macro Created: 25/Feb/16  Updated: 11/Apr/17

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

Type: Defect Priority: Trivial
Reporter: Mike Fikes Assignee: Unassigned
Resolution: Unresolved Votes: 1
Labels: bootstrap

Attachments: Text File 0001-CLJS-1593-only-return-a-var-when-we-re-looking-for-a.patch    
Patch: Code

 Description   

In bootstrap, the macro form of cljs.core/- is evidently available as _ so, for example

(_ 7 3)
works.

Repro:

cljs.user=> (require 'cljs.js)
nil
cljs.user=> (cljs.js/eval-str (cljs.js/empty-state)
  "(_ 7 3)" nil {:eval cljs.js/js-eval :context :expr} identity)
{:ns cljs.user, :value 4}


 Comments   
Comment by Erik Assum [ 07/Apr/17 4:29 PM ]

So, in self-hosted (at least) the munged names are available, you can see this for `+` as well

cljs.user=> (_PLUS_ 4 4)
8
(in-ns 'cljs.js)
nil
cljs.js=> (compile-str (empty-state) "(+ 4 4)" nil identity)
{:value "((4) + (4));\n"}
cljs.js=> (compile-str (empty-state) "(_PLUS_ 4 4)" nil identity)
{:value "((4) + (4));\n"}
cljs.js=>

With a special `ns-interns**` as

(defn ns-interns**
  "Bootstrap only."
  [sym]
  (let [ns-obj (find-ns-obj sym)
        ns     (Namespace. ns-obj sym)]
    (letfn [(step [ret k]
              (let [var-sym (symbol k #_(demunge k))] ;; not demunging the key
                (assoc ret
                  var-sym (Var. #(gobject/get ns-obj k)
                            (symbol (str sym) (str var-sym)) {:ns ns}))))]
      (reduce step {} (js-keys ns-obj)))))

you see that `-` is stored under `_`, e.g. the munged name in the ns-object

cljs.core=> (get (ns-interns** 'cljs.core$macros) '_)
#'cljs.core$macros/_
cljs.core=>
Comment by Mike Fikes [ 11/Apr/17 8:00 AM ]

Interestingly, the patch works for cljs.core/- but it doesn't seem to completely work for new symbols defined in cljs.user, if I'm interpreting this correctly:

cljs.user=> (require 'cljs.js)
true
cljs.user=> (def st (cljs.js/empty-state))
#'cljs.user/st
cljs.user=> (cljs.js/eval st '(def foo-bar 17) {:eval cljs.js/js-eval :context :expr} identity)
{:value 17}
cljs.user=> (cljs.js/eval st 'foo_bar {:eval cljs.js/js-eval :context :expr} identity)
WARNING: Use of undeclared Var cljs.user/foo_bar
{:value 17}
Comment by Erik Assum [ 11/Apr/17 3:05 PM ]

Yep

cljs.user=> (def foo-bar 17)
#'cljs.user/foo-bar
cljs.user=> foo_bar
            ^
WARNING: Use of undeclared Var cljs.user/foo_bar at line 1
17
cljs.user=>

Don't remember the details now, but the way I got to fixing the minus was by the code-path which
tries to figure out macros, IIRC.

I guess I'll have to look at the code-path which resolves normal symbols as well.





[CLJS-1592] Self-host: Robustness for core tests Created: 25/Feb/16  Updated: 16/Jun/17  Resolved: 18/Mar/16

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

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

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

 Description   

There are a couple minor things that can be improved in the core tests which facilitates running them in bootstrapped environments:

1. Restore *print-newline*
2. Add a little more order robustness for hash-based collections

Will attach patch for consideration.



 Comments   
Comment by David Nolen [ 18/Mar/16 1:38 PM ]

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





[CLJS-1589] Self-host: case fail with nil test Created: 25/Feb/16  Updated: 11/Mar/16  Resolved: 11/Mar/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-1589.patch    
Patch: Code and Test

 Description   

(case 1 nil nil :x) will fail in bootstrap:

(require 'cljs.js)
(cljs.js/eval-str (cljs.js/empty-state)
"(case 1 nil nil :x)" nil {:eval cljs.js/js-eval :context :expr} identity)

produces

{:error #error {:message "Could not eval ", :data {:tag :cljs/analysis-error}, :cause #error {:message "Cannot read property 'length' of null at line 1 ", :data {:file nil, :line 1, :column 1, :tag :cljs/analysis-error}, :cause #object[TypeError TypeError: Cannot read property 'length' of null]}}}

The root cause is that, in ClojureScript char? throws if passed nil, while this is not the case in Clojure, and the case macro ultimately does this here:

https://github.com/clojure/clojurescript/blob/e531c34e04adc815a6c25c8d2499465296ca290d/src/main/clojure/cljs/core.cljc#L2143

So, an aspect to ponder is whether to change char? or just conditionally fnil the bit of code for :cljs.



 Comments   
Comment by Mike Fikes [ 27/Feb/16 4:24 PM ]

While you could perhaps argue that char? should return false if passed any non-char value, the attached CLJS-1589.patch is perhaps the most conservative way to address the issue, by conditioanlly nil-patching the affected call site.

Note: This patch adds tests for bootstrap and there already exists coverage for non-bootstrap: https://github.com/clojure/clojurescript/blob/f58dcdf4dc37ef52d4eb1e2b7c994282bf6351f5/src/test/cljs/cljs/core_test.cljs#L1979-L1990

Comment by David Nolen [ 11/Mar/16 2:52 PM ]

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





[CLJS-1588] Self-host: satisfies? on defrecord instance Created: 24/Feb/16  Updated: 25/Apr/16  Resolved: 25/Apr/16

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

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

Attachments: Text File CLJS-1588-2.patch     Text File CLJS-1588-3.patch     Text File CLJS-1588.patch    
Patch: Code and Test

 Description   

If you define a record satisfying a protocol, satisfies? doesn't return true:

$ script/noderepljs 
ClojureScript Node.js REPL server listening on 51714
To quit, type: :cljs/quit
cljs.user=> (require 'cljs.js)
nil
cljs.user=> (def st (cljs.js/empty-state))
#'cljs.user/st
cljs.user=> (cljs.js/eval-str st
"(defrecord Foo [x] IComparable (-compare [_ o] (compare x (.-x o))))" 
nil {:eval cljs.js/js-eval :context :expr} identity)
{:ns cljs.user, :value cljs.user/Foo}
cljs.user=> (cljs.js/eval-str st
"(satisfies? IComparable (Foo. 1))"
nil {:eval cljs.js/js-eval :context :expr} identity)
{:ns cljs.user, :value false}


 Comments   
Comment by Mike Fikes [ 24/Feb/16 3:34 PM ]

High-level analysis:

Using :repl-verbose, you can see this as part of being emitted.

this.cljs$lang$protocol_mask$partition0$ = 2229667594;
this.cljs$lang$protocol_mask$partition1$ = 10240;

If you compare the same for bootstrap, and do a diff, ignoring gensym diffs, you see

this.cljs$lang$protocol_mask$partition0$ = -2065299702;
this.cljs$lang$protocol_mask$partition1$ = 0;

Both of first integers is the same hex value 0x84E6070A, but evidently in the bootstrapped implementation it is being interpreted and emitted as as 2's complement 32-bit value. My hunch is that this is at the root of the issue.

Comment by Mike Fikes [ 24/Feb/16 5:36 PM ]

The root cause is that, in the definition of fast-path-protocols, bit-shift-left is being used until 2147483648 (which is 0x80000000) is reached. In Clojure (bit-shift-left 1 31) yields this integer, but in ClojureScript, since the underlying host arithmetic is 32-bit 2's complement, this yields -2147483648. The specific number being produced is important because == is used in that definition. The fix is to simply use multiplication by 2 instead.

This results in the second line in the protocol mask numbers to match the one produced in JVM ClojureScript (10240 instead of 0, prior to the fix):

this.cljs$lang$protocol_mask$partition0$ = -2065299702;
this.cljs$lang$protocol_mask$partition1$ = 10240;

Presumably this is the important aspect, with the first number being OK as it is equivalent with respect to bit mask operations.

The production code change is a single switch from (core/bit-shift-left b 1) to the equivalent (for the purposes of setting up fast-path-protocols), (core/* 2 b). Also, a good thing is that this definition is not in a critical perf path (it is a def).

Comment by David Nolen [ 26/Feb/16 1:43 PM ]

This one gives me pause, I think we should conditionalize this one for now. I think for ClojureScript we also want to clamp to 32bits by bit-or'ing with 0.

Comment by Mike Fikes [ 26/Feb/16 3:38 PM ]

CLJS-1588-2.patch conditionalizes.

Here is it working in JVM ClojureScript:

$ script/noderepljs 
ClojureScript Node.js REPL server listening on 55658
To quit, type: :cljs/quit
cljs.user=> (defrecord Foo [x] IComparable (-compare [_ o] (compare x (.-x o))))
cljs.user/Foo
cljs.user=> (satisfies? IComparable (Foo. 1))
true

I don't think we can clamp (bit-or with zero), as this causes it to go back to a negative number (here using int to do the bit-or-with-zero op):

cljs.user=> (* 2 (Math/pow 2 30))
2147483648
cljs.user=> (int (* 2 (Math/pow 2 30)))
-2147483648

With clamping with int the self host unit test fails, but without it it passes.

Here is the relevant new expression reference:

[p #?(:clj  (core/bit-shift-left b 1)
      :cljs (core/* 2 b))]))
Comment by Francis Avila [ 26/Feb/16 4:39 PM ]

I think David may be suggesting that the bitfield should be coerced to signed-int on both jvm and js?

For example, the following code:

(iterate (fn [[p b]]
             (if (== (unchecked-int 0x80000000) b)
               [(inc p) 1]
               [p (unchecked-int (bit-shift-left b 1))]))
    [0 1])

However this does not work in clojurescript because unchecked-int is broken there (and the macro version is curiously missing, too).

Another option is to use only 31 bits.

Comment by Mike Fikes [ 24/Apr/16 10:35 AM ]

The previously attached patch no longer applies to master. Attaching an update CLJS-1588-3.patch which has the same production code changes, but instead puts the unit test in the regular test suite.

This new test (which is much easier to read!) will fail without the production change via script/test-self-parity in this way:

FAIL in (test-records) (at cljs.test.js:414:14)
Testing records
expected: (satisfies? IComparable (->FooComparable 1))
  actual: false
Comment by David Nolen [ 25/Apr/16 6:19 AM ]

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





[CLJS-1586] Self-host: No duplicate key error Created: 23/Feb/16  Updated: 26/Feb/16  Resolved: 26/Feb/16

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

Type: Defect Priority: Minor
Reporter: Mike Fikes Assignee: Unassigned
Resolution: Not Reproducible Votes: 0
Labels: bootstrap


 Description   

If you evaluate a set or map with duplicate keys, no error is caused as is normally done:

$ script/noderepljs 
ClojureScript Node.js REPL server listening on 54226
To quit, type: :cljs/quit
cljs.user=> (require 'cljs.js)
nil
cljs.user=> (cljs.js/eval-str (cljs.js/empty-state)
  "#{1 1}" nil {:eval cljs.js/js-eval :context :expr} identity)
{:ns cljs.user, :value #{1}}
cljs.user=> (cljs.js/eval-str (cljs.js/empty-state)
  "{1 1 1 2}" nil {:eval cljs.js/js-eval :context :expr} identity)
{:ns cljs.user, :value {1 2}}


 Comments   
Comment by Mike Fikes [ 23/Feb/16 10:46 AM ]

Appears to be upstream: http://dev.clojure.org/jira/browse/TRDR-35





[CLJS-1585] Self-host: Alias-scoped keywords Created: 22/Feb/16  Updated: 23/Feb/16  Resolved: 23/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-1585-2.patch     Text File CLJS-1585-3.patch     Text File CLJS-1585.patch    
Patch: Code and Test

 Description   

If you use an alias-scoped keyword, it is not expanded properly in bootstrapped ClojureScript.

A concrete working example in a REPL of this concept:

cljs.user=> (require '[clojure.string :as string])
nil
cljs.user=> ::string/bar
:clojure.string/bar

Here is a minimal repo showing that expansion doesn't properly occur with self-host:

Evaluate these forms in script/noderepljs:

(require 'cljs.js)

(def st (cljs.js/empty-state))

(cljs.js/eval-str st
  "(ns alpha.core (:require [foo.core :as foo]))"
  nil
  {:ns      'cljs.user
   :context :expr
   :eval    cljs.js/js-eval
   :load    (fn [_ cb]
              (cb {:lang :clj :source "(ns foo.core)"}))}
  identity)

(cljs.js/eval-str st
  "::foo/bar"
  nil
  {:ns      'alpha.core
   :context :expr
   :eval    cljs.js/js-eval}
  identity)

That last form produces:

{:ns alpha.core, :value :foo/bar}

It is expected to instead produce:

{:ns alpha.core, :value :foo.core/bar}


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

Bind cljs.tools.reader/*alias-map* so that alias-scoped keywords expand properly. Simply pass in the :requires map from the compiler state for the current namespace.

Comment by Mike Fikes [ 23/Feb/16 9:25 AM ]

Attached CLJS-1585-2.patch to cleanly apply to master.

Note, if the patch in CLJS-1577 has already been applied, then, owing to some nearby edits a three-way patch will apply cleanly:

git am -3 CLJS-1585-2.patch

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

Attached CLJS-1585-3.patch, revised to apply cleanly.

Comment by David Nolen [ 23/Feb/16 3:15 PM ]

fixed https://github.com/clojure/clojurescript/commit/7f7b647be0bc32de56772a9f5eb9d86998197287





[CLJS-1584] Self-host: core/str error with condp Created: 22/Feb/16  Updated: 23/Feb/16  Resolved: 23/Feb/16

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

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

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

 Description   
cljs.user=> (cljs.js/eval-str (cljs.js/empty-state)
"(condp = 1)" nil {:eval cljs.js/js-eval :context :expr} identity)
WARNING: No such namespace: core, could not locate core.cljs, core.cljc, or Closure namespace "" at line 1 
WARNING: Use of undeclared Var core/str at line 1 
{:error #error {:message "ERROR", :data {:tag :cljs/analysis-error}, :cause #object[ReferenceError ReferenceError: core is not defined]}}

Analysis:
The condp macro uses core/str in a syntax-quote context, while every other place it appears that cljs.core/str is used in that context.



 Comments   
Comment by Andrea Richiardi [ 22/Feb/16 10:57 PM ]

I confirm it works.

Testing with Node

Testing self-host.test

Ran 7 tests containing 45 assertions.
0 failures, 0 errors.
$ g ln | head -1
* bf5e075 (HEAD -> master) CLJS-1584: Self-host: core/str error with condp
Comment by Mike Fikes [ 23/Feb/16 8:11 AM ]

Attached CLJS-1584-2.patch with revisions to apply cleanly to master.

Comment by David Nolen [ 23/Feb/16 8:15 AM ]

fixed https://github.com/clojure/clojurescript/commit/2023353d635578a0666a50c3305bf92347185646





[CLJS-1580] Self-host: goog.provide offsets source-maps Created: 18/Feb/16  Updated: 19/Feb/16  Resolved: 19/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-1580.patch    
Patch: Code

 Description   

If you use cljs.js to load code with source maps enabled, a goog.provide is emitted without accounting for its effects on source map lines.

To reproduce using source/noderepljs evaluate these forms:

(require 'cljs.js)

(def st (cljs.js/empty-state))

(cljs.js/eval-str st
  "(ns foo.core (:require bar.core))"
  nil
  {:eval       (fn [{:keys [source]}]
                 (println source))
   :context    :expr
   :load       (fn [_ cb] (cb {:lang   :clj
                               :source "(ns bar.core)\n(def a 3)"}))
   :source-map true}
  identity)

(get-in @st [:source-maps 'bar.core])

In addition to seeing that for bar.core code is generated starting with these lines:

goog.provide("bar.core");
bar.core.a = (3);

you will see that (via the get-in call) the source map info for bar.core/a is off by one (being listed as being on JavaScript source line 0 instead of line 1):

{0 {0 [{:line 1, :col 0, :name nil} {:line 1, :col 0, :name nil}], 5 [{:line 1, :col 5, :name "bar.core/a"}]}}

(Note the 0 at the beginning of this map; it should be 1.)



 Comments   
Comment by Mike Fikes [ 18/Feb/16 7:39 PM ]

With the attached patch, the correct source map info is generated:

{1 {0 [{:line 1, :col 0, :name nil} {:line 1, :col 0, :name nil}], 5 [{:line 1, :col 5, :name "bar.core/a"}]}}

(Note the 1 as the key for this map.)

Comment by David Nolen [ 19/Feb/16 12:34 PM ]

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





[CLJS-1577] Self-host: syntax-quote resolves on dot forms Created: 18/Feb/16  Updated: 23/Feb/16  Resolved: 23/Feb/16

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

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

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

 Description   

In Clojure or ClojureScript, if you evaluate a form involving syntax-quote of a dot form, the instance member / field, is not resolved. For example, in ClojureScript,

`(.x o)

yields

(.x cljs.user/o)

With bootstrap ClojureScript, the .x symbol is resolved, resulting in /x:

$ script/noderepljs
ClojureScript Node.js REPL server listening on 55080
To quit, type: :cljs/quit
cljs.user=> (require 'cljs.js)
nil
cljs.user=> (cljs.js/eval-str (cljs.js/empty-state)
"`(.x o)" nil {:eval cljs.js/js-eval :context :expr} identity)
{:ns cljs.user, :value (/x cljs.user/o)}

Note: See TRDR-34 . I've also confirmed that

(defn- resolve-symbol
  [sym]
  (if (string/starts-with? (str sym) ".")
    sym
    (ana/resolve-symbol sym)))

if used in cljs.js in lieu of binding ana/resolve-symbol actually fixes this particular ticket (but it isn't clear if this is a hack that doesn't cover all bases or is misplaced in some way).



 Comments   
Comment by Mike Fikes [ 23/Feb/16 8:47 AM ]

Attached revised CLJS-1577-2.patch to apply cleanly to master.

Comment by David Nolen [ 23/Feb/16 2:53 PM ]

fixed https://github.com/clojure/clojurescript/commit/22a2692c9fcbae7a002ddedc088e50c7c2cbccfe





[CLJS-1576] cljs.js sourcemap support throws on non-latin1 characters Created: 17/Feb/16  Updated: 01/Oct/17  Resolved: 01/Oct/17

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

Type: Defect Priority: Major
Reporter: Matt Huebert Assignee: Matt Huebert
Resolution: Completed Votes: 0
Labels: bootstrap

Attachments: Text File CLJS-1576-2017-rebased.patch     Text File CLJS-1576-2.patch     Text File CLJS-1576.patch     Text File CLJS-1576.patch     Text File CLJS-1576-rebased.patch    
Patch: Code

 Description   

In cljs.js/append-source-map we encode the source-map string in base64 without escaping non-latin1 characters. In Chrome, this throws the error: "DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range."

Source: https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/js.cljs#L152

The problem & a couple of solutions are explained here: https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_Unicode_Problem



 Comments   
Comment by David Nolen [ 18/Feb/16 8:21 AM ]

Can bootstrapped users apply this and verify it works for them? Thanks.

Comment by Mike Fikes [ 18/Feb/16 10:03 AM ]

I tried this with Planck and I can confirmed that, with a function name in Japanese, sourceMappingURL does indeed change and then includes base-64 data that covers my entire set of functions (whereas previously it did not), but the Japanese function name appears to have been munged into some Latin-1 characters (which I suppose is the point of the patch).

With Planck, I can't confirm the overall functionality as Planck doesn't make use of this information with JavaScriptCore (it instead uses equivalent info stored in map files).

So, as far as I can tell, this patch is good in that it appears to be doing the right thing when run with the bootstrap compiler.

Comment by David Nolen [ 18/Mar/16 1:45 PM ]

OK, patch looks ok to me but it needs to be rebased to master.

Comment by Matt Huebert [ 21/Jul/16 7:06 AM ]

Same patch but rebased to master

Comment by David Nolen [ 22/Jul/16 7:28 AM ]

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

Comment by Matt Huebert [ 14/Aug/17 6:02 AM ]

After further use of source-mapping with files that contain unicode values, I discovered two bugs in my previous patch: we need to apply js/encodeURIComponent to the string first, and string/replace should have been passed a function as a second argument.

I have a patch ready to upload, and also pushed a repo with examples here where I test this against many unicode values / emoticons: https://github.com/mhuebert/base64-encrypt-test/blob/master/src/app/core.cljs

These btoa errors don't show up in non-browser environments so I don't see any existing test environment that would catch this stuff.

Comment by Matt Huebert [ 14/Aug/17 6:05 AM ]

New patch adding js/encodeURIComponent and fixed args to string/replace

Comment by Matt Huebert [ 01/Oct/17 7:02 AM ]

Rebased 2017 patch to master

Comment by David Nolen [ 01/Oct/17 10:03 AM ]

fixed https://github.com/clojure/clojurescript/commit/9778b34d9e988a28c64133c4751d235bbbd3e966





[CLJS-1573] Self-host: Invalid UTF escaping in cljs-in-cljs Created: 15/Feb/16  Updated: 23/Feb/16  Resolved: 23/Feb/16

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

Type: Defect Priority: Minor
Reporter: Nikita Beloglazov Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap

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

 Description   

Evaluating following "clojurescript" string produces invalid "javascript" string:
"90°" => "90\ub0"
Correct string is "90\u00b0"

Also the character escaped correctly when compiling using regular jvm-based compiler.

Repro in script/noderepljs:

cljs.user=> (require 'cljs.js)
nil
cljs.user=> (cljs.js/eval-str (cljs.js/empty-state) 
  "\"90°\"" nil {:eval cljs.js/js-eval :context :expr} identity)
{:error #error {:message "ERROR", :data {:tag :cljs/analysis-error}, :cause #object[SyntaxError SyntaxError: Unexpected token ILLEGAL]}}
cljs.user=> (cljs.js/compile-str (cljs.js/empty-state)
"\"90°\"" nil {:context :expr} identity)
{:value "\"90\\ub0\""}


 Comments   
Comment by Mike Fikes [ 20/Feb/16 3:31 PM ]

The underlying problem is that the self-hosted compiler was not zero-padding \u characters to be 4 nybbles long.

Comment by David Nolen [ 23/Feb/16 7:53 AM ]

fixed https://github.com/clojure/clojurescript/commit/16666f37cc13ead5a66330046db82a2976b6f1f0

Comment by Mike Fikes [ 23/Feb/16 9:48 AM ]

Confirmed fixed downstream with Planck:

cljs.user=> "90°"
"90°"





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

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

Type: Defect Priority: Minor
Reporter: Yehonathan Sharvit Assignee: David Nolen
Resolution: Completed Votes: 0
Labels: bootstrap, bug

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

 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.


Steps to reproduce:

1. Make a directory, say CLJS-1565
2. Copy shipping cljs.jar into the directory
3. Make an index.html, src/hello_world/core.cljs, and build.clj file with contents as below.
4. java -cp cljs.jar:src clojure.main build.clj
5. Open index.html with Chrome and view the JavaScriptConsole in Chrome.

index.html:

<html>
    <body>
        <script type="text/javascript" src="out/main.js"></script>
    </body>
</html>

src/hello_world/core.cljs:

(ns hello-world.core
  (:require cljs.js))

(enable-console-print!)

(println "Hello world!")

build.clj:

(require 'cljs.build.api)

(cljs.build.api/build "src"
  {:output-to "out/main.js"
   :optimizations :whitespace})

(System/exit 0)


 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.

Comment by Mike Fikes [ 09/Feb/16 10:18 PM ]

If generating single-file (in particular :whitespace) output for a
project that makes use of cljs.js, it is possible for the concatenated
file to have cljs.js appear prior to cljs.core$macros, and thus cause
a dependency issue when loading the file. This is a consequence of the
fact that the cljs.closure.JavaScriptFile compiled output for cljs.js
doesn't specify cljs.core$macros macros as a dependency.

There are already a few places where the cljs.core$macros dependency is
patched in. The attached patch factors out a bit of that logic and adds
it to another needed place.

This patch addresses the immediate issue encountered in the description.
But there is also another issue that you can see while compiling
(step 4 in the repro included in the description) that needs to be dealt
with by also applying the patch in CLJS-1541.

Yehonathan, if you get a chance, please confirm if the patch attached
to this ticket along with the patch in CLJS-1541, combined, resolve
your issue.

Comment by Yehonathan Sharvit [ 11/Feb/16 4:50 PM ]

Mike, it works fine with the two patches.
When will they be merge into cljs source?

Comment by Mike Fikes [ 11/Feb/16 5:15 PM ]

Thanks for confirming Yehonathan! Validation and merging is handled by David.

Comment by David Nolen [ 12/Feb/16 2:19 PM ]

fixed https://github.com/clojure/clojurescript/commit/22c10ba8304a8e3f6da9a903042ce1a09f03e370





[CLJS-1564] Self-host: cached macro *loaded* update Created: 07/Feb/16  Updated: 23/Feb/16  Resolved: 23/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-1564-2.patch     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.

Comment by David Nolen [ 12/Feb/16 2:35 PM ]

Bizarrely when I apply this one to master I get reader errors. Can anyone else reproduce this?

Comment by Mike Fikes [ 12/Feb/16 10:32 PM ]

I can't repo any reader errors. I applied it against master, and ran through the stuff in the ticket description, ran the self-host test, and the regular tests, and everything appeared normal for me. (This was against 1.8.2.)

Comment by Mike Fikes [ 23/Feb/16 8:38 AM ]

Attached revised CLJS-1564-2.patch which fixes new test interference issue on master (over-use of foo.core namespace in the tests).

Comment by David Nolen [ 23/Feb/16 2:50 PM ]

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





[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-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-1541] Self-host: Cannot require 'cljs.js using cljs.jar Created: 10/Jan/16  Updated: 12/Feb/16  Resolved: 12/Feb/16

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

Type: Defect Priority: Minor
Reporter: Mike Fikes Assignee: David Nolen
Resolution: Completed 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}
Comment by Mike Fikes [ 12/Feb/16 1:35 PM ]

Confirmed fixed on master using script/uberjar and, with the resulting cljs.jar and Node:

$ java -jar cljs.jar -m cljs.repl.node
ClojureScript Node.js REPL server listening on 54597
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}
Comment by David Nolen [ 12/Feb/16 2:12 PM ]

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





[CLJS-1522] Self-host: Update parameters on root *load-fn* / *eval-fn* Created: 23/Dec/15  Updated: 24/Apr/16  Resolved: 24/Apr/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: Declined Votes: 0
Labels: bootstrap

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

 Description   

There are root functions set up for the dynamic vars *load-fn* and *eval-fn*, but the named parameters on those dynamic vars reflect earlier versions of the code, prior to the values being updated to being maps. This ticket asks the names to be updated in order to avoid confusing any developers that may derive meaning from the parameter names.



 Comments   
Comment by Mike Fikes [ 24/Apr/16 12:06 PM ]

Will coalesce into a larger patch with similar changes.





[CLJS-1521] Self-host: Macro namespaces cannot be aliased Created: 23/Dec/15  Updated: 23/Feb/16  Resolved: 23/Feb/16

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

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

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

 Description   

If, for example, you employ code like

(ns cljs.user (:require-macros [foo.core :as foo]))

you cannot successfully invoke macros in the foo.core namespace using the alias foo.

Will supply a battery of unit tests that exercise various ways in which you can make use of macros and in those tests, the ones involving alias will fail without the patch.



 Comments   
Comment by Mike Fikes [ 23/Dec/15 9:25 PM ]

Attached patch fixes things so you can use namespace aliases when invoking macros in bootstrapped ClojureScript.

Comment by Andrea Richiardi [ 23/Dec/15 9:53 PM ]

I will try it in replumb for issue 108.

Comment by Mike Fikes [ 24/Dec/15 8:26 AM ]

CLJS-1521-2.patch contains the same content as CLJS-1521.patch but moves a form so it can be applied with the patch in CLJS-1515.

Comment by Andrea Richiardi [ 24/Dec/15 7:18 PM ]

I applied the patch locally with replumb and I reciprocate the LGTM (while before it was failing).

...:~/git/replumb (cljs-1.7.202 $=)$ rlwrap lein node-repl
...
cljs.user=> (ns my.namespace (:require-macros [foo.bar.baz :as f]))
nil
my.namespace=> (f/mul-baz 10 20)
200
Comment by Nikita Beloglazov [ 20/Feb/16 3:21 PM ]

This patch also fixes similar problem with (:require [foo.core :as foo :include-macros true]) described in https://groups.google.com/forum/#!topic/clojurescript/ya0-38K4WVU

Comment by David Nolen [ 23/Feb/16 7:57 AM ]

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





[CLJS-1515] Self-host: Allow :file key in cljs.js/*load-fn* callback Created: 17/Dec/15  Updated: 11/Aug/16  Resolved: 11/Aug/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: 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     Text File CLJS-1515-6.patch     Text File CLJS-1515-7.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

Comment by Andrea Richiardi [ 14/Feb/16 9:17 PM ]

Reapplied and re-tested. Works

Testing with Node

Testing self-host.test

Ran 8 tests containing 47 assertions.
0 failures, 0 errors.
Comment by Andrea Richiardi [ 10/Aug/16 7:07 PM ]

All self-test pass!

Comment by David Nolen [ 11/Aug/16 8:11 AM ]

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





[CLJS-1512] Self-host: arithmetic form meta missing :numeric Created: 13/Dec/15  Updated: 14/Dec/15  Resolved: 14/Dec/15

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

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

Attachments: Text File CLJS-1512.patch    

 Description   

If you analyze (+ 1 1) in bootstrap, you won't get :numeric true in the form-meta in analyze-js-star*.

In regular ClojureScript, you'll get:

{:js-op cljs.core/+, :numeric true}

but in bootstrap, you'll get:

{:js-op cljs.core/+}

You can see this as well if you look at the Analysis section of David's "ClojureScript Next" blog post, where you get :numeric nil in the AST rather than :numeric true.

One consequence is that :invalid-arithmetic analysis diagnostics won't be emitted in bootstrapped environments.



 Comments   
Comment by Mike Fikes [ 13/Dec/15 8:46 PM ]

Analysis: In cljs.analyzer/macroexpand-1*, the mac-var is obtained and its meta is checked for :cljs.analyzer/numeric. The problem is that this is a cljs.core/Var obtained from the findInternedVar method on cljs.core/Namespace, which slaps on a degenerate var-meta with the map

{:ns this}

If I add some code to print the var, I get #'cljs.core$macros/, and at the Planck REPL (and presumably all bootstrapped REPLs), if I evaluate meta #'cljs.core$macros/, I see that the desired :cljs.analyzer/numeric is present.

I think that perhaps I can instead add a :cljs conditional branch to this code to try to fish the meta out of the compiler metadata.

Comment by David Nolen [ 14/Dec/15 2:15 PM ]

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





[CLJS-1509] Self-host: cljs.analyzer/load-mutex Object should be :clj Created: 11/Dec/15  Updated: 14/Dec/15  Resolved: 14/Dec/15

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

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

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

 Description   

cljs.analyzer/load-mutex constructs a Java Object, which should be conditionally only done for :clj.



 Comments   
Comment by Mike Fikes [ 11/Dec/15 1:33 PM ]

Attached patch passes unit tests and script/test-self-host and locally mvn installed ClojureScript JAR is consumable downstream in bootstrap project (Planck) w/o causing warnings to be emitted regarding Object.

Comment by Mike Fikes [ 14/Dec/15 4:22 PM ]

Was fixed with https://github.com/clojure/clojurescript/commit/452edf43927566cc0ea0a3846706c0294cef235d





[CLJS-1504] Self-host: Pseudo-namespace for macro namespace analysis metadata Created: 06/Dec/15  Updated: 07/Dec/15  Resolved: 07/Dec/15

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

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

Attachments: Text File CLJS-1504-v1.patch    

 Description   

Background: A pseudo-name is used for macro namespaces (involving a "$macros" suffix, codified in cljs.analyzer/macro-ns-name).

There is a line that conditionally converts to this pseudo-name when a macro namespace is being required:

https://github.com/clojure/clojurescript/blob/r1.7.189/src/main/cljs/cljs/js.cljs#L220

But, that line has a simple typo: The keyword should be :macros-ns See its proper use a few lines down here:

https://github.com/clojure/clojurescript/blob/r1.7.189/src/main/cljs/cljs/js.cljs#L226

Simply correcting this typo is alone insufficient because the undecorated name is expected in places, such as the ns->relpath on this line:

https://github.com/clojure/clojurescript/blob/r1.7.189/src/main/cljs/cljs/js.cljs#L233

But, by introducing another symbol to hold the pseudo-name for use in the state when used in [::ana/namespaces ns] constructs, analysis metadata for macro namespaces is properly placed in the state, and things like the caching feature begins to work correctly for macro namespaces, and probably other behavior that depends on this becomes correct (perhaps reloading, etc.)



 Comments   
Comment by Mike Fikes [ 07/Dec/15 2:13 PM ]

Attached a "v1" patch that illustrates fixing the typo along with what I suspect is necessary to accommodate its consequences.

Comment by David Nolen [ 07/Dec/15 2:20 PM ]

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





[CLJS-1478] Self-host: Allow static-fns opt Created: 02/Nov/15  Updated: 03/Nov/15  Resolved: 03/Nov/15

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: bootstrap

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

 Description   

Allow clients of cljs.js to specify that static fns be emitted.

This should be surfaced via support for a :static-fns key in the opts compilation options parameter that exists on the various public API functions.



 Comments   
Comment by Mike Fikes [ 02/Nov/15 10:37 AM ]

Rough design: Bind cljs.analyzer/*cljs-static-fns* in the appropriate scopes in cljs.js (defaulting to false if :static-fns key not supplied in opts).

Comment by Mike Fikes [ 03/Nov/15 8:16 AM ]

Attached patch with unit tests.

Comment by Mike Fikes [ 03/Nov/15 8:17 AM ]

Oops. Attached incorrect patch. (Attaching correct CLJS-1478.patch now.)

Comment by David Nolen [ 03/Nov/15 12:34 PM ]

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





[CLJS-1476] Self-host: Protocol prefixing broken for three- (or more) segment namespaces Created: 29/Oct/15