<!--
RSS generated by JIRA (4.4#649-r158309) at Wed Jun 19 02:28:35 CDT 2013

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary add field=key&field=summary to the URL of your request.
For example:
http://dev.clojure.org/jira/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?jqlQuery=project+%3D+CLJS+AND+resolution+%3D+Unresolved+AND+fixVersion+is+EMPTY+ORDER+BY+priority+DESC&tempMax=1000&field=key&field=summary
-->
<!-- If you wish to do custom client-side styling of RSS, uncomment this:
<?xml-stylesheet href="http://dev.clojure.org/jira/styles/jiraxml2html.xsl" type="text/xsl"?>
-->
<rss version="0.92">
    <channel>
        <title>Clojure JIRA</title>
        <link>http://dev.clojure.org/jira/secure/IssueNavigator.jspa?reset=true&amp;jqlQuery=project+%3D+CLJS+AND+resolution+%3D+Unresolved+AND+fixVersion+is+EMPTY+ORDER+BY+priority+DESC</link>
        <description>An XML representation of a search request</description>
                <language>en-us</language>
                        <issue start="0" end="97" total="97"/>
                <build-info>
            <version>4.4</version>
            <build-number>649</build-number>
            <build-date>25-07-2011</build-date>
        </build-info>
<item>
            <title>[CLJS-77] Add support for Closure defines</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-77</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The Closure compiler has &quot;--define&quot; which allows you to set some library values at compile time. The settable values are annotated with &quot;@define&quot;: &lt;a href=&quot;https://code.google.com/closure/compiler/docs/js-for-compiler.html&quot;&gt;https://code.google.com/closure/compiler/docs/js-for-compiler.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The particular values I was interested in were goog.dom.ASSUME_{QUIRKS,STANDARDS}_MODE because it would save some code and runtime computation if the rendering mode is known at compile time. (It turns out to be very minor for my tiny test program, but probably more substantial for things that use more of the Closure library.) goog.DEBUG also seems useful to tweak.&lt;/p&gt;

&lt;p&gt;The attached patch supports a new compile option :define, along with a map from keys/strings to values. The Closure compiler takes a -&lt;del&gt;define option like: &quot;&lt;/del&gt;-define=&apos;goog.DEBUG=false&apos;&quot;. In ClojureScript, this would be {:define {&quot;goog.DEBUG&quot; false}} or {:define {:goog.DEBUG false}}.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14635">CLJS-77</key>
            <summary>Add support for Closure defines</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="jli">John Li</reporter>
                        <labels>
                    </labels>
                <created>Sun, 18 Sep 2011 22:31:11 -0500</created>
                <updated>Thu, 31 May 2012 16:32:42 -0500</updated>
                                                                            <due></due>
                    <votes>2</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27622" author="kmicu" created="Thu, 26 Jan 2012 11:26:07 -0600"  >&lt;p&gt;Benefits:&lt;br/&gt;
Better support for mobile (Android, iOS, iPad) development in ClojureScript.&lt;/p&gt;

&lt;p&gt;Problem:&lt;br/&gt;
Please add support for passing &quot;--define&quot; option to compiler.jar.&lt;br/&gt;
With this we can optimize code performance where only mobile browsers are our target.&lt;/p&gt;

&lt;p&gt;Resources:&lt;br/&gt;
goog.userAgent global props: &lt;a href=&quot;http://closure-library.googlecode.com/svn/docs/closure_goog_useragent_useragent.js.html&quot;&gt;http://closure-library.googlecode.com/svn/docs/closure_goog_useragent_useragent.js.html&lt;/a&gt;&lt;br/&gt;
goog.userAgent.product global props: &lt;a href=&quot;http://closure-library.googlecode.com/svn/docs/closure_goog_useragent_product.js.html&quot;&gt;http://closure-library.googlecode.com/svn/docs/closure_goog_useragent_product.js.html&lt;/a&gt;&lt;br/&gt;
&quot;java -jar compiler.jar --help&quot; for all available options &lt;br/&gt;
Google Closure Definitive Guide at Google Books: &lt;a href=&quot;http://books.google.pl/books?id=p7uyWPcVGZsC&quot;&gt;http://books.google.pl/books?id=p7uyWPcVGZsC&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;clojurescript/src/clj/cljs/closure.clj: functions &quot;make-options&quot; and &quot;set-options&quot;&lt;/p&gt;

&lt;p&gt;&quot;TODO: Add any other options that we would like to support.&quot;&lt;br/&gt;
(defn set-options&lt;br/&gt;
  &quot;TODO: Add any other options that we would like to support.&quot;&lt;br/&gt;
  &lt;span class=&quot;error&quot;&gt;&amp;#91;opts ^CompilerOptions compiler-options&amp;#93;&lt;/span&gt;&lt;br/&gt;
  (when (contains? opts :pretty-print)&lt;br/&gt;
    (set! (.prettyPrint compiler-options) (:pretty-print opts)))&lt;br/&gt;
  (when (contains? opts :print-input-delimiter)&lt;br/&gt;
    (set! (.printInputDelimiter compiler-options)&lt;br/&gt;
      (:print-input-delimiter opts))))&lt;br/&gt;
(defn make-options&lt;br/&gt;
  &quot;Create a CompilerOptions object and set options from opts map.&quot;&lt;br/&gt;
  &lt;span class=&quot;error&quot;&gt;&amp;#91;opts&amp;#93;&lt;/span&gt;&lt;br/&gt;
  (let [level (case (:optimizations opts)&lt;br/&gt;
                    :advanced CompilationLevel/ADVANCED_OPTIMIZATIONS&lt;br/&gt;
                    :whitespace CompilationLevel/WHITESPACE_ONLY&lt;br/&gt;
                    :simple CompilationLevel/SIMPLE_OPTIMIZATIONS)&lt;br/&gt;
        compiler-options (doto (CompilerOptions.)&lt;br/&gt;
                           (.setCodingConvention (ClosureCodingConvention.)))]&lt;br/&gt;
    (do (.setOptionsForCompilationLevel level compiler-options)&lt;br/&gt;
        (set-options opts compiler-options)&lt;br/&gt;
        compiler-options)))&lt;/p&gt;</comment>
                    <comment id="28668" author="superbobry" created="Thu, 31 May 2012 15:22:20 -0500"  >&lt;p&gt;One more usecase, I&apos;ve stumbled upon, while wrapping &lt;tt&gt;goog.i18n&lt;/tt&gt;, here&apos;s a line from &lt;tt&gt;goog/base.js:59&lt;/tt&gt;: &lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;/**
 * @define {string} LOCALE defines the locale being used &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; compilation. It is
 * used to select locale specific data to be compiled in js binary. BUILD rule
 * can specify &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; value by &lt;span class=&quot;code-quote&quot;&gt;&quot;--define goog.LOCALE=&amp;lt;locale_name&amp;gt;&quot;&lt;/span&gt; as JSCompiler
 * option.&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So, without &lt;tt&gt;--define&lt;/tt&gt; it&apos;s simply impossible to create i18n apps with ClojureScript and Closure Library.&lt;/p&gt;</comment>
                    <comment id="28669" author="superbobry" created="Thu, 31 May 2012 16:32:42 -0500"  >&lt;p&gt;Attached patch doesn&apos;t work with the latest master.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10368" name="define.diff" size="1396" author="jli" created="Sun, 18 Sep 2011 22:31:11 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-364] compiler needs to put all args of an invocation after 20 into an array-seq</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-364</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This ticket is related to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-359&quot; title=&quot;`with-meta` does not work on function objects&quot;&gt;&lt;del&gt;CLJS-359&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15651">CLJS-364</key>
            <summary>compiler needs to put all args of an invocation after 20 into an array-seq</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 29 Aug 2012 10:17:16 -0500</created>
                <updated>Wed, 29 Aug 2012 20:35:42 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-365] apply needs to put all args after the 20th into an array seq</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-365</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This ticket is related to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-359&quot; title=&quot;`with-meta` does not work on function objects&quot;&gt;&lt;del&gt;CLJS-359&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15652">CLJS-365</key>
            <summary>apply needs to put all args after the 20th into an array seq</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 29 Aug 2012 10:17:43 -0500</created>
                <updated>Wed, 29 Aug 2012 20:36:00 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-299] PersistentVector push-tail, do-assoc, pop-tail should not contain recursive calls</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-299</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This prevents V8 inlining. Lazlo&apos;s earlier experiments seemed to suggest ~30% gain.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15510">CLJS-299</key>
            <summary>PersistentVector push-tail, do-assoc, pop-tail should not contain recursive calls</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Mon, 4 Jun 2012 08:27:49 -0500</created>
                <updated>Fri, 31 Aug 2012 09:04:24 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29166" author="michalmarczyk" created="Wed, 15 Aug 2012 06:17:09 -0500"  >&lt;p&gt;Here&apos;s a patch which eliminates recursion in all the fns mentioned in the ticket name.&lt;/p&gt;

&lt;p&gt;I haven&apos;t done much in the way of measuring the impact on perf; a naive benchmark of (assoc huge-vector 123 :foo) seems to indicate a modest perf gain (a few percent shaved off the runtime).&lt;/p&gt;

&lt;p&gt;Note that whether pop-tail as implemented in this patch is an improvement over the previous version is not that clear, since it needs to precalculate the level at which the main loop should terminate. Careful measurements will be necessary. (I wouldn&apos;t be surprised if the difference turned out to be unmeasurable, in which case I guess we needn&apos;t bother with the change.)&lt;/p&gt;

&lt;p&gt;push-tail and do-assoc have no such problems &amp;#8211; all the work being done needs to be done (and is now done in a non-recursive fashion).&lt;/p&gt;

&lt;p&gt;Hm... Actually that probably means this patch should be split in two (pop-tail &amp;amp; rest). I&apos;ll get around to that soon.&lt;/p&gt;

&lt;p&gt;More importantly, some benchmarks for large data structures should be added (assoc / conj of 32 items (at any rate, a large enough number of items for the tail to be pushed in) / repeated pops (again, enough to pop the tail)). (&quot;Large&quot; here means &quot;large enough for the shift of the vector to grow at least to 10&quot;, meaning size &amp;gt; 1024 + 32; shift 15 would be better, requiring size &amp;gt; 32768 + 32.)&lt;/p&gt;</comment>
                    <comment id="29205" author="dnolen" created="Fri, 17 Aug 2012 00:36:39 -0500"  >&lt;p&gt;Awesome! Lets split the patch in two.&lt;/p&gt;</comment>
                    <comment id="29207" author="michalmarczyk" created="Fri, 17 Aug 2012 04:23:57 -0500"  >&lt;p&gt;Ok. Here&apos;s a new patch which eliminates recursion in push-tail and do-assoc. I guess the large data structure benchmarks should probably get in first &amp;#8211; see &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-357&quot; title=&quot;Large PersistentVector benchmarks&quot;&gt;&lt;del&gt;CLJS-357&lt;/del&gt;&lt;/a&gt; (some benchmarks already attached &amp;#8211; could use some scrutiny in case they&apos;re not exercising what they should be; initial runs indicate a very modest speedup).&lt;/p&gt;

&lt;p&gt;I&apos;ll give pop-tail a little more thought and write a new patch for it sometime soon too. (Perhaps worth pointing out is that the zlvl precalculation in the current version of the pop-tail patch doesn&apos;t need to traverse any nodes &amp;#8211; it&apos;s all bit twiddling &amp;#8211; so it should be pretty cheap... I guess we&apos;ll see what the benchmarks say &amp;#8211; I haven&apos;t actually ran them on this code yet.)&lt;/p&gt;</comment>
                    <comment id="29298" author="dnolen" created="Wed, 29 Aug 2012 20:44:18 -0500"  >&lt;p&gt;So how did the benchmarks turn out for these?&lt;/p&gt;</comment>
                    <comment id="29317" author="dnolen" created="Fri, 31 Aug 2012 09:04:24 -0500"  >&lt;p&gt;I applied and ran these benchmarks using the lasted V8. These don&apos;t seem to make any difference. Perhaps V8 no longer has issues with the recursive cases? I didn&apos;t test beyond running the benchmark script. Might be worth getting something up on JSPerf.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11439" name="0001-CLJS-299-eliminate-recursive-calls-in-PV-s-push-tail.patch" size="2864" author="michalmarczyk" created="Fri, 17 Aug 2012 04:23:57 -0500" />
                    <attachment id="11430" name="0001-CLJS-299-eliminate-recursive-calls-in-PV-s-push-tail.patch" size="4301" author="michalmarczyk" created="Wed, 15 Aug 2012 06:17:09 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-113] Allow colon as whitespace in map literals</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-113</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15080">CLJS-113</key>
            <summary>Allow colon as whitespace in map literals</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="stu">Stuart Halloway</reporter>
                        <labels>
                    </labels>
                <created>Sun, 18 Dec 2011 08:10:32 -0600</created>
                <updated>Tue, 24 Apr 2012 07:40:36 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28252" author="gfredericks" created="Tue, 24 Apr 2012 07:40:36 -0500"  >&lt;p&gt;Will this change cause strings like &quot;{\&quot;foo\&quot; :true}&quot; to have ambiguous parses? And if we want CLJS to be a superset of JSON do we need to parse &quot;null&quot; as well?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-327] Backend agnostic repl infrastructure</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-327</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This enhancement is about changing some names and docs in the repl infrastructure, so that it is backend agnostic.&lt;/p&gt;

&lt;p&gt;The code is already backend agnostic, so the only changes that were needed are about references to Javascript.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15555">CLJS-327</key>
            <summary>Backend agnostic repl infrastructure</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="raph_amiard">Rapha&#235;l AMIARD</reporter>
                        <labels>
                    </labels>
                <created>Mon, 25 Jun 2012 15:33:51 -0500</created>
                <updated>Tue, 26 Jun 2012 11:34:52 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28905" author="dnolen" created="Tue, 26 Jun 2012 11:34:52 -0500"  >&lt;p&gt;Thanks! Did you verify that browser REPL continues to function properly?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11348" name="backend-agnostic-repl.patch" size="10220" author="raph_amiard" created="Mon, 25 Jun 2012 15:33:51 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-345] clojure.reflect support for Rhino REPL</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-345</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;clojure.reflect should work for the Rhino REPL&lt;/p&gt;</description>
                <environment></environment>
            <key id="15597">CLJS-345</key>
            <summary>clojure.reflect support for Rhino REPL</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 25 Jul 2012 14:34:45 -0500</created>
                <updated>Wed, 25 Jul 2012 14:34:45 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-240] Warning under advanced compilation about incorrect protocol implementation signatures</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-240</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15411">CLJS-240</key>
            <summary>Warning under advanced compilation about incorrect protocol implementation signatures</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sat, 5 May 2012 21:15:46 -0500</created>
                <updated>Sat, 5 May 2012 21:15:46 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-150] Regular expressions don&apos;t support Javascript mode flags</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-150</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Currently, the compiler and cljs.core allow for Java mode flags.  Javascript doesn&apos;t support many of these, and supports one flag not supported by Java - &apos;g&apos;.&lt;/p&gt;

&lt;p&gt;ClojureScript regular expressions should support only Javascript regex mode flags: &apos;i&apos;, &apos;m&apos;, and &apos;g&apos;.  This applies to Regex literals in the compiler as well as (re-pattern).&lt;/p&gt;

&lt;p&gt;This is a defect in the implementation of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-116&quot; title=&quot;Make re-pattern accept modifiers too&quot;&gt;&lt;del&gt;CLJS-116&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15226">CLJS-150</key>
            <summary>Regular expressions don&apos;t support Javascript mode flags</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="bobby">Bobby Calderwood</assignee>
                                <reporter username="bobby">Bobby Calderwood</reporter>
                        <labels>
                    </labels>
                <created>Thu, 16 Feb 2012 11:21:02 -0600</created>
                <updated>Thu, 16 Feb 2012 15:33:59 -0600</updated>
                                                                            <due>Fri, 24 Feb 2012 00:00:00 -0600</due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27729" author="dnolen" created="Thu, 16 Feb 2012 15:33:59 -0600"  >&lt;p&gt;The defect existed prior to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-116&quot; title=&quot;Make re-pattern accept modifiers too&quot;&gt;&lt;del&gt;CLJS-116&lt;/del&gt;&lt;/a&gt;. The problem is that we&apos;re using the Clojure reader and g is not a valid flag for a Java RegexPattern. &lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-246] Use protocol mask test in protocol fns</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-246</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This is a performance win on many browsers.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jsperf.com/direct-vs-chain/8&quot;&gt;http://jsperf.com/direct-vs-chain/8&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15422">CLJS-246</key>
            <summary>Use protocol mask test in protocol fns</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 9 May 2012 11:25:43 -0500</created>
                <updated>Sun, 17 Jun 2012 21:28:02 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28425" author="michalmarczyk" created="Thu, 10 May 2012 13:11:35 -0500"  >&lt;p&gt;See &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-247&quot; title=&quot;possible protocol dispatch performance enhancement&quot;&gt;CLJS-247&lt;/a&gt; for comments relevant to this patch.&lt;/p&gt;</comment>
                    <comment id="28428" author="dnolen" created="Thu, 10 May 2012 15:30:31 -0500"  >&lt;p&gt;Not seeing much of a perf benefit from this, though Michal reports differently. More investigation is needed.&lt;/p&gt;</comment>
                    <comment id="28842" author="dnolen" created="Sun, 17 Jun 2012 12:14:43 -0500"  >&lt;p&gt;patch no longer applies. I wonder if I see bad behavior because I was testing with node or it was prior to the fixes around avoiding deoptimization.&lt;/p&gt;</comment>
                    <comment id="28852" author="michalmarczyk" created="Sun, 17 Jun 2012 21:28:02 -0500"  >&lt;p&gt;I&apos;ll bring it up to date with the recent changes, thanks for the prod!&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11187" name="0001-CLJS-246-have-protocol-methods-check-bitmasks-for-fa.patch" size="2405" author="michalmarczyk" created="Thu, 10 May 2012 13:11:35 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-247] possible protocol dispatch performance enhancement</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-247</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;We could at the call site do the bit test and call directly? Otherwise, call the slow path? Implications for code size, but perhaps this could be a flag for people who really want the performance?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15423">CLJS-247</key>
            <summary>possible protocol dispatch performance enhancement</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Thu, 10 May 2012 11:10:41 -0500</created>
                <updated>Wed, 23 May 2012 09:57:22 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28420" author="dnolen" created="Thu, 10 May 2012 11:19:23 -0500"  >&lt;p&gt;flag might be:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;:inline-protocol-fns &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="28421" author="michalmarczyk" created="Thu, 10 May 2012 11:57:41 -0500"  >&lt;p&gt;No switch in this version &amp;#8211; will add one if it seems it&apos;s worth it.&lt;/p&gt;

&lt;p&gt;With this applied, core-advanced-test.js grows in size to 360301 bytes from 357528 bytes on current master.&lt;/p&gt;</comment>
                    <comment id="28423" author="michalmarczyk" created="Thu, 10 May 2012 12:31:13 -0500"  >&lt;p&gt;This does seem to be a perf win on both :simple and :advanced, by the way.&lt;/p&gt;</comment>
                    <comment id="28424" author="michalmarczyk" created="Thu, 10 May 2012 13:09:46 -0500"  >&lt;p&gt;Reattaching the patch to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-246&quot; title=&quot;Use protocol mask test in protocol fns&quot;&gt;CLJS-246&lt;/a&gt;. Will get back to this.&lt;/p&gt;</comment>
                    <comment id="28510" author="dnolen" created="Thu, 17 May 2012 13:33:34 -0500"  >&lt;p&gt;After some discussion with Rich this is definitely a direction we should pursue. It&apos;s very similar to what Clojure currently does.&lt;/p&gt;</comment>
                    <comment id="28516" author="dnolen" created="Thu, 17 May 2012 21:29:45 -0500"  >&lt;p&gt;I went ahead and tried this, &lt;a href=&quot;http://github.com/clojure/clojurescript/compare/master...cljs-247-protocol-fn-call-sites&quot;&gt;http://github.com/clojure/clojurescript/compare/master...cljs-247-protocol-fn-call-sites&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Code size is not very different 364k vs 373k for compiling all of the tests.&lt;/p&gt;

&lt;p&gt;This is not going to be faster given our use of satisfies? I noticed that if we removed the satisfies? calls this is a performance win. &lt;/p&gt;

&lt;p&gt;Problem: If a symbol passes a satisfies? it would be nice if we could tag it as satisfying the protocol and just emit the protocol dispatch directly. However this would not work for JavaScript primitives.&lt;/p&gt;</comment>
                    <comment id="28518" author="dnolen" created="Fri, 18 May 2012 00:40:16 -0500"  >&lt;p&gt;Looks like I spoke a bit too soon &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt; There was a typo in the branch. The performance improvement between this and master is small for V8, but measurable for SpiderMonkey and JavaScriptCore.&lt;/p&gt;

&lt;p&gt;Also, we could do the satisfies? optimization such that it works for JS natives with a simple gensymed mutable local around the callsite.&lt;/p&gt;</comment>
                    <comment id="28572" author="dnolen" created="Wed, 23 May 2012 09:56:34 -0500"  >&lt;p&gt;K for handling natives simply tagging the symbol is not enough. We need to set a runtime gensymed flag that denotes whether it&apos;s a fast path protocol call. We can then avoid any redundants tests in the true branch of satisfies? and emit code like the following:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;fast-path-flag ? foo.cljs$lang$Protocol$bar$arity0$(x) : cljs.core.Protocol.bar[goog.typeOf(x)](x);&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-374] satisfies? produces strange code when the protocol is not in the fast-path list</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-374</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15679">CLJS-374</key>
            <summary>satisfies? produces strange code when the protocol is not in the fast-path list</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Thu, 6 Sep 2012 20:27:44 -0500</created>
                <updated>Thu, 6 Sep 2012 20:27:44 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-344] clojure.reflect is asynchronous (should use CrossPageChannel)</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-344</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This makes printing at the REPL a bit annoying. We should be using the CrossPageChannel and not a ajax request to the built in webserver.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15596">CLJS-344</key>
            <summary>clojure.reflect is asynchronous (should use CrossPageChannel)</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 25 Jul 2012 14:33:52 -0500</created>
                <updated>Mon, 8 Oct 2012 17:24:49 -0500</updated>
                                                                            <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29347" author="bbloom" created="Mon, 3 Sep 2012 15:36:56 -0500"  >&lt;p&gt;Was this ticket supposed to be filed against Clojure, not ClojureScript?&lt;/p&gt;</comment>
                    <comment id="29348" author="dnolen" created="Mon, 3 Sep 2012 15:51:32 -0500"  >&lt;p&gt;No. This ticket refers to the HackerSchool work to provide a reflection hook for ClojureScript to make the REPL interactions more friendly. Look at clojure.reflect in the ClojureScript repo.&lt;/p&gt;</comment>
                    <comment id="29617" author="franks" created="Mon, 8 Oct 2012 16:55:55 -0500"  >&lt;p&gt;As we&apos;ve changed the topic of this issue a little bit..., I&apos;d like to add the additional requirement that the reflection facility should be pluggable, meaning that if I have additional help/reflection functions that I want to make available to the cljs-repl users, then I should not have to wait for acceptance in a new clojurescript version.&lt;/p&gt;

&lt;p&gt;Maybe some form of registration API thru which I can add new cljs-functions that communicate with their clj-counterparts thru some naming convention &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/help_16.gif&quot; height=&quot;16&quot; width=&quot;16&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;. Not sure about the details here...&lt;/p&gt;</comment>
                    <comment id="29619" author="dnolen" created="Mon, 8 Oct 2012 17:06:19 -0500"  >&lt;p&gt;That&apos;s really a separate issue that probably warrants it&apos;s own discussion.&lt;/p&gt;</comment>
                    <comment id="29620" author="franks" created="Mon, 8 Oct 2012 17:24:49 -0500"  >&lt;p&gt;Well... you started to add the (seemingly unrelated) CrossPageChannel requirement to the asynchronous one &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/wink.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;

&lt;p&gt;But seriously, the pluggability requirement is probably important to keep in mind when any implementation for asynchronous clojure/reflect is designed and implemented - I&apos;ll open-up another issue for pluggability to keep it clean.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-404] Automate Browser REPL testing</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-404</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;It&apos;s worth investigating Selenium, PhantomJS, etc. as solutions to sanity check the Browser REPL when we run the other tests.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15771">CLJS-404</key>
            <summary>Automate Browser REPL testing</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Tue, 23 Oct 2012 16:01:48 -0500</created>
                <updated>Tue, 23 Oct 2012 16:01:48 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-399] Lazy initialize global-hierarchy</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-399</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Depends on extend-instance &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-398&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-398&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First patch backs atoms by a protocol IPlace and implements reset! and swap! and compare-and-set! only with protocols&lt;/p&gt;

&lt;p&gt;Second patch uses extend-instance to implement global-hierarchy a custom lazy atom&lt;/p&gt;

&lt;p&gt;In effect, multimethods and hierarchies can be omitted by gclosure, taking 1K off of hello world&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://groups.google.com/d/topic/clojure/LNfJRw07u8I/discussion&quot;&gt;https://groups.google.com/d/topic/clojure/LNfJRw07u8I/discussion&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15760">CLJS-399</key>
            <summary>Lazy initialize global-hierarchy</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                    </labels>
                <created>Fri, 19 Oct 2012 01:14:55 -0500</created>
                <updated>Tue, 23 Oct 2012 18:54:37 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29704" author="dnolen" created="Fri, 19 Oct 2012 17:18:32 -0500"  >&lt;p&gt;The protocol should probably just be called IAtom. A note, changing atoms to go through protocols has performance implications - generally protocol fns are about twice as slow as regular fns.&lt;/p&gt;

&lt;p&gt;I&apos;ll take a closer look.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11577" name="0001-Atoms-fully-backed-by-protocols-introduces-clojure.c.patch" size="2556" author="bendlas" created="Fri, 19 Oct 2012 01:14:55 -0500" />
                    <attachment id="11576" name="0002-Lazy-initialize-global-hierarchy.patch" size="1430" author="bendlas" created="Fri, 19 Oct 2012 01:14:55 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-410] support ^:expose annotation</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-410</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(def ^:export m 1)
(defn foo [g]
  (g m))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Because of constant propagation GClosure may replace m in foo with 1. It may be better to for :export to implicitly :expose but we need to check the output.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://developers.google.com/closure/compiler/docs/js-for-compiler&quot;&gt;http://developers.google.com/closure/compiler/docs/js-for-compiler&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15788">CLJS-410</key>
            <summary>support ^:expose annotation</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 28 Oct 2012 14:51:10 -0500</created>
                <updated>Sun, 28 Oct 2012 14:51:10 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-145] Cannot create more than one browser evaluation environment</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-145</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When testing multi-user applications, it may be desirable to run multiple browser-connected REPLs from the same Clojure process. Currently, the socket connection for the browser-connected REPL is stored in a global atom, so it is not possible to create multiple browser-connected REPLs on different ports.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15205">CLJS-145</key>
            <summary>Cannot create more than one browser evaluation environment</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="stuart.sierra">Stuart Sierra</reporter>
                        <labels>
                    </labels>
                <created>Mon, 6 Feb 2012 14:43:06 -0600</created>
                <updated>Fri, 7 Dec 2012 08:57:21 -0600</updated>
                                                                            <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-109] Compiler errors/warnings should be displayed when cljs namespace &apos;package&apos; names start with an unacceptable javascript symbol.</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-109</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Clojurescript namespaces are extremely flexible. The generated javascript symbol names are not. ie:&lt;/p&gt;

&lt;p&gt;cljs:&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;code&amp;#93;&lt;/span&gt;&lt;br/&gt;
(ns canvas.context.2d)&lt;/p&gt;

&lt;p&gt;(defn ^:export create-image-data&lt;br/&gt;
  (&lt;span class=&quot;error&quot;&gt;&amp;#91;canvas image-data&amp;#93;&lt;/span&gt; (.createImageData image-data))&lt;br/&gt;
  (&lt;span class=&quot;error&quot;&gt;&amp;#91;canvas sw sh&amp;#93;&lt;/span&gt; (.createImageData canvas sw sh)))&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;/code&amp;#93;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;generated js:&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;code&amp;#93;&lt;/span&gt;&lt;br/&gt;
goog.provide(&apos;canvas.context.2d&apos;);&lt;br/&gt;
goog.require(&apos;cljs.core&apos;);&lt;br/&gt;
canvas.context.2d.create_image_data = (function() {&lt;br/&gt;
var create_image_data = null;&lt;br/&gt;
var create_image_data__2432 = (function (canvas,image_data){
return image_data.createImageData();
});&lt;br/&gt;
var create_image_data__2433 = (function (canvas,sw,sh){
return canvas.createImageData(sw,sh);
});&lt;br/&gt;
create_image_data = function(canvas,sw,sh){&lt;br/&gt;
switch(arguments.length){
case  2 :
return create_image_data__2432.call(this,canvas,sw);
case  3 :
return create_image_data__2433.call(this,canvas,sw,sh);
}&lt;br/&gt;
throw(&apos;Invalid arity: &apos; + arguments.length);&lt;br/&gt;
};&lt;br/&gt;
return create_image_data;&lt;br/&gt;
})()&lt;br/&gt;
;&lt;br/&gt;
goog.exportSymbol(&apos;canvas.context.2d.create_image_data&apos;, canvas.context.2d.create_image_data);&lt;span class=&quot;error&quot;&gt;&amp;#91;/code&amp;#93;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Note&lt;/b&gt; the symbol name &quot;canvas.context.2d.create_image_data&quot;. Because of the &quot;2d&quot; namespace name, the javascript generated is invalid.&lt;/p&gt;

&lt;p&gt;This can simply be resolved by renaming the namespace but some notification to the developer during the compilation stage should help avoid unnecessary problems.&lt;/p&gt;</description>
                <environment>OSX 10.7</environment>
            <key id="15036">CLJS-109</key>
            <summary>Compiler errors/warnings should be displayed when cljs namespace &apos;package&apos; names start with an unacceptable javascript symbol.</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bjconlan">Benjamin Conlan</reporter>
                        <labels>
                    </labels>
                <created>Tue, 29 Nov 2011 06:43:48 -0600</created>
                <updated>Fri, 31 Aug 2012 09:40:24 -0500</updated>
                                                                            <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="27519" author="wagjo" created="Mon, 9 Jan 2012 14:59:04 -0600"  >&lt;p&gt;I had a similar problem when my namespace contained a word &lt;b&gt;class&lt;/b&gt;, e.g. in namespace:&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(ns foo.bar.class)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Advanced closure compiler produced an error treating &lt;b&gt;class&lt;/b&gt; as a JS keyword.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-335] user defined tagged literals in CLJS</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-335</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I&apos;m trying to make my own tagged literals for cljs, and its a rough scene. I&apos;ve probably spend 15 hours trying to get this to work properly.&lt;/p&gt;

&lt;p&gt;The quick hack of binding &lt;b&gt;cljs-data-readers&lt;/b&gt; is a pretty bad solution, and doesn&apos;t work with cljsbuild. &lt;/p&gt;

&lt;p&gt;One solution is to just copy the mechanism of data_readers.clj, instead calling it cljs_data_readers.clj. That would help.&lt;/p&gt;

&lt;p&gt;A better solution is to just pass through all the tagged literals, and resolve them on the cljs side, eg `((cljs.core/get (cljs.core/deref cljs.reader/&lt;b&gt;tag-table&lt;/b&gt;) ~tag) ~data))&lt;/p&gt;

&lt;p&gt;That way the definition of the tags doesn&apos;t have to be repeated twice, as is done now (once in cljs.reader, and once in the clj-side cljs.tagged-literals) . &lt;/p&gt;

&lt;p&gt;The problem with this is that clj itself is incapable of passing through undefined tags without exploding, which is also a near showstopper. Having something like cljs_data_readers.clj would get the job done in the meantime.&lt;/p&gt;

&lt;p&gt;(another minor issue is that the cljs reader doesn&apos;t handle namespaced symbols, so in #a/b, b is what is used as the key into &lt;b&gt;cljs-data-readers&lt;/b&gt;)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15572">CLJS-335</key>
            <summary>user defined tagged literals in CLJS</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="kovasb">kovas boguta</reporter>
                        <labels>
                    </labels>
                <created>Fri, 6 Jul 2012 00:51:02 -0500</created>
                <updated>Tue, 25 Dec 2012 13:30:55 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28957" author="kovasb" created="Fri, 6 Jul 2012 00:52:03 -0500"  >&lt;p&gt;I&apos;ve never used this before, so just assume everything in bold has earmuffs around it.&lt;/p&gt;</comment>
                    <comment id="29306" author="dnolen" created="Thu, 30 Aug 2012 19:38:20 -0500"  >&lt;p&gt;This seems like a lot of separate issues rolled into one. Can we break this ticket apart into simpler actionable tickets?&lt;/p&gt;</comment>
                    <comment id="30239" author="kovasb" created="Sat, 15 Dec 2012 22:35:34 -0600"  >&lt;p&gt;Now that we have &lt;b&gt;default-data-reader-fn&lt;/b&gt;, its possible to have a clean fix. Just set &lt;b&gt;default-data-reader-fn&lt;/b&gt; to the function described above.&lt;/p&gt;

&lt;p&gt;Should I generate a patch?&lt;/p&gt;
</comment>
                    <comment id="30276" author="dnolen" created="Fri, 21 Dec 2012 16:58:40 -0600"  >&lt;p&gt;What function defined above?&lt;/p&gt;</comment>
                    <comment id="30320" author="kovasb" created="Tue, 25 Dec 2012 13:30:55 -0600"  >&lt;p&gt;the function is &lt;br/&gt;
(fn &lt;span class=&quot;error&quot;&gt;&amp;#91;tag data&amp;#93;&lt;/span&gt; `((cljs.core/get (cljs.core/deref cljs.reader/&lt;b&gt;tag-table&lt;/b&gt;) ~tag) ~data))&lt;/p&gt;

&lt;p&gt;The proposal is to bind &lt;b&gt;default-data-reader-fn&lt;/b&gt; to the above, in compiler.clj for the compile-file* function. And get rid of the binding for &lt;b&gt;data-readers&lt;/b&gt; in that function as well. &lt;/p&gt;

&lt;p&gt;It should be possible to get rid of the tagged_literals.clj file as well, since those definitions are no longer needed after this change.&lt;/p&gt;
</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-5] Compiler should emit optional source maps</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-5</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;== New Notes ==&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/&quot;&gt;http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source map support will be landing in Chrome in 6 weeks.&lt;/p&gt;

&lt;p&gt;== Old Notes ==&lt;/p&gt;

&lt;p&gt;Google&apos;s debugging tooling consists of at least these two big pieces:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;The `--create_source_map` compiler flag, which generates a table mapping source JS to compiled JS&lt;/li&gt;
	&lt;li&gt;The &lt;span class=&quot;error&quot;&gt;&amp;#91;Closure Inspector&amp;#93;&lt;/span&gt;(&lt;a href=&quot;http://code.google.com/closure/compiler/docs/inspector.html&quot;&gt;http://code.google.com/closure/compiler/docs/inspector.html&lt;/a&gt;), a Firefox plugin that uses the source maps to provide error messages pointing to original code instead of compiled code&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Open Questions&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;What does integrating with Closure Inspector look like?&lt;/li&gt;
	&lt;li&gt;Can we use code from gclosure to generate our own cljs &#65533;&#65533;&#65533; compiled JS mappings?&lt;/li&gt;
	&lt;li&gt;Would we need to modify Closure Inspector?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Imported from github issue #31&lt;/p&gt;</description>
                <environment></environment>
            <key id="14498">CLJS-5</key>
            <summary>Compiler should emit optional source maps</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="3" iconUrl="http://dev.clojure.org/jira/images/icons/status_inprogress.gif">In Progress</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="-1">None</reporter>
                        <labels>
                    </labels>
                <created>Wed, 24 Jun 2020 00:00:00 -0500</created>
                <updated>Sat, 22 Dec 2012 16:29:56 -0600</updated>
                                                                            <due></due>
                    <votes>4</votes>
                        <watches>4</watches>
                        <comments>
                    <comment id="28084" author="dnolen" created="Fri, 6 Apr 2012 15:03:11 -0500"  >&lt;p&gt;There&apos;s a patch for Clojure, here &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-960&quot; title=&quot;Capture :column metadata (needed for ClojureScript source maps)&quot;&gt;&lt;del&gt;CLJ-960&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Related, &lt;a href=&quot;https://github.com/brandonbloom/clojurescript/compare/clojure:master...brandonbloom:track-pos&quot;&gt;https://github.com/brandonbloom/clojurescript/compare/clojure:master...brandonbloom:track-pos&lt;/a&gt; &lt;/p&gt;</comment>
                    <comment id="28674" author="dnolen" created="Fri, 1 Jun 2012 08:49:05 -0500"  >&lt;p&gt;wip here &lt;a href=&quot;http://github.com/clojure/clojurescript/tree/source-map&quot;&gt;http://github.com/clojure/clojurescript/tree/source-map&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28693" author="dnolen" created="Sun, 3 Jun 2012 11:03:19 -0500"  >&lt;p&gt;Related ticket (tracking line &amp;amp; col during emission) that was resolved - &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-176&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-176&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="26601" author="chouser@n01se.net" created="Wed, 24 Jun 2020 00:00:00 -0500"  >&lt;p&gt;Later&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-436] defn missing arg vector gives error about max</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-436</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15873">CLJS-436</key>
            <summary>defn missing arg vector gives error about max</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Thu, 6 Dec 2012 08:17:05 -0600</created>
                <updated>Sat, 8 Dec 2012 18:13:17 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30179" author="dnolen" created="Thu, 6 Dec 2012 10:09:53 -0600"  >&lt;p&gt;The issue is actually a bit subtle for example:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defn foo &lt;span class=&quot;code-quote&quot;&gt;&quot;name&quot;&lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;is valid Clojure - however this doesn&apos;t work in ClojureScript. In this case ClojureScript generates the following:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;function () {
    &lt;span class=&quot;code-keyword&quot;&gt;switch&lt;/span&gt; (arguments.length) {
    }
    &lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; (&lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; Error(&lt;span class=&quot;code-quote&quot;&gt;&quot;Invalid arity: &quot;&lt;/span&gt; + arguments.length));
}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="30181" author="dnolen" created="Thu, 6 Dec 2012 10:19:31 -0600"  >&lt;p&gt;After talking to Rich the above really should not compile.&lt;/p&gt;</comment>
                    <comment id="30190" author="michalmarczyk" created="Sat, 8 Dec 2012 18:09:47 -0600"  >&lt;p&gt;Here&apos;s a patch with the fn&amp;#42; validations I could think of. It seems to cause the compilation time to increase by a measurable amount, which I find quite surprising (even though it&apos;s to be expected that there will be quite of few fn&amp;#42; forms in CLJS sources). I&apos;d love to know if it&apos;s just on my box (let&apos;s hope so). If validations really have that sort of effect, I&apos;m thinking about refactoring the analyser so that they can be turned on (which should also be the default) and off (for particularly fast compilations).&lt;/p&gt;</comment>
                    <comment id="30191" author="michalmarczyk" created="Sat, 8 Dec 2012 18:11:51 -0600"  >&lt;p&gt;Ah, wait, there&apos;s a minor typo in the commit message, I&apos;ll fix it in a second...&lt;/p&gt;</comment>
                    <comment id="30192" author="michalmarczyk" created="Sat, 8 Dec 2012 18:13:17 -0600"  >&lt;p&gt;...um, no there isn&apos;t. Sorry for the confusion.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11753" name="0001-CLJS-436-validate-arguments-to-fn-forms.patch" size="1716" author="michalmarczyk" created="Sat, 8 Dec 2012 18:09:47 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-433] Throw error when user tries to use wrong syntax for multiple arity functions in extend-type</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-433</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Right now it allows to mix declarations, sometimes allowing an illegal syntax (-nth shouldn&apos;t be allowed in the following example)&lt;/p&gt;

&lt;p&gt;example from jayq: &lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(extend-type js/jQuery

  IIndexed
  (-nth [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; n] ...)
  (-nth [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; n not-found] ...)

  ILookup
  (-lookup
    ([&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; k] ...)
    ([&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; k not-found] ...))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; 

&lt;p&gt;It already throws an error with some protocols such as IFn, but not for all of them.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15865">CLJS-433</key>
            <summary>Throw error when user tries to use wrong syntax for multiple arity functions in extend-type</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="mpenet">Max Penet</reporter>
                        <labels>
                    </labels>
                <created>Thu, 29 Nov 2012 16:20:05 -0600</created>
                <updated>Thu, 29 Nov 2012 16:20:05 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-375] loop doesn&apos;t seem to preserve tag information as evidenced by extra cljs.core.truth_ calls</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-375</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15680">CLJS-375</key>
            <summary>loop doesn&apos;t seem to preserve tag information as evidenced by extra cljs.core.truth_ calls</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Thu, 6 Sep 2012 20:33:14 -0500</created>
                <updated>Thu, 6 Sep 2012 20:33:14 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-456] Function named same as ns fails</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-456</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;In a fresh script/repljs on clojurescript master I see the following behaviour:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;ClojureScript:cljs.user&amp;gt; (ns foo.bar)
ClojureScript:foo.bar&amp;gt; (defn id [x] x)
#&amp;lt;
  function id(x) {
      &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; x;
  }
  &amp;gt;
  ClojureScript:foo.bar&amp;gt; (defn foo [] (id 42))
  #&amp;lt;
  function foo() {
      &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; foo.bar.id.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;, 42);
  }
  &amp;gt;
ClojureScript:foo.bar&amp;gt; (foo)
  &lt;span class=&quot;code-quote&quot;&gt;&quot;Error evaluating:&quot;&lt;/span&gt; (foo) :as &lt;span class=&quot;code-quote&quot;&gt;&quot;foo.bar.foo.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;)&quot;&lt;/span&gt;
  org.mozilla.javascript.EcmaError: TypeError: Cannot read property &lt;span class=&quot;code-quote&quot;&gt;&quot;id&quot;&lt;/span&gt; from undefined (&amp;lt;cljs repl&amp;gt;#4)
      at &amp;lt;cljs repl&amp;gt;:4 (foo)
      at &amp;lt;cljs repl&amp;gt;:4 (anonymous)
      at &amp;lt;cljs repl&amp;gt;:4
 
nil
ClojureScript:foo.bar&amp;gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;(&lt;a href=&quot;https://www.refheap.com/paste/8494&quot;&gt;https://www.refheap.com/paste/8494&lt;/a&gt; in case formatting fails)&lt;/p&gt;
</description>
                <environment></environment>
            <key id="15960">CLJS-456</key>
            <summary>Function named same as ns fails</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="jonase">Jonas Enlund</reporter>
                        <labels>
                    </labels>
                <created>Sun, 13 Jan 2013 12:29:30 -0600</created>
                <updated>Mon, 14 Jan 2013 16:33:19 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-449] stack traces for ex-info</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-449</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Currently, ex-info exceptions have no stack traces, which makes them.. much less useful.&lt;/p&gt;

&lt;p&gt;Attached patch (0001-hack-ex-info-stacktraces.patch) is one hackish way of getting stack traces back when Error.captureStackTrace is available (at least in Chrome, presumably in Node as well).&lt;/p&gt;

&lt;p&gt;But this seems unacceptable &#8212; all the stuff emitted for the deftype (making the constructor print as a type) gets overwritten.&lt;/p&gt;

&lt;p&gt;Is there a better way?&lt;/p&gt;

&lt;p&gt;Will this maybe be made irrelevant by source maps?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15917">CLJS-449</key>
            <summary>stack traces for ex-info</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tomoj">Tom Jack</reporter>
                        <labels>
                    </labels>
                <created>Sun, 23 Dec 2012 02:34:44 -0600</created>
                <updated>Sun, 23 Dec 2012 16:01:39 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="30309" author="dnolen" created="Sun, 23 Dec 2012 11:51:08 -0600"  >&lt;p&gt;Isn&apos;t the stack trace recoverable from the original exception?&lt;/p&gt;</comment>
                    <comment id="30312" author="tomoj" created="Sun, 23 Dec 2012 16:01:39 -0600"  >&lt;p&gt;I hadn&apos;t considered that. If a cause is provided, that seems reasonable. The only trouble is that you still have to know where the ExceptionInfo is being thrown, so that you can catch it and throw the cause. Chrome&apos;s debugger would make it easy to at least find where the ExceptionInfo is thrown, but it&apos;s still more trouble than having the appropriate stack trace directly on the ExceptionInfo.&lt;/p&gt;

&lt;p&gt;If no cause is provided, of course that won&apos;t work. But I suppose one could write (ex-info msg data (js/Error.)) instead of (ex-info msg data)? Personally, I don&apos;t expect to pass a cause very often &#8212; I expect the binary arity to be much more common in my cljs libraries.&lt;/p&gt;

&lt;p&gt;If we rely on the cause for the stack trace, maybe we could have the cause default to a new Error if not supplied? It seems sort of conceivable that we could also wire up the ExceptionInfo to proxy .stack to that Error so that the stacktrace will come through, without needing to override the ExceptionInfo constructor.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11776" name="0001-hack-ex-info-stacktraces.patch" size="1716" author="tomoj" created="Sun, 23 Dec 2012 02:34:44 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-457] Implement notion of &quot;unbound&quot;, i.e. uninitialized variables, in ClojureScript to mimic Clojure&apos;s behaviour</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-457</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The following REPL snippets show different behavior for &quot;unbound&quot; vars in cljs and clj:&lt;/p&gt;

&lt;p&gt;--------&lt;br/&gt;
ClojureScript:cljs.user&amp;gt; (def a nil)&lt;br/&gt;
nil&lt;br/&gt;
ClojureScript:cljs.user&amp;gt; (def b)&lt;/p&gt;

&lt;p&gt;ClojureScript:cljs.user&amp;gt; (= a b)&lt;br/&gt;
true&lt;br/&gt;
--------&lt;br/&gt;
user=&amp;gt; (def a nil)&lt;br/&gt;
#&apos;user/a&lt;br/&gt;
user=&amp;gt; (def b)&lt;br/&gt;
#&apos;user/b&lt;br/&gt;
user=&amp;gt; (= a b)&lt;br/&gt;
false&lt;br/&gt;
--------&lt;/p&gt;

&lt;p&gt;As a possible solution, D. Nolen suggested that we could &quot;simulate this by creating a Unbound type and initializing def&apos;ed vars without init expressions to instances of it.&quot;&lt;/p&gt;</description>
                <environment>clojurescript r1552</environment>
            <key id="15963">CLJS-457</key>
            <summary>Implement notion of &quot;unbound&quot;, i.e. uninitialized variables, in ClojureScript to mimic Clojure&apos;s behaviour</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="franks">Frank Siebenlist</reporter>
                        <labels>
                    </labels>
                <created>Tue, 15 Jan 2013 11:29:52 -0600</created>
                <updated>Tue, 15 Jan 2013 11:29:52 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-474] Name every fn in CLJS sources (for debugging purposes)</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-474</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;As mentioned here: &lt;a href=&quot;https://groups.google.com/forum/?fromgroups=#!topic/clojurescript/ZX6M4KXx8I8&quot;&gt;https://groups.google.com/forum/?fromgroups=#!topic/clojurescript/ZX6M4KXx8I8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Naming every fn in the compiled javascript functions makes it a little easier to find out whats going on when looking at a stacktrace. This patch names every function generated as fn_&amp;lt;ns&amp;gt;/&amp;lt;orig-name&amp;gt;_&amp;lt;line&amp;gt;. See example stacktrace in the discussion above.&lt;/p&gt;

&lt;p&gt;The optional cljs snippet (&lt;a href=&quot;https://gist.github.com/thheller/4972200&quot;&gt;https://gist.github.com/thheller/4972200&lt;/a&gt;) then also transforms this data and prints functions as&lt;/p&gt;

&lt;p&gt;(pr-str name)&lt;br/&gt;
=&amp;gt; #&amp;lt;function cljs.core/name line:5876&amp;gt;&lt;/p&gt;

&lt;p&gt;instead of dumping the javascript source on you.&lt;/p&gt;

&lt;p&gt;The .patch has the drawback that the generated source size grows a bit (about 10% on my codebase), but advanced compilation takes care of that (although even that is still a bit larger, the closure compiler doesnt seem to strip unused function names). One could make this a compiler option if the size differences are too big.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16017">CLJS-474</key>
            <summary>Name every fn in CLJS sources (for debugging purposes)</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="thheller">Thomas Heller</reporter>
                        <labels>
                    </labels>
                <created>Mon, 18 Feb 2013 11:22:24 -0600</created>
                <updated>Mon, 18 Feb 2013 11:22:24 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                    <attachment id="11863" name="cljs-better-fn-names.patch" size="3673" author="thheller" created="Mon, 18 Feb 2013 11:22:24 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-402] Add a facility to obtain the version information of the clojurescript build that is in use</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-402</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Currently there is no function or var defined in the clojurescript library that can be used to easily obtain the version information of the build that is in use.&lt;/p&gt;

&lt;p&gt;Without that version information, debugging and reporting of errors is more cumbersome than needed, wastes time, causes confusion discussing issues...&lt;/p&gt;

&lt;p&gt;A simple function and/or var like the ones used for clojure would be very helpful:&lt;/p&gt;

&lt;p&gt;    user=&amp;gt; (clojure-version)&lt;br/&gt;
    &quot;1.4.0&quot;&lt;br/&gt;
    user=&amp;gt; &lt;b&gt;clojure-version&lt;/b&gt;&lt;br/&gt;
    {:major 1, :minor 4, :incremental 0, :qualifier nil}&lt;/p&gt;</description>
                <environment></environment>
            <key id="15764">CLJS-402</key>
            <summary>Add a facility to obtain the version information of the clojurescript build that is in use</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="franks">Frank Siebenlist</reporter>
                        <labels>
                        <label>enhancement</label>
                    </labels>
                <created>Sun, 21 Oct 2012 14:05:58 -0500</created>
                <updated>Tue, 26 Feb 2013 07:51:04 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29739" author="franks" created="Sun, 21 Oct 2012 14:16:08 -0500"  >&lt;p&gt;Auto-generation from the build script of version_autogen.clj and version_autogen.cljs files&lt;br/&gt;
that both define the cljs.version-autogen/&lt;b&gt;clojurescript-version&lt;/b&gt; &lt;br/&gt;
with the current version info for both the clj and cljs environments&lt;/p&gt;</comment>
                    <comment id="29740" author="dnolen" created="Sun, 21 Oct 2012 15:43:41 -0500"  >&lt;p&gt;Why a separate namespace for this?&lt;/p&gt;</comment>
                    <comment id="29743" author="franks" created="Sun, 21 Oct 2012 21:15:39 -0500"  >&lt;p&gt;Good point - probably better to add the &lt;b&gt;clojurescript-version&lt;/b&gt; var to the cljs.core namespace.&lt;/p&gt;

&lt;p&gt;New patch change the build script to auto-generates the &lt;b&gt;clojurescript-version&lt;/b&gt; assignment statements in both cljs/core.clj and cljs/core.cljs to reflect the correct version info.&lt;/p&gt;

&lt;p&gt;In that way it resembles more the clojure.core use of &lt;b&gt;clojure-version&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Note that the two separate assignments for clj and cljs are needed to detect out-of-sync of repl-compiler version with the compiler used to generate the js-code that was downloaded thru the webpage.&lt;/p&gt;

&lt;p&gt;Difficult to write a test-script, but it seems to work in my repl:&lt;/p&gt;

&lt;p&gt;&amp;#8212;&lt;br/&gt;
user=&amp;gt; (require &apos;cljs.core)&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; cljs.core/&amp;#42;clojurescript-version&amp;#42;&lt;br/&gt;
{:minor 0, :revision 1515, :major 0}&lt;br/&gt;
user=&amp;gt; (run-repl-listen)&lt;br/&gt;
&quot;Type: &quot; :cljs/quit &quot; to quit&quot;&lt;br/&gt;
ClojureScript:cljs.user&amp;gt; &amp;#42;clojurescript-version&amp;#42;&lt;br/&gt;
{:revision 1515, :major 0, :minor 0}&lt;br/&gt;
ClojureScript:cljs.user&amp;gt;&lt;br/&gt;
&amp;#8212;&lt;/p&gt;</comment>
                    <comment id="29744" author="franks" created="Sun, 21 Oct 2012 21:16:37 -0500"  >&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-402&quot; title=&quot;Add a facility to obtain the version information of the clojurescript build that is in use&quot;&gt;CLJS-402&lt;/a&gt;: build script auto-generates the &lt;b&gt;clojurescript-version&lt;/b&gt; assignment statements in both cljs/core.clj and cljs/core.cljs to reflect the correct version info&lt;/p&gt;</comment>
                    <comment id="29745" author="franks" created="Mon, 22 Oct 2012 00:00:57 -0500"  >&lt;p&gt;When I tried to implement a &quot;clojurescript-version&quot; function like the &quot;clojure-version&quot; one, I (re)discovered that cljs/core.clj is not your average cli-file but some funky file used by the clojurescript compiler to bootstrap - in other words it&apos;s not a good file to require and run normal functions from your clj-environment.&lt;/p&gt;

&lt;p&gt;So I moved the &amp;#42;clojurescript-version&amp;#42; var to cljs/compiler.clj as it seemed to make sense to associate the version with the compiler.&lt;/p&gt;

&lt;p&gt;On the cljs site, I left the &amp;#42;clojurescript-version&amp;#42; in cljs/core.cljs, although I was tempted to create a cljs.compiler namespace to store that var on the cljs side to make it symmetric &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/help_16.gif&quot; height=&quot;16&quot; width=&quot;16&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;.&lt;/p&gt;

&lt;p&gt;Also added a (clojurescript-version) function to both the clj and cljs sides, with an added special-fn in the cljs/repl.clj such that you can ask for the compiler version of the repl-server from the cljs-repl.&lt;/p&gt;

&lt;p&gt;Updated 3rd patch file replaces the previous one.&lt;/p&gt;

&lt;p&gt;Just wanted to record an example of a mismatch in compilers:&lt;/p&gt;

&lt;p&gt;    user=&amp;gt; (run-repl-listen)&lt;br/&gt;
    &quot;Type: &quot; :cljs/quit &quot; to quit&quot;&lt;br/&gt;
    ClojureScript:cljs.user&amp;gt; (clojurescript-version)&lt;br/&gt;
    &quot;0.0.1515&quot;&lt;br/&gt;
    ClojureScript:cljs.user&amp;gt; (clj-clojurescript-version)&lt;br/&gt;
    &quot;0.0.1516&quot;&lt;br/&gt;
    ClojureScript:cljs.user&amp;gt;&lt;/p&gt;

&lt;p&gt;This happens when you generate the javascript from your cljs with a &quot;lein cljsbuild once&quot; command with compiler version &quot;0.0.1515&quot;,&lt;br/&gt;
then upgrade the compiler to &quot;0.0.1516&quot; and then run the cljs-repl without regenerating the javascript for the webpage-download.&lt;br/&gt;
Very obscure things can happen after that...&lt;/p&gt;</comment>
                    <comment id="29746" author="franks" created="Mon, 22 Oct 2012 00:03:22 -0500"  >&lt;p&gt;build script auto-generates the clojurescript-version assignment statements in both cljs/compiler.clj and cljs/core.cljs to reflect the correct version info&lt;br/&gt;
Function &quot;clojurescript-version&quot; is added to both compiler.clj and core.cljs to mimic equivalent &quot;clojure-version&quot;&lt;br/&gt;
Special-fn &quot;clj-clojurescript-version was added to repl.clj to obtain the compiler&apos;s clojurescript-compiler version from the cljs-repl&lt;/p&gt;</comment>
                    <comment id="29748" author="dnolen" created="Mon, 22 Oct 2012 07:06:07 -0500"  >&lt;p&gt;The patch uses sed, I&apos;m not sure this is such a great idea since whatever the patch does should probably work with whatever build setup we have on Hudson.&lt;/p&gt;</comment>
                    <comment id="29750" author="chouser@n01se.net" created="Mon, 22 Oct 2012 08:05:58 -0500"  >&lt;p&gt;Would it make sense to call this &apos;clojure-version&apos; as well, instead of clojurescript-version?  It&apos;s a map, and so various flags could be added to differentiate jvm, js, python, c, etc. runtimes.  What does ClojureCLR do?&lt;/p&gt;</comment>
                    <comment id="29753" author="franks" created="Mon, 22 Oct 2012 10:52:44 -0500"  >&lt;p&gt;sed was already used in the build script... a few lines down, the pom file is transformed with:&lt;/p&gt;

&lt;p&gt;sed &amp;#45;e s/CLOJURESCRIPT_VERSION/0.0&amp;#45;$REVISION/ &amp;lt; &quot;$POM_TEMPLATE&quot; &amp;gt; &quot;$POM_FILE&quot;&lt;/p&gt;
</comment>
                    <comment id="29754" author="franks" created="Mon, 22 Oct 2012 11:15:08 -0500"  >&lt;p&gt;A quick scan of the src-code showed that ClojureCRL uses clojure-version and &amp;#42;clojure-version&amp;#42;.&lt;/p&gt;

&lt;p&gt;However, there is less chance for confusion as you are supposedly running on the CLR already.&lt;/p&gt;

&lt;p&gt;With ClojureScript you can have these three intertwined &quot;clojure&quot; environments that are all live at the same time: the clojure version, the repl clojurescript version, and the clojurescript version used to compile the initially loaded js. Not sure if overloading the clojure-version fn-name and relying on namespaces to differentiate will be helpful... but it&apos;s not that big of a deal and I&apos;m easily persuaded otherwise - somebody should make the call and I&apos;ll change it.&lt;/p&gt;</comment>
                    <comment id="30653" author="dnolen" created="Tue, 26 Feb 2013 07:51:04 -0600"  >&lt;p&gt;Sorry just now coming back to this ticket. I think it&apos;s probably preferable that the map of properties be called the same thing everywhere. I would apply the patch with this change. I note it no longer applies to master.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11595" name="CLJS402-3rd-patch-file.diff" size="4035" author="franks" created="Mon, 22 Oct 2012 00:03:22 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-478] ClojureScript js-&gt;clj not converting</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-478</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I&apos;ve updated to 0.0-1586 build #22 from a much older release: 0.0-1450&lt;/p&gt;

&lt;p&gt;I&apos;m now geting a problem with (js-&amp;gt;clj token) not converting token to a map; this worked before I upgraded.&lt;/p&gt;

&lt;p&gt;token is generated by the google OAuth 2 process: &quot;gapi.auth.authorize&quot;&lt;/p&gt;

&lt;p&gt;I don&apos;t think the problem is with js-&amp;gt;clj rather something about token so it isn&apos;t recognised as a js/Object.&lt;/p&gt;

&lt;p&gt;(println (expose token true)) gives:&lt;/p&gt;

&lt;p&gt;access_token = ya29.AHES6ZSgnk3Ws5bB-2aDx41Bbr335hKugjZJfcNAs83d121S306fxy64&lt;br/&gt;
token_type = Bearer&lt;br/&gt;
expires_in = 3600&lt;br/&gt;
client_id = 52351124085.apps.googleusercontent.com&lt;br/&gt;
scope = &lt;a href=&quot;https://www.googleapis.com/auth/drive.file,https://www.googleapis.com/auth/drive.metadata.readonly,https://www.googleapis.com/auth/drive.readonly&quot;&gt;https://www.googleapis.com/auth/drive.file,https://www.googleapis.com/auth/drive.metadata.readonly,https://www.googleapis.com/auth/drive.readonly&lt;/a&gt;&lt;br/&gt;
g_user_cookie_policy = undefined&lt;br/&gt;
cookie_policy = undefined&lt;br/&gt;
issued_at = 1361807171&lt;br/&gt;
expires_at = 1361810771&lt;/p&gt;

&lt;p&gt;This looks ok.&lt;/p&gt;

&lt;p&gt;however &lt;br/&gt;
&amp;gt; token&lt;/p&gt;

&lt;p&gt;gives:&lt;/p&gt;

&lt;p&gt;&quot;Error evaluating:&quot; token :as &quot;esef.client.evidence.token&quot;&lt;br/&gt;
#&amp;lt;TypeError: Object &lt;span class=&quot;error&quot;&gt;&amp;#91;object Object&amp;#93;&lt;/span&gt; has no method &apos;toString&apos;&amp;gt;&lt;br/&gt;
TypeError: Object &lt;span class=&quot;error&quot;&gt;&amp;#91;object Object&amp;#93;&lt;/span&gt; has no method &apos;toString&apos;&lt;/p&gt;

&lt;p&gt;&amp;gt; (type token)&lt;/p&gt;

&lt;p&gt;gives a blank line. I think this is why js-&amp;gt;clj isn&apos;t converting.&lt;/p&gt;

&lt;p&gt;&amp;gt; (alength token)&lt;/p&gt;

&lt;p&gt;gives a blank line.&lt;/p&gt;

&lt;p&gt;(.-token_type token)&lt;/p&gt;

&lt;p&gt;Correctly gives ya29.AHES6ZSgnk3Ws5bB-2aDx41Bbr335hKugjZJfcNAs83d121S306fxy64&lt;/p&gt;

&lt;p&gt;I haven&apos;t managed to recreate &apos;token&apos; with a minimal test case but I&apos;m fairly new to javascript. It&apos;s impractical to to include my OAuth 2 code because its tied into all my google security.&lt;br/&gt;
If you can suggest anything that will provide you with more info on &apos;token&apos; I&apos;ll try and help.&lt;/p&gt;

&lt;p&gt;As a work-around I manually create the MAP by explicitly reading each property, I couldn&apos;t get a list of properties.&lt;/p&gt;</description>
                <environment>ClojureScript 0.0-1586 build #22, Chrome, OSX</environment>
            <key id="16028">CLJS-478</key>
            <summary>ClojureScript js-&gt;clj not converting</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="longworthml">Mike Longworth</reporter>
                        <labels>
                    </labels>
                <created>Tue, 26 Feb 2013 08:39:19 -0600</created>
                <updated>Tue, 26 Feb 2013 12:00:53 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30655" author="dnolen" created="Tue, 26 Feb 2013 11:00:07 -0600"  >&lt;p&gt;type just returns the constructor property of an Object. For some reason this is returning undefined instead of value. It&apos;s likely that this has nothing to do with ClojureScript and more to do with Google Closure. Have you investigated whether the OAuth token constructor has changed in Closure itself?&lt;/p&gt;</comment>
                    <comment id="30656" author="longworthml" created="Tue, 26 Feb 2013 11:21:09 -0600"  >&lt;p&gt;I don&apos;t think the token object or the apis have any significant relationship with closure, they are loaded dynamically from google (gapi.client.load):&lt;br/&gt;
&lt;a href=&quot;https://code.google.com/p/google-api-javascript-client/wiki/ReferenceDocs#OAuth_2.0_Token_Object&quot;&gt;https://code.google.com/p/google-api-javascript-client/wiki/ReferenceDocs#OAuth_2.0_Token_Object&lt;/a&gt;&lt;br/&gt;
&lt;a href=&quot;https://code.google.com/p/google-api-javascript-client/wiki/GettingStarted&quot;&gt;https://code.google.com/p/google-api-javascript-client/wiki/GettingStarted&lt;/a&gt;&lt;/p&gt;

</comment>
                    <comment id="30657" author="dnolen" created="Tue, 26 Feb 2013 11:25:35 -0600"  >&lt;p&gt;Did type return something for you instead of undefined in 1450?&lt;/p&gt;</comment>
                    <comment id="30658" author="longworthml" created="Tue, 26 Feb 2013 11:40:03 -0600"  >&lt;p&gt;Sorry I can&apos;t answer that; js-&amp;gt;clj just worked so I didn&apos;t probe too deeply but looking at the code in js-&amp;gt;clj It looks like it must have. I tried the original implementation of js-&amp;gt;clj before the recent changes but confirmed this still suffers from the same problem (type x) js/Object):&lt;/p&gt;

&lt;p&gt;(defn js-&amp;gt;clj&lt;br/&gt;
  &quot;Recursively transforms JavaScript arrays into ClojureScript&lt;br/&gt;
  vectors, and JavaScript objects into ClojureScript maps.  With&lt;br/&gt;
  option &apos;:keywordize-keys true&apos; will convert object fields from&lt;br/&gt;
  strings to keywords.&quot;&lt;br/&gt;
  &lt;span class=&quot;error&quot;&gt;&amp;#91;x &amp;amp; options&amp;#93;&lt;/span&gt;&lt;br/&gt;
  (let [{:keys &lt;span class=&quot;error&quot;&gt;&amp;#91;keywordize-keys&amp;#93;&lt;/span&gt;} options&lt;br/&gt;
        keyfn (if keywordize-keys keyword str)&lt;br/&gt;
        f (fn thisfn &lt;span class=&quot;error&quot;&gt;&amp;#91;x&amp;#93;&lt;/span&gt;&lt;br/&gt;
            (cond&lt;br/&gt;
             (seq? x) (doall (map thisfn x))&lt;br/&gt;
             (coll? x) (into (empty x) (map thisfn x))&lt;br/&gt;
             (goog.isArray x) (vec (map thisfn x))&lt;br/&gt;
             (identical? (type x) js/Object) (into {} (for &lt;span class=&quot;error&quot;&gt;&amp;#91;k (js-keys x)&amp;#93;&lt;/span&gt;&lt;br/&gt;
                                                        [(keyfn k)&lt;br/&gt;
                                                         (thisfn (aget x k))]))&lt;br/&gt;
             :else x))]&lt;br/&gt;
    (f x)))&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-479] load-file in REPL improperly qualifies current-namespace ::keywords</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-479</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This can be seen by opening a REPL and:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(load-file &lt;span class=&quot;code-quote&quot;&gt;&quot;cljs/ns_test/foo.cljs&quot;&lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;tt&gt;::foo&lt;/tt&gt; keyword in that file is resolved improperly:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;ClojureScript:cljs.user&amp;gt; cljs.ns-test.foo/kw
:user/foo&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;tt&gt;cljs.repl/load-stream&lt;/tt&gt; needs to force &lt;tt&gt;&amp;#42;ns&amp;#42;&lt;/tt&gt; to track &lt;tt&gt;&amp;#42;cljs-ns&amp;#42;&lt;/tt&gt; so that the Clojure reader will properly resolve auto-namespacing keywords.  A patch is attached that does this, ensuring that any Clojure namespaces created solely for this purpose are removed.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16031">CLJS-479</key>
            <summary>load-file in REPL improperly qualifies current-namespace ::keywords</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Thu, 28 Feb 2013 04:45:41 -0600</created>
                <updated>Wed, 24 Apr 2013 21:49:04 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30670" author="cemerick" created="Thu, 28 Feb 2013 04:53:30 -0600"  >&lt;p&gt;Note that there are two other places where the Clojure reader is used in ClojureScript &#8212; one in the analyzer, one in the compiler &#8212; where a similar fix may be required.  Perhaps &lt;tt&gt;cljs.compiler/forms-seq&lt;/tt&gt; should be the sole place where the Clojure reader is used with &lt;tt&gt;&amp;#42;ns&amp;#42;&lt;/tt&gt; properly tracked therein...&lt;/p&gt;</comment>
                    <comment id="30993" author="dnolen" created="Wed, 24 Apr 2013 21:49:04 -0500"  >&lt;p&gt;Is this fixed in master?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11882" name="CLJS-479.diff" size="1419" author="cemerick" created="Thu, 28 Feb 2013 04:53:30 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-497] Constant literal optimization</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-497</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;We should optimize constant literals, in particular keywords. This optimization means that we will have to decide whether to make identical? slower by testing for keywords (this means it&apos;s probably a bad idea to continue to inline it) or to provide a special keyword-identical? that does the right thing.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16158">CLJS-497</key>
            <summary>Constant literal optimization</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Thu, 25 Apr 2013 11:44:36 -0500</created>
                <updated>Thu, 25 Apr 2013 11:44:36 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-27] Conditional compilation (or reading)</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-27</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;As people start trying to write libs that are portable between Clojure and ClojureScript they might need to have a bit of branching on target. N.B. supporting this means a change to Clojure, although it has general utility there as well.&lt;/p&gt;

&lt;p&gt;Consider CL #+ #- reader macros - &lt;a href=&quot;http://www.lispworks.com/documentation/lw50/CLHS/Body/02_dhq.htm&quot;&gt;http://www.lispworks.com/documentation/lw50/CLHS/Body/02_dhq.htm&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="14520">CLJS-27</key>
            <summary>Conditional compilation (or reading)</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="richhickey">Rich Hickey</reporter>
                        <labels>
                    </labels>
                <created>Fri, 22 Jul 2011 07:38:46 -0500</created>
                <updated>Fri, 27 Jul 2012 13:48:52 -0500</updated>
                                                                            <due></due>
                    <votes>9</votes>
                        <watches>5</watches>
                        <comments>
                    <comment id="28991" author="r0man" created="Thu, 19 Jul 2012 08:52:08 -0500"  >
&lt;p&gt;The following patches include an implementation of Common Lisp&apos;s #+&lt;br/&gt;
and #- reader macros to allow conditional compilation/reading for&lt;br/&gt;
Clojure and ClojureScript.&lt;/p&gt;

&lt;p&gt;The patches add a dynamic variable called &lt;b&gt;features&lt;/b&gt; to the&lt;br/&gt;
clojure.core and cljs.core namespaces, that should contain the&lt;br/&gt;
supported features of the platform in question as keywords. &lt;/p&gt;

&lt;p&gt;Unlike in Common Lisp, the variable is a Clojure set and not a list.&lt;br/&gt;
In Clojure the set contains at the moment the :clojure keyword, and in&lt;br/&gt;
ClojureScript the :clojurescript keyword. &lt;/p&gt;

&lt;p&gt;I would like to get feedback on the names that are added to this&lt;br/&gt;
variable. Are those ok? Is :jvm for Clojure and :js for ClojureScript&lt;br/&gt;
better? Should ClojureScript add something like :rhino, :v8 or&lt;br/&gt;
:browser as well?&lt;/p&gt;

&lt;p&gt;To run the ClojureScript tests, drop a JAR named &quot;clojure.jar&quot; that&lt;br/&gt;
has the Clojure patch applied into ClojureScript&apos;s lib directory.&lt;/p&gt;</comment>
                    <comment id="28993" author="dnolen" created="Thu, 19 Jul 2012 12:18:09 -0500"  >&lt;p&gt;This is an enhancement so it probably requires a design page and extended discussion before it will go anywhere. Until that happens I&apos;m marking this is as low priority.&lt;/p&gt;</comment>
                    <comment id="28994" author="r0man" created="Thu, 19 Jul 2012 13:45:26 -0500"  >&lt;p&gt;Ok. If someone could give me write access to the Clojure Dev Wiki I would be happy to start such a design page.&lt;/p&gt;</comment>
                    <comment id="29000" author="dnolen" created="Thu, 19 Jul 2012 17:50:01 -0500"  >&lt;p&gt;If you&apos;ve sent in your CA request permissions on the clojure-dev mailing list.&lt;/p&gt;</comment>
                    <comment id="29018" author="r0man" created="Sat, 21 Jul 2012 05:45:11 -0500"  >&lt;p&gt;I started a design page for this ticket in the Clojure Dev wiki:&lt;br/&gt;
&lt;a href=&quot;http://dev.clojure.org/display/design/Feature+Expressions&quot;&gt;http://dev.clojure.org/display/design/Feature+Expressions&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29054" author="stu" created="Fri, 27 Jul 2012 13:48:52 -0500"  >&lt;p&gt;Posting my comments over on the design page...&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11387" name="conditional-compilation-clojure.diff" size="6033" author="r0man" created="Thu, 19 Jul 2012 09:11:27 -0500" />
                    <attachment id="11388" name="conditional-compilation-clojurescript.diff" size="7890" author="r0man" created="Thu, 19 Jul 2012 09:11:27 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10003">Vetted</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                    <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-414] Implement specify, allowing instances to implement protocols</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-414</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Javascript objects are fully dynamic. Currently, ClojureScript has no mechanism to exploit that for protocol implementation. &lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-398&quot; title=&quot;new macro cljs.core/extend-instance&quot;&gt;&lt;del&gt;CLJS-398&lt;/del&gt;&lt;/a&gt; was a first attempt to implement an operation to extend single instances, but it fell short because it offered no control over which closures to attach onto the object (i.e. allocates every time). Also, specify is a much better name than extend-instance.&lt;/p&gt;

&lt;p&gt;extend-type can be implemented in terms of specify (by specifying the .prototype), but extend-type has grown from its humble beginnings &lt;br/&gt;
&lt;a href=&quot;https://github.com/clojure/clojurescript/blob/b75730da8abc3abc6134d8dd9ec426ab792d3662/src/clj/cljs/core.clj#L42&quot;&gt;https://github.com/clojure/clojurescript/blob/b75730da8abc3abc6134d8dd9ec426ab792d3662/src/clj/cljs/core.clj#L42&lt;/a&gt;&lt;br/&gt;
to an monster of complexity&lt;br/&gt;
&lt;a href=&quot;https://github.com/clojure/clojurescript/blob/72e55315c6973caa74af39b66052424f73872033/src/clj/cljs/core.clj#L438&quot;&gt;https://github.com/clojure/clojurescript/blob/72e55315c6973caa74af39b66052424f73872033/src/clj/cljs/core.clj#L438&lt;/a&gt;&lt;br/&gt;
Currently it does&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;print warnings&lt;/li&gt;
	&lt;li&gt;optimize IFn impls&lt;/li&gt;
	&lt;li&gt;special case the Object &quot;protocol&quot;&lt;/li&gt;
	&lt;li&gt;special case js builtins&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;and all that in a single macro body. So this is also a good opportunity to do some refactoring.&lt;/p&gt;

&lt;p&gt;specify should have an interface similar to extend-type. Additionally a lower level operation is needed to attach existing lambdas as protocol methods. It&apos;s called specify* in my current implementation. It takes a lambda for every specified protocol-method-arity, with a syntax loosely based on clojure.core/extend.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15807">CLJS-414</key>
            <summary>Implement specify, allowing instances to implement protocols</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="bendlas">Herwig Hochleitner</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                    </labels>
                <created>Tue, 30 Oct 2012 23:08:22 -0500</created>
                <updated>Fri, 3 May 2013 19:30:54 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29876" author="bendlas" created="Tue, 30 Oct 2012 23:21:59 -0500"  >&lt;p&gt;First patch implements specify, second switches extend-type to use it.&lt;/p&gt;</comment>
                    <comment id="29878" author="dnolen" created="Wed, 31 Oct 2012 09:30:58 -0500"  >&lt;p&gt;This is a big patch so it&apos;s going to take time to review. First question, if we&apos;re going to follow the footsteps of extend what&apos;s the purpose of changing the syntax like having to specify a map of arities?&lt;/p&gt;</comment>
                    <comment id="29879" author="bendlas" created="Wed, 31 Oct 2012 10:32:33 -0500"  >&lt;p&gt;The reason is that I wanted specify* to do as little as possible. It&apos;s basically just an abstraction over the name mangling for protocol methods, which was completely hidden till now. One of the purported use cases is:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(def methA-1 [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;] ...)
(def methA-2 [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; x] ...)
(def methB-1 [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;] ...)

(defn specify-to-P [o]
  (specify* o
    P {methA {1 methA-1
              2 methA-2}
       methB {1 methB-1}}))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here the method bodies are not allocated every time specify-to-P is called, as opposed to what the more high-level specify would do. If we didn&apos;t know which arities are to be generated, there would be simply no way to infer it:&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;there is no simple way to know at compile time which arities an fn has&lt;/li&gt;
	&lt;li&gt;if there was we wouldn&apos;t be able to get the fn at compile time in all cases&lt;/li&gt;
	&lt;li&gt;defprotocol doesn&apos;t expose it&apos;s methods or their arities&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;EDIT:&lt;/p&gt;

&lt;p&gt;As for using symbols instead of keywords: I could do this, since specify* is a macro, not a function.&lt;br/&gt;
Making specify* a function may have its own merits, which I frankly hadn&apos;t thought about. Actually, that might be sweet, I&apos;ll look into that possibility.&lt;/p&gt;</comment>
                    <comment id="29880" author="bendlas" created="Wed, 31 Oct 2012 12:59:09 -0500"  >&lt;p&gt;&lt;del&gt;As for specify* being a function: It uses a map in its syntax and at the same time is used to define PersistentHashMap, so that wouldn&apos;t work.&lt;/del&gt;&lt;br/&gt;
EDIT: the real reason is name mangling, see comment below&lt;/p&gt;

&lt;p&gt;&lt;del&gt;What could conceivably be done is to have a core function&lt;/del&gt; (specify-method &lt;span class=&quot;error&quot;&gt;&amp;#91;proto method arity impl&amp;#93;&lt;/span&gt;).&lt;br/&gt;
EDIT: can&apos;t be done without reflection, same reason&lt;/p&gt;

&lt;p&gt;That way we could support consumers that want to determine the set of implemented protocols at runtime, similar to extend. This can be a separate ticket where we work out whether it&apos;s :method &apos;method or &quot;method&quot;.&lt;/p&gt;

&lt;p&gt;As for specify* using symbols: My gut feeling tells me that since it will always be a compiler macro (or builtin) and takes the arities, there is no merit in making it superficially more similar to extend.&lt;/p&gt;

&lt;p&gt;OTOH, it occurs to me that given specify-method, we could leave out specify* completely. I think I&apos;ll try that when I get home from work. Thoughts on that approach?&lt;/p&gt;</comment>
                    <comment id="29881" author="bendlas" created="Wed, 31 Oct 2012 19:59:14 -0500"  >&lt;p&gt;Actually, I had a rationale for using symbols in specify*, which I just now rediscovered while trying to implement aforementioned specify-method.&lt;br/&gt;
It uses symbols to highlight the fact, that the method names are subject to the same (gclosure) minification as every other name.&lt;/p&gt;

&lt;p&gt;This is also the real reason specify* (or specify-method) can&apos;t be a function: It would need a reflective layer to go from &lt;span class=&quot;error&quot;&gt;&amp;#91;proto method arity&amp;#93;&lt;/span&gt; to the &lt;em&gt;gclosure minified&lt;/em&gt; version of $proto$method$arity$a. We don&apos;t have that in clojurescript, since it would considerably add to the output size.&lt;/p&gt;

&lt;p&gt;Considering that all, I think specify* in the current form is appropriate after all.&lt;/p&gt;

&lt;p&gt;Nevertheless I found an unrelated issue in the patch where &apos;Object would be resolved (with an unused result), triggering a warning. I added the 0001_1 patch, which supersedes 0001 and is functionally equivalent modulo the warning issue. 0002 still applies.&lt;/p&gt;</comment>
                    <comment id="29884" author="bendlas" created="Thu, 1 Nov 2012 00:09:23 -0500"  >&lt;p&gt;Attached patch set 01** supersedes patch set 00**&lt;/p&gt;

&lt;p&gt;The differences are&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;Make ^:skip-protocol-flag work&lt;/li&gt;
	&lt;li&gt;Added tests&lt;/li&gt;
&lt;/ul&gt;
</comment>
                    <comment id="29896" author="bendlas" created="Sat, 3 Nov 2012 00:53:19 -0500"  >&lt;p&gt;Set up a design page &lt;a href=&quot;http://dev.clojure.org/display/design/specify+i.e.+reify+for+instances&quot;&gt;http://dev.clojure.org/display/design/specify+i.e.+reify+for+instances&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29902" author="bendlas" created="Sun, 4 Nov 2012 22:06:14 -0600"  >&lt;p&gt;Attached patch 0104, applies on top of other 01* patches.&lt;br/&gt;
It adds capability to specify* IFn and allows specify* to take an expression too.&lt;/p&gt;</comment>
                    <comment id="31046" author="bendlas" created="Fri, 3 May 2013 19:30:54 -0500"  >&lt;p&gt;rebased to current master&lt;br/&gt;
see also &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/1UegnkLSwhE/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/1UegnkLSwhE/discussion&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11647" name="0001_1-CLJS-414-specify-and-specify-macros.patch" size="7728" author="bendlas" created="Wed, 31 Oct 2012 19:59:14 -0500" />
                    <attachment id="11645" name="0001-CLJS-414-specify-and-specify-macros.patch" size="7798" author="bendlas" created="Tue, 30 Oct 2012 23:21:59 -0500" />
                    <attachment id="11646" name="0002-CLJS-414-Implement-extend-type-in-terms-of-specify.patch" size="8790" author="bendlas" created="Tue, 30 Oct 2012 23:21:59 -0500" />
                    <attachment id="11651" name="0101-CLJS-414-specify-and-specify-macros.patch" size="7722" author="bendlas" created="Thu, 1 Nov 2012 00:09:23 -0500" />
                    <attachment id="11652" name="0102-CLJS-414-Implement-extend-type-in-terms-of-specify.patch" size="8790" author="bendlas" created="Thu, 1 Nov 2012 00:09:23 -0500" />
                    <attachment id="11650" name="0103-CLJS-414-Test-specify-features-deprecation-nowarn-an.patch" size="1594" author="bendlas" created="Thu, 1 Nov 2012 00:09:23 -0500" />
                    <attachment id="11664" name="0104-CLJS-414-Update-specify-to-allow-implementing-IFn-an.patch" size="6172" author="bendlas" created="Sun, 4 Nov 2012 22:06:14 -0600" />
                    <attachment id="11983" name="0201-CLJS-414-specify-and-specify-macros.patch" size="7705" author="bendlas" created="Fri, 3 May 2013 19:30:54 -0500" />
                    <attachment id="11982" name="0202-CLJS-414-Implement-extend-type-in-terms-of-specify.patch" size="8765" author="bendlas" created="Fri, 3 May 2013 19:30:54 -0500" />
                    <attachment id="11981" name="0203-CLJS-414-Test-specify-features-deprecation-nowarn-an.patch" size="1802" author="bendlas" created="Fri, 3 May 2013 19:30:54 -0500" />
                    <attachment id="11980" name="0204-CLJS-414-Update-specify-to-allow-implementing-IFn-an.patch" size="6163" author="bendlas" created="Fri, 3 May 2013 19:30:54 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-505] reduce-kv doesn&apos;t work on this dataset</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-505</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;reduce-kv seems to fail with certain datasets in clojurescript but works in clojure.  plain reduce works in both.  Test dataset and functions:&lt;/p&gt;

&lt;p&gt;(def tst &apos;{0 (0.16245458703559382 0.16299961144753652), 1 (0.17095488518209803 0.1662484375243468), 2 (0.19709700082585824 0.1876248353737042 0.18162592547515274), 3 (0.21941419798490325 0.21807914100386067 0.21533585716040135 0.21307519864852958 0.20703453840254027 0.20459935129415552), 4 (0.2254558759699653 0.22553167887455705 0.2234426184638531), 5 (0.23427611508459756 0.2325434766605363 0.22990656317710662 0.22720478209110223), 6 (0.236386202300682 0.237142940385559 0.23819488667547528 0.23768692982616965 0.23701568705350426 0.2519226069678777), 7 (0.23496439825060444 0.2366135730772095 0.2358487071572212 0.2343505595436482 0.2339754113241729 0.23574632954272087 0.2342899279492302 0.23394402094793673 0.2253325456308313 0.23115349467838542 0.23764956541775945 0.24569178483873644 0.24935940319340053), 8 (0.20547261591662125 0.20726089154784122 0.21592818189465432 0.21750737743637422), 9 (0.18799738410585773 0.195400717149256 0.19631498833296726), 10 (0.1719302696659648 0.17805792401151166 0.18237267730425885), 11 (0.1623645568284537 0.16481390708298796 0.16716904262359314), 12 (0.16156804839942243 0.16211838120784386), 13 (0.16995648347966535 0.16559349825186068), 14 (0.19176771652550495 0.17696322624338934), 15 (0.23973485828855146 0.22420582245618542 0.2145975801770993 0.20208630026741867), 16 (0.2946896009888785 0.28676176338007714 0.28325454941805994 0.2716914099321759 0.26202250017945194 0.25452401319317824 0.2458771184353157), 17 (0.33300741045445653 0.3282046117335755 0.32330639472087175 0.3191873692036449 0.31290612056170736 0.30418343504691503 0.3004101566486822), 18 (0.341869650592079 0.34431149263906713 0.3457698150448536 0.34421452862514235 0.3429726966458358 0.3388988973880783 0.33579154357727864), 19 (0.2968748091051211 0.3023852506442652 0.3121637065261914 0.31141190562184173 0.32205821745972246 0.32898706631919056 0.33322752162957553 0.3396066565159988), 20 (0.2317683974879252 0.24538548478582375 0.2645130722935203 0.27362218406430894), 21 (0.20128274621982342 0.21819083560963268), 22 (0.1732991500114435 0.1811216605973363 0.19151484878018085), 23 (0.16575238432187128)})&lt;/p&gt;

&lt;p&gt;; this returns nil in clojurescript, returns a sorted dataset in clojure.  &lt;br/&gt;
(defn sortpi &lt;span class=&quot;error&quot;&gt;&amp;#91;pi&amp;#93;&lt;/span&gt;&lt;br/&gt;
  (reduce-kv (fn &lt;span class=&quot;error&quot;&gt;&amp;#91;c k v&amp;#93;&lt;/span&gt; (assoc c k (sort v))) {} pi))&lt;/p&gt;

&lt;p&gt;(sortpi tst)&lt;/p&gt;

&lt;p&gt;; this version works in both clojurescript and clojure:&lt;br/&gt;
(defn sortpi2 &lt;span class=&quot;error&quot;&gt;&amp;#91;pi&amp;#93;&lt;/span&gt;&lt;br/&gt;
  (reduce (fn [c &lt;span class=&quot;error&quot;&gt;&amp;#91;k v&amp;#93;&lt;/span&gt;] (assoc c k (sort v))) {} pi))&lt;/p&gt;

&lt;p&gt;(sortpi2 tst)&lt;/p&gt;</description>
                <environment>Chromium browser on kde mint</environment>
            <key id="16185">CLJS-505</key>
            <summary>reduce-kv doesn&apos;t work on this dataset</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bburdette">Ben Burdette</reporter>
                        <labels>
                    </labels>
                <created>Sun, 12 May 2013 13:44:12 -0500</created>
                <updated>Sun, 12 May 2013 22:49:57 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="31087" author="michalmarczyk" created="Sun, 12 May 2013 22:49:57 -0500"  >&lt;p&gt;Works for me on master. Which version of ClojureScript are you using?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-506] Flag to disable minification in advanced mode</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-506</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Problem:&lt;br/&gt;
Some code has different semantics when compiled in advanced mode.&lt;br/&gt;
Clojurescript tries to minimize those cases, but examples are usage of aget or forgotten externs files.&lt;br/&gt;
There exits closure compiler options to generate names based on original expressions, even with advanced optimizations.&lt;br/&gt;
However, there exists no clojurescript compiler option for that.&lt;/p&gt;

&lt;p&gt;Proposal:&lt;br/&gt;
Add a :debug compiler option to clojurescript, which can be set to true to turn the following closure compiler options on:&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;generatePseudoNames true&lt;/li&gt;
	&lt;li&gt;anonymousFunctionNaming AnonymousFunctionNamingPolicy/UNMAPPED&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Attached patch implements this, as a result the compiled test suite is indeed quite readable.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16193">CLJS-506</key>
            <summary>Flag to disable minification in advanced mode</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                    </labels>
                <created>Sun, 19 May 2013 10:09:08 -0500</created>
                <updated>Sun, 19 May 2013 10:11:15 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="31115" author="bendlas" created="Sun, 19 May 2013 10:11:15 -0500"  >&lt;p&gt;Patch 0001 depends on patches 0001 and 0002 from &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-480&quot; title=&quot;*cljs-data-readers* is bound to *data-readers* inconsistently&quot;&gt;CLJS-480&lt;/a&gt; because of changes to the test script.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11998" name="0001-CLJS-506-Add-a-debug-flag-to-the-compiler-options.patch" size="2171" author="bendlas" created="Sun, 19 May 2013 10:11:15 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-507] Persistent Data Structure Benchmark</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-507</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Put together an easy to run series of persistent data structure benchmarks that can be easily run. For example we would like to submit to this Mozilla ticket &lt;a href=&quot;http://bugzilla.mozilla.org/show_bug.cgi?id=874174&quot;&gt;http://bugzilla.mozilla.org/show_bug.cgi?id=874174&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="16194">CLJS-507</key>
            <summary>Persistent Data Structure Benchmark</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Mon, 20 May 2013 14:35:42 -0500</created>
                <updated>Mon, 20 May 2013 14:35:42 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-480] *cljs-data-readers* is bound to *data-readers* inconsistently</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-480</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;It looks like &lt;tt&gt;&amp;#42;cljs-data-readers&amp;#42;&lt;/tt&gt; is not being bound to &lt;tt&gt;&amp;#42;data-readers&amp;#42;&lt;/tt&gt; where it should be.&lt;/p&gt;

&lt;p&gt;At a minimum, &lt;tt&gt;cljs.repl/load-stream&lt;/tt&gt; does not.  The practical effect of this instance is that e.g. &lt;tt&gt;(load-file &quot;some/cljs/file.cljs&quot;)&lt;/tt&gt; will fail if that file or any other contains a user-defined literal tag.  Similar behaviour exists elsewhere, e.g. &lt;tt&gt;(load-namespace &apos;some.cljs.ns)&lt;/tt&gt; will not load a namespace that contains user-defined tags (I &lt;em&gt;think&lt;/em&gt; that one is due to &lt;tt&gt;&amp;#42;cljs-data-readers&amp;#42;&lt;/tt&gt; not being bound in the analyzer).&lt;/p&gt;

&lt;p&gt;This is related to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-479&quot; title=&quot;load-file in REPL improperly qualifies current-namespace ::keywords&quot;&gt;CLJS-479&lt;/a&gt; insofar as it&apos;s another symptom of ClojureScript loading code in subtly different ways in multiple places.&lt;/p&gt;

&lt;p&gt;I&apos;m happy to do either of:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;submit issues+patches fixing issues as I encounter them, or&lt;/li&gt;
	&lt;li&gt;attempt a more significant refactoring that sets up (hopefully) one and only one place where ClojureScript reads code (i.e. uses &lt;tt&gt;LispReader&lt;/tt&gt;) so that behaviour can be consistent&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;I&apos;m somewhat hesitant re: (2) insofar as the specific requirements of the compiler and analyzer and REPL may be divergent in ways that I&apos;m not yet aware of, but it seems like it&apos;s worth a shot.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16036">CLJS-480</key>
            <summary>*cljs-data-readers* is bound to *data-readers* inconsistently</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Fri, 1 Mar 2013 15:44:22 -0600</created>
                <updated>Tue, 21 May 2013 10:06:43 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="31103" author="bendlas" created="Fri, 17 May 2013 15:10:29 -0500"  >&lt;p&gt;Attached patch 0001 binds &lt;b&gt;data-readers&lt;/b&gt; in cljs.compiler/parse-ns.&lt;/p&gt;

&lt;p&gt;This allows the compiler to run, even if files with reader tags are already compiled.&lt;/p&gt;

&lt;p&gt;This in turn allows multiple test compilations to be brought back, which I&apos;ll submit as part of a patch for an additional debugging flag, if nobody beats me to it.&lt;/p&gt;

&lt;p&gt;I think this won&apos;t fix load-file &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/help_16.gif&quot; height=&quot;16&quot; width=&quot;16&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;, but after the hotfix we should probably look for the proper place in the compiler to bind &lt;b&gt;data-readers&lt;/b&gt;.&lt;/p&gt;</comment>
                    <comment id="31105" author="bendlas" created="Fri, 17 May 2013 17:25:23 -0500"  >&lt;p&gt;Patch 0002 is my overhaul for the test script.&lt;br/&gt;
Since it&apos;s a test case for patch 0001, I think it&apos;s justifiable on this ticket.&lt;/p&gt;

&lt;p&gt;Note: On my machine, with SpiderMonkey 185, the test case (not (integer? 1e+308)) fails. It probably doesn&apos;t have to do anything with the removed -n flag (there is no js -n omm), I just wanted to mention it.&lt;/p&gt;</comment>
                    <comment id="31126" author="dnolen" created="Tue, 21 May 2013 10:06:43 -0500"  >&lt;p&gt;Please move the test script patch to a different ticket. Thanks.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11995" name="0001-CLJS-480-bind-data-readers-in-parse-ns.patch" size="883" author="bendlas" created="Fri, 17 May 2013 15:10:29 -0500" />
                    <attachment id="11996" name="0002-Bring-back-multiple-test-compilations-and-overhaul-o.patch" size="2798" author="bendlas" created="Fri, 17 May 2013 17:25:23 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-512] Tagged literals should yield Java types to macros</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-512</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;user=&amp;gt; &apos;#inst &lt;span class=&quot;code-quote&quot;&gt;&quot;2000-01-01&quot;&lt;/span&gt;
#inst &lt;span class=&quot;code-quote&quot;&gt;&quot;2000-01-01T00:00:00.000-00:00&quot;&lt;/span&gt;

ClojureScript:cljs.user&amp;gt; &apos;#inst &lt;span class=&quot;code-quote&quot;&gt;&quot;2000-01-01&quot;&lt;/span&gt;
(js/Date. 946684800000)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;CLJS should return a JS Date object, not a list.&lt;/p&gt;

&lt;p&gt;This means that there needs to be a pluggable system for emitting custom types as JS code. Right now you can work around this via (defmethod cljs.analyzer/emit-constant ...)&lt;/p&gt;

&lt;p&gt;Full discussion in IRC here: &lt;a href=&quot;http://clojure-log.n01se.net/date/2013-05-30.html&quot;&gt;http://clojure-log.n01se.net/date/2013-05-30.html&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="16211">CLJS-512</key>
            <summary>Tagged literals should yield Java types to macros</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                    </labels>
                <created>Thu, 30 May 2013 20:02:48 -0500</created>
                <updated>Thu, 30 May 2013 20:02:48 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-454] Instance Reader to Support Micro/Nanoseconds</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-454</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Any timestamps with a greater than millisecond precision cannot be handled by the ClouseScript reader:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;&amp;gt; cljs.reader.read_date(&lt;span class=&quot;code-quote&quot;&gt;&quot;2012-12-30T23:20:05.066980000-00:00&quot;&lt;/span&gt;)
&amp;gt; Error: Assert failed: timestamp millisecond field must be in range 0..999 Failed:  0&amp;lt;=66980000&amp;lt;=999 (&amp;lt;= low n high)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here &quot;2012-12-30T23:20:05.066980000-00:00&quot; is an example of an ordinary timestamp that is returned from Postgres.&lt;/p&gt;

&lt;p&gt;ClojureScript reader interprets the nanosecond portion &quot;066980000&quot; as milliseconds and the check &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/47bc8f03f5c05aa754ebfed2e4332967692f291a/src/cljs/cljs/reader.cljs#L494&quot;&gt;here&lt;/a&gt; fails:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;def parse-and-validate-timestamp
...
   (check 0 ms 999 &lt;span class=&quot;code-quote&quot;&gt;&quot;timestamp millisecond field must be in range 0..999&quot;&lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment>N/A</environment>
            <key id="15945">CLJS-454</key>
            <summary>Instance Reader to Support Micro/Nanoseconds</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tolitius">Anatoly Polinsky</reporter>
                        <labels>
                        <label>reader</label>
                        <label>timestamp</label>
                    </labels>
                <created>Fri, 4 Jan 2013 15:30:23 -0600</created>
                <updated>Thu, 21 Feb 2013 13:22:05 -0600</updated>
                                                                            <due></due>
                    <votes>4</votes>
                        <watches>4</watches>
                        <comments>
                    <comment id="30375" author="dnolen" created="Fri, 4 Jan 2013 16:55:47 -0600"  >&lt;p&gt;Is this behavior supported in Clojure?&lt;/p&gt;</comment>
                    <comment id="30377" author="wagjo" created="Sat, 5 Jan 2013 06:48:08 -0600"  >&lt;p&gt;It seems &lt;a href=&quot;https://github.com/clojure/clojure/blob/master/src/clj/clojure/instant.clj#L61&quot;&gt;it is&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30380" author="tolitius" created="Sun, 6 Jan 2013 02:18:15 -0600"  >&lt;p&gt;@David,&lt;/p&gt;

&lt;p&gt;    Yep, it is supported. Enhancing Jozef&apos;s response:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;user=&amp;gt; (use &apos;clojure.instant)
nil
user=&amp;gt; (read-instant-date &lt;span class=&quot;code-quote&quot;&gt;&quot;2012-12-30T23:20:05.066980000-00:00&quot;&lt;/span&gt;)
#inst &lt;span class=&quot;code-quote&quot;&gt;&quot;2012-12-30T23:20:05.066-00:00&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;/Anatoly&lt;/p&gt;</comment>
                    <comment id="30415" author="dnolen" created="Wed, 9 Jan 2013 22:59:39 -0600"  >&lt;p&gt;Ok, do you all have a good idea about what a patch would look like?&lt;/p&gt;</comment>
                    <comment id="30554" author="thheller" created="Tue, 5 Feb 2013 15:28:26 -0600"  >&lt;p&gt;Since JavaScript has no support for nanoseconds in Date, I&apos;d vote for dropping the nanoseconds. Currently the reader just blows up when reading a String with java.sql.Timestamp printed in CLJ, since that is printed in nanosecond precision.&lt;/p&gt;

&lt;p&gt;While probably not the best solution, I attached a patch for cljs.reader/parse-and-validate-timestamp fn that just drops the nanoseconds from the millisecond portion. Would be easier to just strip the ms string to 3 digits but that would cause &quot;2012-12-30T23:20:05.066980000012312312123121-00:00&quot; to validate.&lt;/p&gt;</comment>
                    <comment id="30555" author="thheller" created="Tue, 5 Feb 2013 15:35:58 -0600"  >&lt;p&gt;Well, Math. Just realized that this is not really correct, since 1000 is closer to 999 than it is to 100.&lt;/p&gt;</comment>
                    <comment id="30556" author="thheller" created="Tue, 5 Feb 2013 15:37:26 -0600"  >&lt;p&gt;Sorry, for that brainfart.&lt;/p&gt;</comment>
                    <comment id="30558" author="dnolen" created="Wed, 6 Feb 2013 11:39:12 -0600"  >&lt;p&gt;Or we could return a custom ClojureScript Date type that provides the same api as js/Date but adds support for nanoseconds. &lt;/p&gt;</comment>
                    <comment id="30636" author="thheller" created="Wed, 20 Feb 2013 17:20:37 -0600"  >&lt;p&gt;One could extend the js/Date prototype with a setNanos/getNanos method and call them accordingly. I&apos;d offer to implement that but the cljs.reader/parse-and-validate-timestamp function scares me, any objections to rewriting that?&lt;/p&gt;

&lt;p&gt;As for the js/Date extension, thats easy enough:&lt;/p&gt;

&lt;p&gt;(set! (.. js/Date -prototype -setNanos) (fn &lt;span class=&quot;error&quot;&gt;&amp;#91;ns&amp;#93;&lt;/span&gt; (this-as self (set! (.-nanos self) ns))))&lt;br/&gt;
(set! (.. js/Date -prototype -getNanos) (fn [] (this-as self (or (.-nanos self) 0))))&lt;/p&gt;

&lt;p&gt;Not sure if its a good idea though, messing with otherwise native code might not be &quot;stable&quot;.&lt;/p&gt;

&lt;p&gt;Not convinced that keeping the nanos around is &quot;required&quot; since javascript cannot construct Dates with nanos, but its probably better not to lose the nanos in case of round tripping from clj -&amp;gt; cljs -&amp;gt; clj.&lt;/p&gt;</comment>
                    <comment id="30637" author="dnolen" created="Thu, 21 Feb 2013 00:25:55 -0600"  >&lt;p&gt;We definitely don&apos;t want to mutate Date&apos;s prototype without namespacing. I&apos;m not sure we want to mutate Date&apos;s prototype at all. That&apos;s why I suggested a ClojureScript type with the same interface as Date just as Google has done in Closure.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11838" name="cljs-reader-nanosecond-workarround-corrected.patch" size="1269" author="thheller" created="Tue, 5 Feb 2013 15:37:26 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-463] Google Closure Class interop form (genclass)</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-463</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Currently it&apos;s not really possible to use to the existing deftype/record to construct &quot;classes&quot; that interop well with Google Closure. It seems odd to ship Closure and then provide no tools for writing ClojureScript against it, especially the UI component parts. Several people have asked for this now so perhaps we really should offer the ClojureScript equivalent of genclass.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15978">CLJS-463</key>
            <summary>Google Closure Class interop form (genclass)</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sat, 26 Jan 2013 12:43:10 -0600</created>
                <updated>Sat, 11 May 2013 15:17:34 -0500</updated>
                                                                            <due></due>
                    <votes>3</votes>
                        <watches>4</watches>
                        <comments>
                    <comment id="31083" author="dspiteself@gmail.com" created="Sat, 11 May 2013 15:06:49 -0500"  >&lt;p&gt;What do you think of this approach based on&lt;br/&gt;
based on &lt;a href=&quot;http://www.50ply.com/blog/2012/07/08/extending-closure-from-clojurescript/&quot;&gt;http://www.50ply.com/blog/2012/07/08/extending-closure-from-clojurescript/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While it may not preserve enough of gen-class&apos;s semantics. This would be enough for us to start gradually porting our large GClosure code base to Clojurescript. The code size reduction would be enormous. &lt;/p&gt;


&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeHeader panelHeader&quot; style=&quot;border-bottom-width: 1px;&quot;&gt;&lt;b&gt;sample_use&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(ns com.example
  (:require [goog.ui.tree.TreeControl :as TreeControl]))
(gen-class
  :name DemoTree
  :&lt;span class=&quot;code-keyword&quot;&gt;extends&lt;/span&gt; goog/ui.tree.TreeControl
  :constructor ([name config]
                 (goog/base (js* &lt;span class=&quot;code-quote&quot;&gt;&quot;&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;&quot;&lt;/span&gt;) name config))
  :methods [[handleKeyEvent [e]
              (goog/base (js* &lt;span class=&quot;code-quote&quot;&gt;&quot;&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;&quot;&lt;/span&gt;) &lt;span class=&quot;code-quote&quot;&gt;&quot;handleKeyEvent&quot;&lt;/span&gt; e)
              ;; my special code to handle the key event
    ]])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;here is a untested mock implementation modified from &lt;a href=&quot;http://www.50ply.com/blog/2012/07/08/extending-closure-from-clojurescript/&quot;&gt;http://www.50ply.com/blog/2012/07/08/extending-closure-from-clojurescript/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I changed constructors to constructor because there can be only one in js&lt;/p&gt;

&lt;p&gt;This unfortunately has different semantics from gen-class because the original did not include the definition of the methods and constructor inline. It tried to read the Clojure gen-class source,but I still do not yet understand how the :prefix grabbing of functions from the current namespace works from within a macro.&lt;/p&gt;



&lt;p&gt;For Google Closure interop each class should have its own provide&lt;/p&gt;


&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeHeader panelHeader&quot; style=&quot;border-bottom-width: 1px;&quot;&gt;&lt;b&gt;dryrun_for_gen-class&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defmacro gen-class [{&lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt;-type :name base-type :&lt;span class=&quot;code-keyword&quot;&gt;extends&lt;/span&gt; ctor :constructor methods :methods}]
  `(&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt;
     ;(goog/provide ~@(str *ns* &lt;span class=&quot;code-quote&quot;&gt;&quot;.&quot;&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt;-type)) 
     (defn ~&lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt;-type ~@ctor)

     (goog/inherits ~type ~base-type)

     ~@(map
        (fn [method]
          `(set! (.. ~type -prototype ~(to-property (first method)))
                 (fn ~@(&lt;span class=&quot;code-keyword&quot;&gt;rest&lt;/span&gt; method))))
        methods)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-523] IHash not extended to js/Date</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-523</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Makes for fun times, like:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;cljs.user=&amp;gt; ((hash-map #inst &lt;span class=&quot;code-quote&quot;&gt;&quot;1990-01-29T00:39:33.938-00:00&quot;&lt;/span&gt; 5) #inst &lt;span class=&quot;code-quote&quot;&gt;&quot;1990-01-29T00:39:33.938-00:00&quot;&lt;/span&gt;)
nil&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Happy to put together a patch implementing a sane &lt;tt&gt;IHash&lt;/tt&gt; impl for &lt;tt&gt;js/Date&lt;/tt&gt;.  Have not done so already only because &lt;tt&gt;js/Date&lt;/tt&gt; &lt;em&gt;does&lt;/em&gt; have a place in core.cljs where core protocols are being extended to host types, but &lt;tt&gt;IHash&lt;/tt&gt; just isn&apos;t included; perhaps there was a reason?&lt;/p&gt;</description>
                <environment></environment>
            <key id="16235">CLJS-523</key>
            <summary>IHash not extended to js/Date</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Mon, 17 Jun 2013 10:06:40 -0500</created>
                <updated>Mon, 17 Jun 2013 14:00:55 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="31290" author="dnolen" created="Mon, 17 Jun 2013 11:10:39 -0500"  >&lt;p&gt;This implies modifying the prototype of a native in core, I&apos;m not very excited about that. I&apos;m inclined to say that users should deal with js/Date themselves.&lt;/p&gt;</comment>
                    <comment id="31292" author="fogus" created="Mon, 17 Jun 2013 12:52:27 -0500"  >&lt;p&gt;&amp;gt; users should deal with js/Date themselves&lt;/p&gt;

&lt;p&gt;Seconded.&lt;/p&gt;</comment>
                    <comment id="31296" author="cemerick" created="Mon, 17 Jun 2013 13:41:51 -0500"  >&lt;p&gt;Didn&apos;t that ship sail already with &lt;tt&gt;IEquiv&lt;/tt&gt;?&lt;/p&gt;</comment>
                    <comment id="31298" author="dnolen" created="Mon, 17 Jun 2013 13:47:35 -0500"  >&lt;p&gt;No and we will probably remove that. Our modification of the String prototype has already wrecked havoc as far as interop goes. There is simply no justification for modifying natives in core.&lt;/p&gt;</comment>
                    <comment id="31299" author="dnolen" created="Mon, 17 Jun 2013 14:00:28 -0500"  >&lt;p&gt;Actually we should just add Date to the list of natives that are specially handled along with object, boolean, string etc.&lt;/p&gt;</comment>
                    <comment id="31300" author="cemerick" created="Mon, 17 Jun 2013 14:00:55 -0500"  >&lt;p&gt;Opened &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-525&quot; title=&quot;Allow hashtable lookup used for numbers and strings to be extended to other built-in types&quot;&gt;CLJS-525&lt;/a&gt; per dnolen&apos;s suggestion in irc, to allow things like this to be supported without touching built-in prototypes.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-525] Allow hashtable lookup used for numbers and strings to be extended to other built-in types</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-525</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;...which would enable safe extension of key cljs protocols to types without modifying their prototypes, e.g. &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-523&quot; title=&quot;IHash not extended to js/Date&quot;&gt;CLJS-523&lt;/a&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16237">CLJS-525</key>
            <summary>Allow hashtable lookup used for numbers and strings to be extended to other built-in types</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Mon, 17 Jun 2013 13:59:52 -0500</created>
                <updated>Mon, 17 Jun 2013 15:05:30 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="31301" author="dnolen" created="Mon, 17 Jun 2013 14:56:23 -0500"  >&lt;p&gt;Date is the only JS native case that I&apos;m aware of that we don&apos;t handle. One tricky bit is that goog.typeOf won&apos;t give us the information we need, but I think instanceof should cover us here?&lt;/p&gt;</comment>
                    <comment id="31302" author="fogus" created="Mon, 17 Jun 2013 15:05:30 -0500"  >&lt;p&gt;instanceof or the ever-gruesome toString.call(aDate) == &apos;&lt;span class=&quot;error&quot;&gt;&amp;#91;object Date&amp;#93;&lt;/span&gt;&apos; will work.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-3] testing spike (assert, test.generative)</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-3</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Things we will need to have/work around:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;clojure.walk&lt;/li&gt;
	&lt;li&gt;rethink deep-take (simple approach: omit)
	&lt;ul&gt;
		&lt;li&gt;or have a bindable var for compare-depth&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;fully qualified name hack&lt;/li&gt;
	&lt;li&gt;eval (macro time only?)&lt;/li&gt;
	&lt;li&gt;atoms&lt;/li&gt;
	&lt;li&gt;binding&lt;/li&gt;
	&lt;li&gt;development time namespace walking, or some other way to find tests&lt;/li&gt;
	&lt;li&gt;math fns&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Imported from github issue #12&lt;/p&gt;</description>
                <environment></environment>
            <key id="14496">CLJS-3</key>
            <summary>testing spike (assert, test.generative)</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="-1">None</reporter>
                        <labels>
                    </labels>
                <created>Tue, 16 Jun 2020 00:00:00 -0500</created>
                <updated>Tue, 23 Aug 2011 17:38:39 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="26597" author="chouser@n01se.net" created="Wed, 24 Jun 2020 00:00:00 -0500"  >&lt;p&gt;Comment by stuarthalloway, Thu Jun 16 00:37:49 2011:&lt;/p&gt;

&lt;p&gt;Can I import the goog libraries when and as necessary to implement core fns? I assume I will need some math support for test.generative.&lt;/p&gt;</comment>
                    <comment id="26598" author="chouser@n01se.net" created="Wed, 24 Jun 2020 00:00:00 -0500"  >&lt;p&gt;Comment by richhickey, Thu Jun 16 04:45:01 2011:&lt;/p&gt;

&lt;p&gt;Yes, you should be able to require them, depends on #8&lt;/p&gt;</comment>
                    <comment id="26599" author="chouser@n01se.net" created="Wed, 24 Jun 2020 00:00:00 -0500"  >&lt;p&gt;Later&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-270] Warn if ISeq is implemented and ISeqable and ICollection are not</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-270</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15472">CLJS-270</key>
            <summary>Warn if ISeq is implemented and ISeqable and ICollection are not</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Thu, 24 May 2012 19:08:22 -0500</created>
                <updated>Wed, 30 May 2012 11:16:01 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-287] Allow extending &apos;set-options&apos; for Closure Compiler</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-287</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Currently, ClojureScript only &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/closure.clj#L75&quot;&gt;exposes&lt;/a&gt; a limited set of options to the API users. Would be nice to have a way of extending &lt;tt&gt;cljs.clojure/set-options&lt;/tt&gt; to handle arbitrary options, like &lt;tt&gt;--define&lt;/tt&gt; (which is already covered in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-77&quot; title=&quot;Add support for Closure defines&quot;&gt;CLJS-77&lt;/a&gt;).&lt;/p&gt;</description>
                <environment></environment>
            <key id="15495">CLJS-287</key>
            <summary>Allow extending &apos;set-options&apos; for Closure Compiler</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="superbobry">Sergei Lebedev</reporter>
                        <labels>
                    </labels>
                <created>Thu, 31 May 2012 15:52:17 -0500</created>
                <updated>Thu, 31 May 2012 15:52:17 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-81] cljsc :externs flag fails when opts map not quoted</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-81</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;For example, in the &lt;tt&gt;samples/hello-js&lt;/tt&gt; directory, running the following works fine:&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;    cljsc src &apos;{:optimizations :advanced :output-to &quot;hello-extern.js&quot; :externs [&quot;externs.js&quot;]}&apos;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;However, the following fails:&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;    cljsc src {:optimizations :advanced :externs [&quot;./externs.js&quot;]} &amp;gt; hello-extern.js
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With the error message &quot;Exception in thread &quot;main&quot; java.lang.IllegalArgumentException: No implementation of method: :as-file of protocol: #&apos;clojure.java.io/Coercions found for class: clojure.lang.Symbol&quot;.&lt;/p&gt;

&lt;p&gt;Fully qualifying the path to &lt;tt&gt;externs.js&lt;/tt&gt; seems to work, BUT it actually fails by placing an exception message into the &lt;tt&gt;hello-externs.js&lt;/tt&gt; file.&lt;/p&gt;
</description>
                <environment></environment>
            <key id="14641">CLJS-81</key>
            <summary>cljsc :externs flag fails when opts map not quoted</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                    </labels>
                <created>Fri, 23 Sep 2011 15:46:40 -0500</created>
                <updated>Sat, 2 Jun 2012 16:48:43 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28685" author="netguy204" created="Sat, 2 Jun 2012 16:48:43 -0500"  >&lt;p&gt;I think your shell (bash?) may be treating the &lt;span class=&quot;error&quot;&gt;&amp;#91;...&amp;#93;&lt;/span&gt; portion of that expression as a character class and substituting matches from the file system. I&apos;m not aware of any method for avoiding this other than changing shells to one that won&apos;t try to expand the &lt;span class=&quot;error&quot;&gt;&amp;#91;...&amp;#93;&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_04_03.html&quot;&gt;http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_04_03.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perhaps we should change the documentation examples so that they always quote the opts map. Maybe that would help avoid confusion.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-163] Using ^:extern in repl fails</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-163</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;ClojureScript:cljs.user&amp;gt; (defn ^:export a [])
&lt;span class=&quot;code-quote&quot;&gt;&quot;Error evaluating:&quot;&lt;/span&gt; (defn a []) :as &lt;span class=&quot;code-quote&quot;&gt;&quot;cljs.user.a = (function a(){\nreturn &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;;\n});\ngoog.exportSymbol(&apos;cljs.user.a&apos;, cljs.user.a);\n&quot;&lt;/span&gt;
org.mozilla.javascript.EvaluatorException: missing ; before statement (&amp;lt;cljs repl&amp;gt;#41)

nil
ClojureScript:cljs.user&amp;gt; (defn a [])
#&amp;lt;
function a() {
    &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;;
}
&amp;gt;
ClojureScript:cljs.user&amp;gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment>ClojureScript version used:&lt;br/&gt;
&lt;br/&gt;
commit aa51a01141131736871e791918df63f185155421&lt;br/&gt;
Author: David Nolen &amp;lt;&lt;a href=&apos;mailto:dnolen@Davids-MacBook-Pro.local&apos;&gt;dnolen@Davids-MacBook-Pro.local&lt;/a&gt;&amp;gt;&lt;br/&gt;
Date:   Wed Mar 14 20:21:07 2012 -0400&lt;br/&gt;
</environment>
            <key id="15281">CLJS-163</key>
            <summary>Using ^:extern in repl fails</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="icyrock.com">icyrock.com</reporter>
                        <labels>
                    </labels>
                <created>Thu, 15 Mar 2012 21:43:03 -0500</created>
                <updated>Sun, 17 Jun 2012 12:19:40 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-295] remove the full inst literal test - adds 10 seconds to test runs when testing all the major JS engines</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-295</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15506">CLJS-295</key>
            <summary>remove the full inst literal test - adds 10 seconds to test runs when testing all the major JS engines</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 3 Jun 2012 13:53:13 -0500</created>
                <updated>Sun, 17 Jun 2012 12:04:58 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28837" author="dnolen" created="Sun, 17 Jun 2012 12:04:26 -0500"  >&lt;p&gt;To be honest this mostly affects people doing performance work who run the tests against all three JS engines. The tests execute fairly quickly under V8, but they take a long time under JavaScriptCore and SpiderMonkey. I understand that the full tests are desireable - would be nice if there was a way to run :all or :core benchmarks, or something like that.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-147] Method to specify externs that should be used by the the compiler in jar-ed non-gclosure/foreign javascript libs</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-147</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Please see discussion here:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://groups.google.com/d/topic/clojure/kqtCC_stbEU/discussion&quot;&gt;https://groups.google.com/d/topic/clojure/kqtCC_stbEU/discussion&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15215">CLJS-147</key>
            <summary>Method to specify externs that should be used by the the compiler in jar-ed non-gclosure/foreign javascript libs</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="davesann">Dave Sann</reporter>
                        <labels>
                    </labels>
                <created>Thu, 9 Feb 2012 18:21:40 -0600</created>
                <updated>Wed, 4 Apr 2012 17:53:24 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28071" author="dnolen" created="Wed, 4 Apr 2012 17:53:07 -0500"  >&lt;p&gt;Have you looked lein cljs-build. Does the extern feature there address the issue?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-61] All global vars (f.e. __dirname) of node.js should be in cljs.nodejs</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-61</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;To get access of all node.js goodies without using js* it would be nice to all global variables of node.js (&lt;a href=&quot;http://nodejs.org/docs/v0.4.11/api/globals.html#process&quot;&gt;http://nodejs.org/docs/v0.4.11/api/globals.html#process&lt;/a&gt;) were part of the module cljs/nodejs&lt;br/&gt;
Thanks&lt;/p&gt;</description>
                <environment>clojure 1.3.0-alpha-8 &lt;br/&gt;
clojurescript commit 22a64ff17b343b6c61039fcb66fd9acf34d98522&lt;br/&gt;
windows vista&lt;br/&gt;
node.js version v0.4.11</environment>
            <key id="14585">CLJS-61</key>
            <summary>All global vars (f.e. __dirname) of node.js should be in cljs.nodejs</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="jneira">Javier Neira Sanchez</reporter>
                        <labels>
                    </labels>
                <created>Sat, 27 Aug 2011 05:11:00 -0500</created>
                <updated>Wed, 4 Apr 2012 21:52:24 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-29] Automate pre-push testing</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-29</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Document the steps to follow to test that nothing is broken before pushing changes.&lt;/p&gt;

&lt;p&gt;Automate this process.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14522">CLJS-29</key>
            <summary>Automate pre-push testing</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="brentonashworth">Brenton Ashworth</reporter>
                        <labels>
                    </labels>
                <created>Fri, 22 Jul 2011 08:53:55 -0500</created>
                <updated>Wed, 4 Apr 2012 23:35:25 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28082" author="dnolen" created="Wed, 4 Apr 2012 23:35:25 -0500"  >&lt;p&gt;Do we need something more sophisticated then this: &lt;a href=&quot;http://github.com/clojure/clojurescript/wiki/Running-the-tests&quot;&gt;http://github.com/clojure/clojurescript/wiki/Running-the-tests&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-171] Implement Pods</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-171</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;It would be interesting to implement Pods in ClojureScript so that transients can become an implementation detail.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15301">CLJS-171</key>
            <summary>Implement Pods</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 28 Mar 2012 11:01:11 -0500</created>
                <updated>Sun, 17 Jun 2012 12:17:14 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-112] clojure.data.json -- Read and write JSON strings to/from clojure data structures</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-112</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Reading and writing JSON is a common requirement in both server- and client-side applications.  ClojureScript needs a way to transform ClojureScript data into JSON, and vice-versa.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15077">CLJS-112</key>
            <summary>clojure.data.json -- Read and write JSON strings to/from clojure data structures</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="bobby">Bobby Calderwood</assignee>
                                <reporter username="bobby">Bobby Calderwood</reporter>
                        <labels>
                    </labels>
                <created>Fri, 16 Dec 2011 15:53:42 -0600</created>
                <updated>Fri, 16 Dec 2011 15:53:42 -0600</updated>
                                                                            <due>Sat, 31 Dec 2011 00:00:00 -0600</due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                    <attachment id="10750" name="0001-Added-clojure.data.json.patch" size="2566" author="bobby" created="Fri, 16 Dec 2011 15:53:42 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-186] ClojureScript wiki/The-REPL-and-Evaluation-Environments - small issues</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-186</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I just worked through the &quot;The REPL and Evaluation Environments&quot; wiki page and had to make the following change to get the example to work.&lt;/p&gt;

&lt;p&gt;&amp;#8212; The-REPL-and-Evaluation-Environments.md.0    2012-04-19 17:40:23.000000000 -0400&lt;br/&gt;
+++ The-REPL-and-Evaluation-Environments.md    2012-04-19 17:40:48.000000000 -0400&lt;br/&gt;
@@ -57,6 +57,7 @@&lt;br/&gt;
   &amp;lt;body&amp;gt;&lt;br/&gt;
     &amp;lt;div id=&quot;content&quot;&amp;gt;&lt;br/&gt;
       &amp;lt;script type=&quot;text/javascript&quot; src=&quot;out/goog/base.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;
+      &amp;lt;script type=&quot;text/javascript&quot; src=&quot;out/goog/deps.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;
       &amp;lt;script type=&quot;text/javascript&quot; src=&quot;foo.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br/&gt;
       &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;&lt;br/&gt;
         goog.require(&apos;foo&apos;);&lt;/p&gt;

&lt;p&gt;Something else I noticed was that I didn&apos;t get the &quot;Starting server on port 9000&quot; message.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15344">CLJS-186</key>
            <summary>ClojureScript wiki/The-REPL-and-Evaluation-Environments - small issues</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bytesbymike">Mike Lamb</reporter>
                        <labels>
                        <label>documentation</label>
                        <label>wiki</label>
                    </labels>
                <created>Thu, 19 Apr 2012 17:13:08 -0500</created>
                <updated>Wed, 30 May 2012 16:26:07 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28657" author="netguy204" created="Wed, 30 May 2012 16:26:07 -0500"  >&lt;p&gt;In my environment, the deps.js script tag is appended to the page automatically as a side-effect of loading base.js.&lt;/p&gt;

&lt;p&gt;base.js (line 613 in my release)&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;&lt;span class=&quot;code-comment&quot;&gt;// Allow projects to manage the deps files themselves.
&lt;/span&gt;  &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (!goog.global.CLOSURE_NO_DEPS) {
    goog.importScript_(goog.basePath + &apos;deps.js&apos;);
  }&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-338] Incorrect implementation of IReduce by ArrayChunk</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-338</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;(reduce + (array-chunk (array 1 2 3 4) 1 3)) =&amp;gt; 2 (instead of 5)&lt;br/&gt;
(reduce + 0 (array-chunk (array 1 2 3 4) 1 3)) =&amp;gt; 3 (instead of 5)&lt;br/&gt;
(reduce + (array-chunk (array 1 2 3 4) 1 1)) =&amp;gt; 2 (instead of 0)&lt;/p&gt;

&lt;p&gt;In src/cljs/cljs/core.cljs, line #1817:&lt;br/&gt;
(deftype ArrayChunk &lt;span class=&quot;error&quot;&gt;&amp;#91;arr off end&amp;#93;&lt;/span&gt;&lt;br/&gt;
  ;; ...&lt;br/&gt;
  IReduce&lt;br/&gt;
  (-reduce &lt;span class=&quot;error&quot;&gt;&amp;#91;coll f&amp;#93;&lt;/span&gt;&lt;br/&gt;
    (ci-reduce coll f (aget arr off) (inc off))) ;; should be (if (&amp;lt; off end) (ci-reduce coll f (aget arr off) 1) 0)&lt;br/&gt;
  (-reduce &lt;span class=&quot;error&quot;&gt;&amp;#91;coll f start&amp;#93;&lt;/span&gt;&lt;br/&gt;
    (ci-reduce coll f start off))) ;; should be (ci-reduce coll f start 0)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15585">CLJS-338</key>
            <summary>Incorrect implementation of IReduce by ArrayChunk</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="antonf">Anton Frolov</reporter>
                        <labels>
                        <label>bug</label>
                    </labels>
                <created>Sun, 22 Jul 2012 02:48:09 -0500</created>
                <updated>Tue, 14 Aug 2012 06:29:35 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29134" author="dnolen" created="Tue, 14 Aug 2012 06:29:35 -0500"  >&lt;p&gt;Thanks for the report. ArrayChunk is an implementation detail - do these conditions actually arise?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-13] Implement ratios</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-13</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Clojure.java contains support for Ratio types.  It would be nice to have them in Clojurescript as well, but as far as I can tell this would be new development (please comment if I&apos;m wrong).  That is, there is no implementation of Ratio types in GClosure so this feature would need to be implemented from the ground up.  In additional to the Ratio type, the following corresponding functions would also need implementations:&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;`ratio?`&lt;/li&gt;
	&lt;li&gt;`numerator`&lt;/li&gt;
	&lt;li&gt;`denominator`&lt;/li&gt;
	&lt;li&gt;`rationalize`&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Plus the ratio type would need to be rolled into the existing mathematical frameworkings.&lt;/p&gt;





&lt;p&gt;Imported from github issue #66&lt;/p&gt;</description>
                <environment></environment>
            <key id="14506">CLJS-13</key>
            <summary>Implement ratios</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="stu">Stuart Halloway</reporter>
                        <labels>
                    </labels>
                <created>Sun, 12 Jul 2020 00:00:00 -0500</created>
                <updated>Mon, 3 Sep 2012 15:30:19 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="26926" author="dnolen" created="Mon, 10 Oct 2011 22:12:42 -0500"  >&lt;p&gt;What approach do you envision here given that we can&apos;t reliably detect integers in JavaScript?&lt;/p&gt;</comment>
                    <comment id="29346" author="bbloom" created="Mon, 3 Sep 2012 15:30:19 -0500"  >&lt;p&gt;See &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-370&quot; title=&quot;Incorrect behavior of integer? for integral floating point expressions&quot;&gt;&lt;del&gt;CLJS-370&lt;/del&gt;&lt;/a&gt; for more reliable integer detection&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-101] Node fails with :whitespace, works with :simple</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-101</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Running the example from &lt;a href=&quot;http://mmcgrana.github.com/2011/09/clojurescript-nodejs.html&quot;&gt;http://mmcgrana.github.com/2011/09/clojurescript-nodejs.html&lt;/a&gt;. Node fails if using &lt;tt&gt;:whitespace&lt;/tt&gt; optimizations, but works when using &lt;tt&gt;:simple&lt;/tt&gt;. The problem seems to be missing object literals. &lt;/p&gt;

&lt;p&gt;The source is:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;$ cat src/testing-cljs-node/hello.cljs 
(ns testing-cljs-node.hello)

(defn start [&amp;amp; _]
  (println &lt;span class=&quot;code-quote&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;))

(set! *main-cli-fn* start)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here is the compilation that results in the broken code:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;$ cljsc src/testing-cljs-node/hello.cljs &apos;{:optimizations :whitespace :pretty-print &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt; :target :nodejs}&apos; &amp;gt; out/hello.js
$ node out/hello.js

node.js:201
        &lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; e; &lt;span class=&quot;code-comment&quot;&gt;// process.nextTick error, or &apos;error&apos; event on first tick
&lt;/span&gt;              ^
TypeError: Cannot set property &apos;Unicode&apos; of undefined
    at &lt;span class=&quot;code-object&quot;&gt;Object&lt;/span&gt;.&amp;lt;anonymous&amp;gt; (/Users/ulrik/Source/testing-cljs-node/out/hello.js:487:21)
    at Module._compile (module.js:432:26)
    at &lt;span class=&quot;code-object&quot;&gt;Object&lt;/span&gt;..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.0 (module.js:470:10)
    at EventEmitter._tickCallback (node.js:192:40)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When changing the optimizations to &lt;tt&gt;:simple&lt;/tt&gt;, however, it works:&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;$ cljsc src/testing-cljs-node/hello.cljs &apos;{:optimizations :simple :pretty-print true :target :nodejs}&apos; &amp;gt; out/hello.js
$ node out/hello.js
The &quot;sys&quot; module is now called &quot;util&quot;. It should have a similar interface.
Hello World!
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The offending line 487 in the :whitespace code:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;goog.provide(&lt;span class=&quot;code-quote&quot;&gt;&quot;goog.string&quot;&lt;/span&gt;);
goog.provide(&lt;span class=&quot;code-quote&quot;&gt;&quot;goog.string.Unicode&quot;&lt;/span&gt;);
goog.string.Unicode = {NBSP:&lt;span class=&quot;code-quote&quot;&gt;&quot;\u00a0&quot;&lt;/span&gt;};  &lt;span class=&quot;code-comment&quot;&gt;// line 487&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In the working :simple code, the corresponding lines looks like this:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;goog.string = {};
goog.string.Unicode = {NBSP:&lt;span class=&quot;code-quote&quot;&gt;&quot;\u00a0&quot;&lt;/span&gt;};  &lt;span class=&quot;code-comment&quot;&gt;// line 367&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;


&lt;p&gt;If I fix that by adding a line that creates the object, I get another error on line 901:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;goog.provide(&lt;span class=&quot;code-quote&quot;&gt;&quot;goog.userAgent.jscript&quot;&lt;/span&gt;);
goog.require(&lt;span class=&quot;code-quote&quot;&gt;&quot;goog.string&quot;&lt;/span&gt;);
goog.userAgent.jscript.ASSUME_NO_JSCRIPT = &lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;;  &lt;span class=&quot;code-comment&quot;&gt;// line 901&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In the working code, it looks like this:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;goog.userAgent = {};
goog.userAgent.jscript = {};
goog.userAgent.jscript.ASSUME_NO_JSCRIPT = !1;  &lt;span class=&quot;code-comment&quot;&gt;// line 683&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And if I fix that, I get another error on line 975:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;goog.provide(&lt;span class=&quot;code-quote&quot;&gt;&quot;goog.debug.Error&quot;&lt;/span&gt;);
goog.debug.Error = function(opt_msg) {  &lt;span class=&quot;code-comment&quot;&gt;// line 975&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The working code:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;goog.debug = {};
goog.debug.Error = function(a) {  &lt;span class=&quot;code-comment&quot;&gt;// line 730&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;etc etc&lt;/p&gt;</description>
                <environment>NodeJS 0.6.1&lt;br/&gt;
MacOSX Lion</environment>
            <key id="15016">CLJS-101</key>
            <summary>Node fails with :whitespace, works with :simple</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="ulsa">Ulrik Sandberg</reporter>
                        <labels>
                    </labels>
                <created>Thu, 17 Nov 2011 16:12:41 -0600</created>
                <updated>Sat, 29 Sep 2012 17:36:29 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="28184" author="dnolen" created="Thu, 19 Apr 2012 23:49:50 -0500"  >&lt;p&gt;I&apos;m not sure how to fix this since the implementation of goog.provide has no meaning in Node.js. As a compromise perhaps we should complain if you try to target node with :whitespace optimizations?&lt;/p&gt;</comment>
                    <comment id="28187" author="ulsa" created="Fri, 20 Apr 2012 05:50:46 -0500"  >&lt;p&gt;Sure, that would probably be sufficient to point the user to what the problem really is.&lt;/p&gt;

&lt;p&gt;Perhaps it&apos;s obvious to everyone else that :whitespace doesn&apos;t make sense for Node, but it wasn&apos;t to me. But I can now deduce that :simple maybe resolves all provide/require into a single file, whereas :whitespace is an intermediate format that is not applicable for Node.&lt;/p&gt;</comment>
                    <comment id="28188" author="dnolen" created="Fri, 20 Apr 2012 11:29:04 -0500"  >&lt;p&gt;I don&apos;t think it&apos;s obvious at all and many people have encountered this issue.&lt;/p&gt;</comment>
                    <comment id="29192" author="tomoj" created="Thu, 16 Aug 2012 02:54:10 -0500"  >&lt;p&gt;Something that seems to work is&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;#!/usr/bin/nodejs
&lt;span class=&quot;code-keyword&quot;&gt;var&lt;/span&gt; _cljsGlobal_ = {};
with (_cljsGlobal_) {
&lt;span class=&quot;code-keyword&quot;&gt;var&lt;/span&gt; COMPILED = &lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;;
_cljsGlobal_.goog = {};
goog.global = _cljsGlobal_;
&lt;span class=&quot;code-comment&quot;&gt;// ... &lt;span class=&quot;code-keyword&quot;&gt;rest&lt;/span&gt; of source
&lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Does this cause any problems other than forcing e.g. &lt;tt&gt;;module.exports = &amp;#95;cljsGlobal&amp;#95;.mori;&lt;/tt&gt; in whitespace mode?&lt;/p&gt;</comment>
                    <comment id="29193" author="dnolen" created="Thu, 16 Aug 2012 08:30:00 -0500"  >&lt;p&gt;Using with is probably not an acceptable solution.&lt;/p&gt;</comment>
                    <comment id="29567" author="dnolen" created="Fri, 28 Sep 2012 22:08:21 -0500"  >&lt;p&gt;nclosure actually sounds kind of promising! Do we need to do anything more then recommend that people install nclosure if they want to work :whitespace or :none for the optimization level? If the nclosure approach is simple enough we could perhaps duplicate the strategy?&lt;/p&gt;</comment>
                    <comment id="29577" author="ohpauleez" created="Sat, 29 Sep 2012 17:27:29 -0500"  >&lt;p&gt;Haha I deleted the comment after I started digging into the code.  I&apos;ll try to capture my adventure here.&lt;/p&gt;

&lt;p&gt;CLJS&apos;s node compat layer is built in the opposite direction as nclojure - that is, we provide an externs file for node, and assume interop will happen that way.&lt;br/&gt;
nclosure&apos;s approach is to hijack the base interactions with goog, and decide to dispatch accordingly to Node or to the Closure lib, but it expects you&apos;re writing node-based code.  Everything is pushed into shared object off of the node `globals`.&lt;/p&gt;

&lt;p&gt;My hypothesis was: I can use the nclosure stuff, but allow ALL dispatching to go to closure (since we have externs file), which very well may call node stuff in the end.  The small shim would allow for skirting around the issues described here.&lt;/p&gt;

&lt;p&gt;I hacked together the js files and copied the result in to my CLJS-compiled-JS file.  All looked good except - the nclosure JS code needs to be inserted into the file before compilation happens.  The nclosure stuff redefines core goog interactions, which is why it works.  Technically, we could do a preamble hook when we&apos;re gathering all the the files together (much like how &lt;b&gt;main-cli-fn&lt;/b&gt; is at the tail of all files).&lt;/p&gt;

&lt;p&gt;That said, when inserted into the right spot, it prevents the errors.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-353] Use different primitives for array access and property/object access</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-353</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;In javascript, array access (array&lt;span class=&quot;error&quot;&gt;&amp;#91;index&amp;#93;&lt;/span&gt;) and property access (object&lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;quot;property&amp;quot;&amp;#93;&lt;/span&gt;) have the same syntax, hence aget/aset are used for both in the core library.&lt;/p&gt;

&lt;p&gt;But this isn&apos;t true for every target language. For example in Lua, there are no arrays, so if you want to have an array like container, array access will need to go through a function. &lt;/p&gt;

&lt;p&gt;This patch proposes to add new builtins : oget and oset (for obj-get obj-set) and use them where appropriate. The generated code will be the same for javascript, but will enable alternate backend implementers to treat both differently&lt;/p&gt;</description>
                <environment></environment>
            <key id="15619">CLJS-353</key>
            <summary>Use different primitives for array access and property/object access</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="raph_amiard">Rapha&#235;l AMIARD</reporter>
                        <labels>
                    </labels>
                <created>Thu, 9 Aug 2012 06:25:53 -0500</created>
                <updated>Wed, 29 Aug 2012 20:35:01 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29093" author="raph_amiard" created="Thu, 9 Aug 2012 07:24:21 -0500"  >&lt;p&gt;All test pass&lt;/p&gt;</comment>
                    <comment id="29095" author="dnolen" created="Thu, 9 Aug 2012 17:26:38 -0500"  >&lt;p&gt;Not sure I like the names oget/set. How about obj-get obj-set?&lt;/p&gt;</comment>
                    <comment id="29096" author="raph_amiard" created="Fri, 10 Aug 2012 04:08:32 -0500"  >&lt;p&gt;fine by me, added a new patch !&lt;/p&gt;</comment>
                    <comment id="29099" author="dnolen" created="Fri, 10 Aug 2012 11:07:42 -0500"  >&lt;p&gt;The patches are identical.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11417" name="0001-CLJS-353-Use-different-primitives-for-array-access-a.patch" size="4375" author="raph_amiard" created="Fri, 10 Aug 2012 04:08:12 -0500" />
                    <attachment id="11416" name="0001-CLJS-353-Use-different-primitives-for-array-access-a.patch" size="4375" author="raph_amiard" created="Thu, 9 Aug 2012 07:24:21 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-339] (inc nil) returns 1 instead of throwing an exception</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-339</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;(inc nil) =&amp;gt; 1 in ClojureScript&lt;br/&gt;
(inc nil) =&amp;gt; raise NullPointerException in Clojure&lt;/p&gt;

&lt;p&gt;I think that Clojure&apos;s behavior (throwing) makes more sense in this context.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15587">CLJS-339</key>
            <summary>(inc nil) returns 1 instead of throwing an exception</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="emezeske">Evan Mezeske</reporter>
                        <labels>
                        <label>bug</label>
                    </labels>
                <created>Mon, 23 Jul 2012 00:35:21 -0500</created>
                <updated>Mon, 23 Jul 2012 13:21:27 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29023" author="emezeske" created="Mon, 23 Jul 2012 00:44:05 -0500"  >&lt;p&gt;I observe that in my JS console, &quot;undefined + 1 =&amp;gt; NaN&quot; but &quot;null + 1 =&amp;gt; 1&quot;.  I assume this has something to do with this issue.&lt;/p&gt;</comment>
                    <comment id="29024" author="dnolen" created="Mon, 23 Jul 2012 12:30:28 -0500"  >&lt;p&gt;Do you have any suggestions on how to make this work without slowing arithmetic down? If not I&apos;m inclined to close this as Won&apos;t Fix.&lt;/p&gt;</comment>
                    <comment id="29025" author="emezeske" created="Mon, 23 Jul 2012 12:50:48 -0500"  >&lt;p&gt;I do not.  I haven&apos;t had a chance to put a lot of thought into it, though.&lt;/p&gt;

&lt;p&gt;I consider this kind of problem to be rather insidious.  Null is not a number, and treating it as zero &lt;b&gt;will&lt;/b&gt; lead to nasty bugs creeping into people&apos;s code.&lt;/p&gt;

&lt;p&gt;A historical anecdote: the C function &quot;int atoi(char* s)&quot; takes a string and returns the number it represents.  However, if the string can&apos;t be converted, it returns zero (which could also be a valid result for e.g. the string &quot;0&quot;).  Technically, it&apos;s possible to distinguish &quot;0 meaning error&quot; and &quot;0 meaning 0&quot; by taking additional steps after the function call, but in practice people forget to do this.  Thus, atoi is universally a disaster.  I have &lt;b&gt;literally&lt;/b&gt; seen the lights go off in a warehouse due to atoi&apos;s poor design (I used to work in building control).&lt;/p&gt;

&lt;p&gt;Treating null as zero will result in similar problems.  Someone forgets to check the result of a computation, it&apos;s null, and the program silently continues as if nothing is wrong.  Hello, data corruption.&lt;/p&gt;

&lt;p&gt;So I seriously urge you to not close this as Won&apos;t Fix, even if a performant solution is not yet obvious.  IMHO it&apos;s worth more thought.&lt;/p&gt;</comment>
                    <comment id="29026" author="dnolen" created="Mon, 23 Jul 2012 12:56:35 -0500"  >&lt;p&gt;Closing as Won&apos;t Fix doesn&apos;t mean we don&apos;t care, but this issue is simply a symptom of something much larger - punting on numerics. A ticket is the wrong place for this discussion as it has many nuances. It should be a part of a larger design for ClojureScript numerics. Without that larger discussion this ticket is likely to get stuck in limbo.&lt;/p&gt;</comment>
                    <comment id="29027" author="emezeske" created="Mon, 23 Jul 2012 12:59:20 -0500"  >&lt;p&gt;Fair enough!  I thought Won&apos;t Fix had stronger implications than that.  Do you know if there&apos;s already a design doc that addresses numerics?  Or should I start one?&lt;/p&gt;</comment>
                    <comment id="29028" author="fogus" created="Mon, 23 Jul 2012 13:04:24 -0500"  >&lt;p&gt;One place that this has burned me, that may warrant a separate card is &lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;(update-in some-map [:foo :bar] inc)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; where the key at that location did not exist. I would have preferred an exception rather than an broken 1.&lt;/p&gt;</comment>
                    <comment id="29029" author="emezeske" created="Mon, 23 Jul 2012 13:09:38 -0500"  >&lt;p&gt;@Fogus: Huh, that is the &lt;b&gt;exact&lt;/b&gt; same use-case that burned me &amp;#8211; I was using update-in/inc on a nested map.  The default value for my &lt;span class=&quot;error&quot;&gt;&amp;#91;:foo :bar&amp;#93;&lt;/span&gt; was, in fact, supposed to be zero, so it silently worked for me.  But when I moved that code from the client in my webapp (ClojureScript) to the server (Clojure), I found out that my original implementation was wonky.&lt;/p&gt;</comment>
                    <comment id="29030" author="dnolen" created="Mon, 23 Jul 2012 13:17:34 -0500"  >&lt;p&gt;It doesn&apos;t seem to me that you could do that safely without fnil + 0. I too hate JS&apos;s silent failures around numerics. Been hoping someone would tackle this challenge with gusto.&lt;/p&gt;</comment>
                    <comment id="29031" author="emezeske" created="Mon, 23 Jul 2012 13:21:26 -0500"  >&lt;p&gt;@David Nolen: Yeah, fnil would do the job.  In my case, I was calling update-in on what I thought was an initialized map, but it was actually nil.  update-in initialized each level of nesting with an empty map, and then inc was called on nil.  My fix was simply to initialize the nested maps like I meant to.  &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;</comment>
                    <comment id="29032" author="fogus" created="Mon, 23 Jul 2012 13:21:27 -0500"  >&lt;p&gt;David,&lt;br/&gt;
That was ultimately the solution, so I suppose we need to start advocating this pattern so that others might avoid the same fate. &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/wink.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-91] cljsc does not copy dojo dependencies</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-91</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When I run &quot;cljsc.bat src &amp;gt; hello.js&quot; on as program that uses Dojo it does not copy the Dojo dependencies to the out directory.  If I manually copy the Dojo dependencies it works fine.  I did create a dojo.jar file in the clojurescript/lib folder.&lt;/p&gt;

&lt;p&gt;Here is the program and html:&lt;/p&gt;

&lt;p&gt;(ns hello (:require &lt;span class=&quot;error&quot;&gt;&amp;#91;dojo :as dojo&amp;#93;&lt;/span&gt;))&lt;br/&gt;
(defn ^:export say-hello [] (dojo/place &quot;&amp;lt;div&amp;gt;hello world&amp;lt;/div&amp;gt;&quot; (dojo/body))) &lt;/p&gt;

&lt;p&gt;If this is really a bug as opposed to expected behavior, I can sign a CA and take a crack at fixing it.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14705">CLJS-91</key>
            <summary>cljsc does not copy dojo dependencies</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="jthomas">Jason Thomas</reporter>
                        <labels>
                    </labels>
                <created>Fri, 14 Oct 2011 22:05:52 -0500</created>
                <updated>Fri, 14 Oct 2011 22:05:52 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-167] Allow exiting CLJS repl with EOF/ctrl-D as well as :cljs/quit</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-167</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The CLJS repl is not a perfectly well-behaved command-line tool, in that it does not respect the convention of quitting by sending an EOF character with ctrl-D. This must be causing a small amount of irritation to everyone who uses the repl and is used to the customary amenities of any command-line tool; we could ease a little bit of frustration by supporting EOF. &lt;/p&gt;

&lt;p&gt;I&apos;ve attached a patch to improve this behavior, without affecting anything else.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15292">CLJS-167</key>
            <summary>Allow exiting CLJS repl with EOF/ctrl-D as well as :cljs/quit</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="amalloy">Alan Malloy</reporter>
                        <labels>
                    </labels>
                <created>Sat, 24 Mar 2012 20:26:48 -0500</created>
                <updated>Mon, 8 Oct 2012 11:20:23 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29614" author="franks" created="Mon, 8 Oct 2012 11:20:23 -0500"  >&lt;p&gt;I like the idea, but I normally start the cljs-repl from a clj-repl with &lt;/p&gt;

&lt;p&gt;user=&amp;gt; (run-repl-listen 9000 &quot;.lein-cljsbuild-repl&quot;)&lt;/p&gt;

&lt;p&gt;and then the proposed solution seems to exit both the cljs-repl and the clj-repl as well with a single ctrl-D, which increases the irritation with a small amount...&lt;/p&gt;

&lt;p&gt;Sorry, I&apos;m not well versed enough in the IO intricacies to provide an alternative.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11007" name="quit.patch" size="778" author="amalloy" created="Sat, 24 Mar 2012 20:26:48 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-210] Implement Var form, var-get, and var? in CLJS</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-210</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;See discussion of Vars in CLJS here: &lt;a href=&quot;http://dev.clojure.org/display/design/Dynamic+Binding&quot;&gt;http://dev.clojure.org/display/design/Dynamic+Binding&lt;/a&gt;&lt;br/&gt;
My goal is to eventually implement dynamic scope capture, via bound-fn and friends. The attached patch is a step in that direction.&lt;/p&gt;

&lt;p&gt;This patch adds support for parsing the (var foo) form. The #&apos; reader macro is provided by JVM Clojure.&lt;/p&gt;

&lt;p&gt;#&apos;foo emits code to construct a Var object. In this patch, each invocation of &apos;var will create a unique Var object. This means they are &apos;= by fully qualified symbol, but not &apos;identical?. Simple memoization would fix that, but I&apos;m not going to bother until I get to Dynamic Var objects.&lt;/p&gt;

&lt;p&gt;The main advantage of this level of Var support is for the interactive development convenience of being able to defer dereferencing top-levels. For example, (def fog (comp f #&apos;g)) will pick up redefinitions of &apos;g, but not of &apos;f.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15372">CLJS-210</key>
            <summary>Implement Var form, var-get, and var? in CLJS</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Fri, 27 Apr 2012 22:51:28 -0500</created>
                <updated>Sun, 28 Oct 2012 21:03:58 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28306" author="bbloom" created="Sat, 28 Apr 2012 22:07:59 -0500"  >&lt;p&gt;I found two issues with this patch:&lt;/p&gt;

&lt;p&gt;1) I never used the IVar that I declared :-P&lt;/p&gt;

&lt;p&gt;2) (apply #&apos;+ (range 100)) throws &quot;Invalid arity: 101&quot; &amp;#8211; this is related to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-211&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-211&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&apos;ll look into fixing both. However, we should discuss supporting variable arity protocol methods...&lt;/p&gt;</comment>
                    <comment id="28843" author="dnolen" created="Sun, 17 Jun 2012 12:17:02 -0500"  >&lt;p&gt;any support for reified vars is a low priority for the foreseeable future.&lt;/p&gt;</comment>
                    <comment id="29336" author="bbloom" created="Sat, 1 Sep 2012 19:46:14 -0500"  >&lt;p&gt;Reified vars (and binding frames!) are a requirement for a CPS transform to be correct with respect to dynamic bindings.&lt;/p&gt;</comment>
                    <comment id="29419" author="tomoj" created="Mon, 10 Sep 2012 17:11:30 -0500"  >&lt;p&gt;+1 towards bound-fn and friends. I had an explanation written here but now I see &quot;async Javascript (ie. nearly all Javascript) makes the binding macro effectively useless without bound-fn&quot;. Indeed.&lt;/p&gt;</comment>
                    <comment id="29850" author="bendlas" created="Sun, 28 Oct 2012 19:34:02 -0500"  >&lt;p&gt;bound-fn could also be implemented by setting / resetting bound vars before / after the wrapped fn, similar to binding. We would just need to add tracking of the currently rebound dynamic vars.&lt;br/&gt;
That should also be CPS - friendly, no?&lt;/p&gt;</comment>
                    <comment id="29858" author="tomoj" created="Sun, 28 Oct 2012 21:03:58 -0500"  >&lt;p&gt;I&apos;ve considered that and would love to see it happen.&lt;/p&gt;

&lt;p&gt;But what about:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(def ^:dynamic *foo* 3)
(set! *foo* 4)
(def f (bound-fn [] *foo*))
(set! *foo* 5)
(f)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11118" name="vars1.patch" size="6275" author="bbloom" created="Fri, 27 Apr 2012 22:51:28 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-349] cljs.compiler: No defmethod for emit-constant clojure.lang.LazySeq</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-349</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The cljs compiler errors when trying to emit-constant for a clojure.lang.LazySeq.&lt;/p&gt;

&lt;p&gt;Example : &lt;a href=&quot;https://www.refheap.com/paste/3901&quot;&gt;https://www.refheap.com/paste/3901&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here syms is defined as a LazySeq on line 3, then on line 7 it is quoted. The error is included in the refheap.&lt;/p&gt;

&lt;p&gt;Emitting a cljs.core.list for this type seems to solve the issue.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15606">CLJS-349</key>
            <summary>cljs.compiler: No defmethod for emit-constant clojure.lang.LazySeq</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="julienfantin">Julien Fantin</reporter>
                        <labels>
                    </labels>
                <created>Mon, 30 Jul 2012 18:06:31 -0500</created>
                <updated>Wed, 31 Oct 2012 22:10:24 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29322" author="dnolen" created="Fri, 31 Aug 2012 09:27:54 -0500"  >&lt;p&gt;Can you identify precisely where a LazySeq is getting emitted here? A LazySeq is not literal so this seems like a bug in the macro to me. I could be wrong. Thanks!&lt;/p&gt;</comment>
                    <comment id="29860" author="bendlas" created="Sun, 28 Oct 2012 21:31:28 -0500"  >&lt;p&gt;The lazy seq seems to be introduced on line 7, the &apos;~syms form&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;`(let [mappings# (into {} (map-indexed #(identity [%2 %1]) &apos;~syms))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Clojure allows lazy-seqs to be embedded: &lt;a href=&quot;https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L4538&quot;&gt;https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java#L4538&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As an aside: The relevant protocol is not literality, but the print-dup multimethod. Do / Should we have print-dup in CLJS?&lt;/p&gt;</comment>
                    <comment id="29883" author="bendlas" created="Wed, 31 Oct 2012 22:10:24 -0500"  >&lt;p&gt;Attached patch 0001 doesn&apos;t add a case for LazySeq, but folds two cases for PersistentList and Cons into one for ISeq.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11649" name="0001-CLJS-349-Allow-ISeq-to-be-emitted-by-macros-as-a-con.patch" size="2350" author="bendlas" created="Wed, 31 Oct 2012 22:10:24 -0500" />
                    <attachment id="11405" name="fixbug349.diff" size="922" author="julienfantin" created="Tue, 31 Jul 2012 11:03:42 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-407] cljs.import-test not run in test suite / ordering problem in the compiler</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-407</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The test code from &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-312&quot; title=&quot;Support :import&quot;&gt;&lt;del&gt;CLJS-312&lt;/del&gt;&lt;/a&gt; is not hooked up to the test suite, which is trivially fixed.&lt;/p&gt;

&lt;p&gt;Hooking up the test, however reveals a deeper problem (besides that it has a failing assumption):&lt;/p&gt;

&lt;p&gt;Presumably due to the goog.provides later in the files, the compiler orders the output wrong, which results in not provided errors.&lt;br/&gt;
Most interestingly, this problem goes away, when compiling from a prepopulated out directory, presumably because then the closure compiler handles the ordering?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15774">CLJS-407</key>
            <summary>cljs.import-test not run in test suite / ordering problem in the compiler</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                    </labels>
                <created>Wed, 24 Oct 2012 03:18:30 -0500</created>
                <updated>Fri, 21 Dec 2012 18:07:47 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29786" author="bendlas" created="Wed, 24 Oct 2012 03:23:52 -0500"  >&lt;p&gt;Patch hooks up the tests into the test suite. &lt;/p&gt;

&lt;p&gt;If you want to see the provide error, delete out before compiling. &lt;/p&gt;

&lt;p&gt;If you want to see the failing assertion from the original test, compile a second time.&lt;/p&gt;</comment>
                    <comment id="29791" author="dnolen" created="Wed, 24 Oct 2012 11:01:23 -0500"  >&lt;p&gt;In order to better understand tickets it best not to complect different issues &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt; If there&apos;s a problem not addressed by the patch please mention that in another ticket (and feel to reference that one here).&lt;/p&gt;

&lt;p&gt;I assume the patch fixes one thing, but reveals an unresolved issue, am I correct?&lt;/p&gt;</comment>
                    <comment id="29793" author="bendlas" created="Wed, 24 Oct 2012 11:26:04 -0500"  >&lt;p&gt;You&apos;re right, the ordering problem could be a different ticket. Sorry for that.&lt;/p&gt;

&lt;p&gt;To clarify, there are three issues at play:&lt;/p&gt;

&lt;p&gt;1) Part of the testsuite not executed (fixed by the patch)&lt;br/&gt;
2) The part that is now executed fails, didn&apos;t have time this morning to find out the original intention of Micha&#322;, can probably do tomorrow, if he doesn&apos;t pick it up.&lt;br/&gt;
3) The compilate is different depending on whether the .js file is cached in out/. This might require some deeper investigation.&lt;/p&gt;

&lt;p&gt;The reason I decided to roll it into one ticket is that only addressing one of 2) and 3) leaves the test suite failing. I almost wanted to reopen &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-312&quot; title=&quot;Support :import&quot;&gt;&lt;del&gt;CLJS-312&lt;/del&gt;&lt;/a&gt;, but decided against it, since it&apos;s water under the bridge.&lt;/p&gt;</comment>
                    <comment id="30285" author="dnolen" created="Fri, 21 Dec 2012 18:07:47 -0600"  >&lt;p&gt;I fixed some dependency ordering issue in another patch, would be nice to know if the ordering issues are addressed.  What part of this ticket is still relevant? This is why tickets that only address one thing at a time are nice &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11608" name="0001-CLJS-407-Hook-up-cljs.import-test-to-the-test-runner.patch" size="971" author="bendlas" created="Wed, 24 Oct 2012 03:23:52 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-428] Using */ inside of a docstring causes compiler to produce invalid JavaScript</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-428</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Due to how function docstrings are output by the ClojureScript compiler, the use of &lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;*/&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; within a docstring causes the compiler to produce invalid JavaScript, breaking compilation, since &apos;*/&apos; will close the docstring&apos;s JavaScript comment block and the remaining docstring text will be uncommented as a result.&lt;/p&gt;</description>
                <environment>Linux, lein-cljsbuild</environment>
            <key id="15856">CLJS-428</key>
            <summary>Using */ inside of a docstring causes compiler to produce invalid JavaScript</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="pandeiro">Murphy McMahon</reporter>
                        <labels>
                    </labels>
                <created>Sun, 25 Nov 2012 12:28:41 -0600</created>
                <updated>Sat, 22 Dec 2012 15:30:04 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30028" author="pandeiro" created="Sun, 25 Nov 2012 12:32:16 -0600"  >&lt;p&gt;I didn&apos;t realize JIRA treats asterisks as markup, so just for clarification: the characters that produce the defect are slash asterisk, ie JavaScript&apos;s block comment closing syntax.&lt;/p&gt;</comment>
                    <comment id="30300" author="dnolen" created="Sat, 22 Dec 2012 15:30:04 -0600"  >&lt;p&gt;Do you have a suggested fix for this?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-197] Minor additions to clojure.browser.dom</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-197</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;These two patches add clojure.browser.dom/remove-node and some missing docstrings to clojure.browser.dom.&lt;/p&gt;

&lt;p&gt;What else can be done in this namespace? I don&apos;t want to break things, but I think some functions (log, click) don&apos;t really belong there.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15355">CLJS-197</key>
            <summary>Minor additions to clojure.browser.dom</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="the-kenny">Moritz Ulrich</reporter>
                        <labels>
                    </labels>
                <created>Mon, 23 Apr 2012 09:42:07 -0500</created>
                <updated>Sun, 30 Sep 2012 10:14:48 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28244" author="dnolen" created="Mon, 23 Apr 2012 11:26:44 -0500"  >&lt;p&gt;It&apos;s not my impression that clojure.browser.dom is meant to be a library for general consumption (though I could be wrong). I think it&apos;s there to support browser REPL and the samples.&lt;/p&gt;</comment>
                    <comment id="28245" author="the-kenny" created="Mon, 23 Apr 2012 17:00:28 -0500"  >&lt;p&gt;You might be right. It&apos;s still a very useful piece of code and makes DOM manipulation much more &quot;clojure-y&quot;. I think it should be kept and improved.&lt;/p&gt;</comment>
                    <comment id="29580" author="edtsech" created="Sun, 30 Sep 2012 10:14:48 -0500"  >&lt;p&gt;As I can see clojure.browser.dom isn&apos;t used in clojure.browser.repl. Is it there only for samples?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11098" name="0001-add-clojure.browser.dom-remove-node.patch" size="858" author="the-kenny" created="Mon, 23 Apr 2012 09:42:07 -0500" />
                    <attachment id="11099" name="0002-docstrings-for-clojure.browser.dom.patch" size="1765" author="the-kenny" created="Mon, 23 Apr 2012 09:42:07 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-434] ClojureScript compiler prepends &quot;self__&quot; to defmulti forms when metadata in form of ^:field.</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-434</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Using the def form, with the specific metadata ^:field causes the cljs compiler&lt;br/&gt;
to prepend &quot;self__&quot; to the output js form.&lt;/p&gt;

&lt;p&gt;The browser (latest chrome/firefox) does not recognize &quot;self__&quot;.&lt;/p&gt;


&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;Test Case: Tested against master: 5ac1503
-------------

(ns test-def)

(def ^:foo e identity)
e
; test_def.e = cljs.core.identity;
; test_def.e;

(def ^:field f identity)
f
; test_def.f = cljs.core.identity;
; self__.test_def.f;
; Uncaught ReferenceError: self__ is not defined&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/4185793&quot;&gt;https://gist.github.com/4185793&lt;/a&gt;&lt;/p&gt;</description>
                <environment>Mac OS X (10.7), java version &amp;quot;1.6.0_37&amp;quot;, leiningen 2 preview 10, cljsbuild 0.2.9.&lt;br/&gt;
clojure/clojurescript master 01 December 2012 - 5ac1503</environment>
            <key id="15868">CLJS-434</key>
            <summary>ClojureScript compiler prepends &quot;self__&quot; to defmulti forms when metadata in form of ^:field.</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="andrewmcveigh">Andrew Mcveigh</reporter>
                        <labels>
                        <label>bug</label>
                    </labels>
                <created>Sat, 1 Dec 2012 17:34:52 -0600</created>
                <updated>Sun, 20 Jan 2013 00:54:25 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30133" author="bbloom" created="Sat, 1 Dec 2012 17:37:50 -0600"  >&lt;p&gt;code tags&lt;/p&gt;</comment>
                    <comment id="30460" author="dnolen" created="Sun, 20 Jan 2013 00:54:25 -0600"  >&lt;p&gt;This one is a bit annoying. We should probably use namespaced keywords internally.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-453] ArrayVector for small vectors</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-453</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Just like we have an &lt;tt&gt;ArrayMap&lt;/tt&gt; for small maps, I propose to have an &lt;tt&gt;ArrayVector&lt;/tt&gt; for small vectors.&lt;/p&gt;

&lt;p&gt;Use cases:&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;pair of values, e.g. coordinates, triples and other tuple values&lt;/li&gt;
	&lt;li&gt;returning multiple values from a function and subsequent destructuring in a caller fn&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;tt&gt;ArrayVector&lt;/tt&gt; has 100x faster vector creation compared to &lt;tt&gt;PersistentVector&lt;/tt&gt;.&lt;br/&gt;
With an &lt;tt&gt;^ArrayVector&lt;/tt&gt; hint, it offers more than 10x faster destructuring. Without it, it is still about 40% faster.&lt;/p&gt;

&lt;p&gt;Example of such destructuring:&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defn foo [a b] 
  [(+ a b) (- a b) (* a b)])

(defn bar []
  (let [[plus minus times] ^ArrayVector (foo 1 2)]
    (str &lt;span class=&quot;code-quote&quot;&gt;&quot;bla bla&quot;&lt;/span&gt; plus &lt;span class=&quot;code-quote&quot;&gt;&quot;blaah&quot;&lt;/span&gt; minus)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;


&lt;p&gt;I&apos;ve attached a patch with complete implementation of such vector, supporting all basic functionalities as well as transients. This patch also replaces default vector implementation with &lt;tt&gt;ArrayVector&lt;/tt&gt;, falling back to &lt;tt&gt;PersistentVector&lt;/tt&gt; for large vectors.&lt;/p&gt;

&lt;p&gt;ArrayVector implementation can also be found at array-vec branch at &lt;a href=&quot;https://github.com/wagjo/clojurescript/tree/array-vec&quot;&gt;https://github.com/wagjo/clojurescript/tree/array-vec&lt;/a&gt;&lt;/p&gt;</description>
                <environment>master cljs, chrome</environment>
            <key id="15944">CLJS-453</key>
            <summary>ArrayVector for small vectors</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="wagjo">Jozef Wagner</reporter>
                        <labels>
                    </labels>
                <created>Fri, 4 Jan 2013 12:51:52 -0600</created>
                <updated>Fri, 4 Jan 2013 16:54:48 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="30374" author="dnolen" created="Fri, 4 Jan 2013 16:54:48 -0600"  >&lt;p&gt;Thanks! This interesting, it would be helpful to see a more comprehensive set of benchmarks on jsperf.com.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11790" name="0001-ArrayVector-New-vector-implementation-for-small-vect.patch" size="9634" author="wagjo" created="Fri, 4 Jan 2013 12:51:52 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-452] clojure.browser.net: enable WebSockets?</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-452</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;In &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/cljs/clojure/browser/net.cljs&quot;&gt;https://github.com/clojure/clojurescript/blob/master/src/cljs/clojure/browser/net.cljs&lt;/a&gt; there&apos;s a nicely prepared support for WebSockets with the note&lt;/p&gt;

&lt;p&gt;;; WebSocket is not supported in the 3/23/11 release of Google&lt;br/&gt;
;; Closure, but will be included in the next release.&lt;/p&gt;

&lt;p&gt;is there anything preventing us from enable the support for WebSockets with the next release of ClojureScript?&lt;/p&gt;

&lt;p&gt;patch 0001-enable-websockets.patch do just enable the functionality. No test-cases included.&lt;/p&gt;

</description>
                <environment>clojurescript in browsers, wrapper for Google Closures WebSocket.</environment>
            <key id="15933">CLJS-452</key>
            <summary>clojure.browser.net: enable WebSockets?</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="claj">Linus Ericsson</reporter>
                        <labels>
                        <label>enhancement</label>
                    </labels>
                <created>Mon, 31 Dec 2012 09:12:47 -0600</created>
                <updated>Sun, 20 Jan 2013 00:51:30 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30458" author="dnolen" created="Sun, 20 Jan 2013 00:51:30 -0600"  >&lt;p&gt;Have you verified that this doesn&apos;t break browser REPL? Thanks!&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11783" name="0001-enabled-websockets.patch" size="1190" author="claj" created="Mon, 31 Dec 2012 09:12:47 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-450] (ns) within (do) inconsistent with Clojure behaviour</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-450</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;An &lt;tt&gt;(ns)&lt;/tt&gt; within a &lt;tt&gt;(do)&lt;/tt&gt; doesn&apos;t quite work as expected at the REPL:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;ClojureScript:cljs.user&amp;gt; (&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt; (ns foo) (def x 42))   
nil
ClojureScript:foo&amp;gt; x
nil
ClojureScript:cljs.user&amp;gt; cljs.user/x
42&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The Clojure equivalent:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;user=&amp;gt; (&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt; (ns foo) (def x 42))
#&apos;foo/x
foo=&amp;gt; x
42&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15929">CLJS-450</key>
            <summary>(ns) within (do) inconsistent with Clojure behaviour</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="harto">Stuart Campbell</reporter>
                        <labels>
                    </labels>
                <created>Thu, 27 Dec 2012 19:15:34 -0600</created>
                <updated>Sat, 5 Jan 2013 14:05:17 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30378" author="dnolen" created="Sat, 5 Jan 2013 14:05:17 -0600"  >&lt;p&gt;Looks like we need to do something similar to what is done in Clojure with top level do - &lt;a href=&quot;http://github.com/frenchy64/typed-clojure/pull/4&quot;&gt;http://github.com/frenchy64/typed-clojure/pull/4&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-381] Implement cljs$lang$applyTo on String.prototype instead of apply</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-381</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15708">CLJS-381</key>
            <summary>Implement cljs$lang$applyTo on String.prototype instead of apply</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Thu, 20 Sep 2012 11:18:56 -0500</created>
                <updated>Wed, 21 Nov 2012 10:19:57 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29985" author="laczoka" created="Tue, 20 Nov 2012 09:42:34 -0600"  >&lt;p&gt;Why is this needed?&lt;/p&gt;</comment>
                    <comment id="29988" author="dnolen" created="Tue, 20 Nov 2012 18:27:53 -0600"  >&lt;p&gt;It&apos;s a bit ugly, not to mention asking for clashes to implement apply instead of cljs$lang$applyTo.&lt;/p&gt;</comment>
                    <comment id="29997" author="laczoka" created="Wed, 21 Nov 2012 09:48:06 -0600"  >&lt;p&gt;So the expectation here is having&lt;/p&gt;

&lt;p&gt;(apply js/String &lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt;)&lt;/p&gt;

&lt;p&gt;result in &quot;1&quot;?&lt;/p&gt;

&lt;p&gt;Since js/String is a built-in function object (defmethod emit :fn ...) will not produce cljs$lang$applyTo magic.&lt;/p&gt;

&lt;p&gt;So is this sg for the compiler to do in a bootstrap step or rather a (set! String.prototype.cljs$lang$applyTo ...) hack?&lt;/p&gt;</comment>
                    <comment id="29999" author="dnolen" created="Wed, 21 Nov 2012 10:19:51 -0600"  >&lt;p&gt;Lowering the priority on this ticket. If have we have real Keywords &amp;amp; Symbols we don&apos;t need to bother with this.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-420] Unexpected behavior with dispatch on Keyword via protocols</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-420</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;At the moment if you create a protocol and expect it to be able to dispatch on keywords you need to do it in js/String, trying to extend on cljs.core.Keyword doesn&apos;t work as keywords are just Strings.&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;https://gist.github.com/4104635&quot;&gt;https://gist.github.com/4104635&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15829">CLJS-420</key>
            <summary>Unexpected behavior with dispatch on Keyword via protocols</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="mpenet">Max Penet</reporter>
                        <labels>
                        <label>bug</label>
                        <label>enhancement</label>
                    </labels>
                <created>Sun, 18 Nov 2012 05:32:49 -0600</created>
                <updated>Sun, 18 Nov 2012 15:27:05 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29962" author="dnolen" created="Sun, 18 Nov 2012 15:14:51 -0600"  >&lt;p&gt;This is a known issue which will have to wait for if and when Keywords and Symbols become proper types in ClojureScript.&lt;/p&gt;

&lt;p&gt;Extending js/Object is not recommended, if you actually need to add functionality to the base JS native types the convention is different from Clojure: default instead of Object, string instead of js/String. Please refer to core.cljs if you want more examples.&lt;/p&gt;</comment>
                    <comment id="29964" author="mpenet" created="Sun, 18 Nov 2012 15:27:05 -0600"  >&lt;p&gt;Thanks for the pointer about default and string, I didn&apos;t know about that. &lt;/p&gt;

&lt;p&gt;I reported the issue at the demand of bbloom. It does seem to be difficult to address without taking a (major) performance hit unfortunately.  &lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-412] Undeclared warning when defining protocols</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-412</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Evaluate the following in a ./script/repl session&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(require &apos;[cljs.compiler :as comp])
(require &apos;[cljs.analyzer :as ana])

;; This trickery seems to be the minimum logic to prepare a top level namespace
(def repl-env
  (binding [ana/*cljs-ns* &apos;cljs.user]
    (-&amp;gt; (ana/empty-env)
        (ana/analyze &apos;(ns some-ns))
        :env
        (assoc :ns (ana/get-namespace ana/*cljs-ns*)))))

(defn analyze [form]
  (binding [ana/*cljs-warn-on-undeclared* &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;]
    (ana/analyze repl-env form)))

(-&amp;gt; &apos;(defprotocol P
       (f [_ x]))
  analyze
  keys) ; keys is just so the output isn&apos;t huge&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The first time you evaluate that last form, you get an error like this one:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;WARNING: Use of undeclared Var some-ns/f at line 45&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You&apos;ll get similar errors each time you rename f and re-evaluate the form.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15802">CLJS-412</key>
            <summary>Undeclared warning when defining protocols</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                    </labels>
                <created>Mon, 29 Oct 2012 15:47:33 -0500</created>
                <updated>Fri, 21 Dec 2012 18:02:34 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="29870" author="bbloom" created="Mon, 29 Oct 2012 15:57:47 -0500"  >&lt;p&gt;Seems like the underlying issue is referring to a var while it is being defined. This form exhibits the same issue:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(def f [x] (aget f &lt;span class=&quot;code-quote&quot;&gt;&quot;prototype&quot;&lt;/span&gt;))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29871" author="bbloom" created="Mon, 29 Oct 2012 19:09:56 -0500"  >&lt;p&gt;The more I study this, the more I&apos;m convinced that &lt;b&gt;cljs-warn-on-undeclared&lt;/b&gt; is broken badly. Recursive functions (not using recur) generate this warning. As do certain parameters, locals, or other variable references that &lt;b&gt;are&lt;/b&gt; actually defined. The issue seems to stem from a conflation between symbol definition and resolution. resolve-var, resolve-existing-var, and (parse &apos;def ...) are all tangled in a crazy mutually recursive way. A lot of that stems from a recursive analyze call to yield init-expr and ultimately fn-var? inside of the def parse code.&lt;/p&gt;</comment>
                    <comment id="30284" author="dnolen" created="Fri, 21 Dec 2012 18:02:34 -0600"  >&lt;p&gt;Your first comment isn&apos;t valid code so I&apos;m not sure what you mean. When I enter it correctly into the REPL I get no warnings. I also get no warnings when defining at a protocol at the REPL. Do you have a specific minimal CLJS project that exhibits the issue?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-443] protocol dispatch performance enhancement &amp; extend-type to nil</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-443</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Currently we extend to nil to a bunch of protocols, while this was convenient for the initial implementation this has many unfortunate performance consequences. We should probably not extend nil to anything and deal with the nil value directly as is done in Clojure on the JVM. In addition we can add a special ^not-native type-hint. In critical paths this would allow us to inline calls directly to protocol implementations.&lt;/p&gt;

&lt;p&gt;Perhaps this could also allow us to hint with ^native to inline calls to the native tables.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15896">CLJS-443</key>
            <summary>protocol dispatch performance enhancement &amp; extend-type to nil</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Mon, 17 Dec 2012 16:34:50 -0600</created>
                <updated>Wed, 20 Feb 2013 08:40:07 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30625" author="dnolen" created="Wed, 20 Feb 2013 08:40:07 -0600"  >&lt;p&gt;^not-native support is already in master and does deliver performance benefits in the cases where native types need not be considered.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-469] Bad Exception message when multimethod has no dispatch-fn</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-469</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When a multi-fn has no dispatch method for a given value the current exception string prints the cljs.core/name function instead of the actual name of the mf. Minor bug but makes it kinda hard to track down which multi-fn actually failed to dispatch.&lt;/p&gt;

&lt;p&gt;The attached patch fixes that but directly accessing the name property of the multi-fn which is not very clean but better than the current error. AFAICT cljs doesnt have the clojure.lang.Named protocol, which would probably be cleaner.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16004">CLJS-469</key>
            <summary>Bad Exception message when multimethod has no dispatch-fn</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="thheller">Thomas Heller</reporter>
                        <labels>
                    </labels>
                <created>Tue, 12 Feb 2013 06:08:08 -0600</created>
                <updated>Wed, 20 Feb 2013 15:45:22 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30578" author="thheller" created="Tue, 12 Feb 2013 06:12:41 -0600"  >&lt;p&gt;Corrected the .patch&lt;/p&gt;</comment>
                    <comment id="30616" author="dnolen" created="Tue, 19 Feb 2013 08:54:07 -0600"  >&lt;p&gt;ClojureScript now has an INamed protocol&lt;/p&gt;</comment>
                    <comment id="30628" author="thheller" created="Wed, 20 Feb 2013 15:42:30 -0600"  >&lt;p&gt;Updated the .patch to implement INamed for cljs.core/MultiFn, turning its name into a real symbol.&lt;/p&gt;

&lt;p&gt;Tests pass but I dont know if that part of the code is actually tested.&lt;/p&gt;</comment>
                    <comment id="30629" author="thheller" created="Wed, 20 Feb 2013 15:43:53 -0600"  >&lt;p&gt;Oh, I&apos;m not quite sure that the way I resolved the namespace for the symbol is totally correct. It works but I had to dig a bit. &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11865" name="cljs-multi-fn-ex-msg-inamed.patch" size="2548" author="thheller" created="Wed, 20 Feb 2013 15:42:30 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-476] Reading a value from a module does not work if the module is def&apos;ed</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-476</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Referring to a value in a module can have a scoping issue when using the &quot;static accessor&quot; operator of module/VALUE_NAME. The static accessor works if the module is loaded into a local value but not if def&apos;ed. This example uses the mmap module for Node.js, and successfully reads the PROT_READ value:&lt;/p&gt;

&lt;p&gt;(ns stat.core)&lt;br/&gt;
(defn -main []&lt;br/&gt;
  (let &lt;span class=&quot;error&quot;&gt;&amp;#91;m (js/require &amp;quot;mmap&amp;quot;)&amp;#93;&lt;/span&gt;&lt;br/&gt;
    (println &quot;value: &quot; m/PROT_READ)))&lt;br/&gt;
(set! &lt;b&gt;main-cli-fn&lt;/b&gt; -main)&lt;/p&gt;

&lt;p&gt;This correctly prints &quot;value: 1&quot;&lt;/p&gt;

&lt;p&gt;However, if the value for m is def&apos;ed instead, then the compiler assumes that the reference to m is local to the function and therefore not defined:&lt;/p&gt;

&lt;p&gt;(ns stat.core)&lt;br/&gt;
(def m (js/require &quot;mmap&quot;))&lt;br/&gt;
(defn -main []&lt;br/&gt;
  (println &quot;value: &quot; m/PROT_READ))&lt;br/&gt;
(set! &lt;b&gt;main-cli-fn&lt;/b&gt; -main)&lt;/p&gt;

&lt;p&gt;/Users/pag/src/test/clj/stat/target/stat.js:12836&lt;br/&gt;
  return cljs.core.println.call(null, &quot;value: &quot;, m.PROT_READ)&lt;br/&gt;
                                                 ^&lt;br/&gt;
ReferenceError: m is not defined&lt;br/&gt;
    at Function.stat.core._main (/Users/pag/src/test/clj/stat/target/stat.js:12836:50)&lt;br/&gt;
    at cljs.core.apply.b (/Users/pag/src/test/clj/stat/target/stat.js:5621:14)&lt;br/&gt;
    at cljs.core.apply.a (/Users/pag/src/test/clj/stat/target/stat.js:5656:18)&lt;br/&gt;
    at Object.&amp;lt;anonymous&amp;gt; (/Users/pag/src/test/clj/stat/target/stat.js:12844:17)&lt;br/&gt;
    at Module._compile (module.js:449:26)&lt;br/&gt;
    at Object.Module._extensions..js (module.js:467:10)&lt;br/&gt;
    at Module.load (module.js:356:32)&lt;br/&gt;
    at Function.Module._load (module.js:312:12)&lt;br/&gt;
    at Module.runMain (module.js:492:10)&lt;br/&gt;
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)&lt;/p&gt;

&lt;p&gt;In this case, the value of m.PROT_READ should have been stat.core.m.PROT_READ.&lt;/p&gt;

&lt;p&gt;On the other hand, using . syntax fixes the scoping issue:&lt;br/&gt;
(ns stat.core)&lt;br/&gt;
(def m (js/require &quot;mmap&quot;))&lt;br/&gt;
(defn -main []&lt;br/&gt;
  (println &quot;value: &quot; (.-PROT_READ m)))&lt;br/&gt;
(set! &lt;b&gt;main-cli-fn&lt;/b&gt; -main)&lt;/p&gt;
</description>
                <environment>Clojure 1.5.0-RC16 &lt;br/&gt;
Clojurescript 0.0-1586 &lt;br/&gt;
java version &amp;quot;1.7.0_04&amp;quot; &lt;br/&gt;
Java(TM) SE Runtime Environment (build 1.7.0_04-b21) &lt;br/&gt;
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode) &lt;br/&gt;
OSX Mountain Lion 10.8.2</environment>
            <key id="16025">CLJS-476</key>
            <summary>Reading a value from a module does not work if the module is def&apos;ed</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="quoll">Paul Gearon</reporter>
                        <labels>
                        <label>Compiler</label>
                        <label>bug</label>
                        <label>scope</label>
                    </labels>
                <created>Fri, 22 Feb 2013 13:13:40 -0600</created>
                <updated>Fri, 22 Feb 2013 13:13:40 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-475] Node.js target fails with optimizations set to :none or :whitespace</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-475</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Compiling a hello world program for Node.js works fine if using optimizations of :advanced or :simple, but if using :none or :whitespace then an error will be reported for either &quot;goog undefined&quot; or &quot;goog.string&quot; undefined respectively.&lt;/p&gt;

&lt;p&gt;The program is shown here:&lt;/p&gt;

&lt;p&gt;(ns pr.core)&lt;br/&gt;
(defn -main []&lt;br/&gt;
  (println &quot;Hello World!&quot;))&lt;br/&gt;
(set! &lt;b&gt;main-cli-fn&lt;/b&gt; -main)&lt;/p&gt;

&lt;p&gt;This program is in src/cljs/pr/core.cljs. The repl line used to compile is:&lt;br/&gt;
(cljs.closure/build &quot;src/cljs&quot; {:output-to &quot;src/js/pr.js&quot; :target :nodejs :pretty-print true :optimizations :none})&lt;/p&gt;

&lt;p&gt;When compiled with optimizations of :none, the output is:&lt;/p&gt;

&lt;p&gt;$ node src/js/pr.js &lt;/p&gt;

&lt;p&gt;/Users/pag/src/test/clj/pr/src/js/pr.js:1&lt;br/&gt;
(function (exports, require, module, __filename, __dirname) { goog.addDependen&lt;br/&gt;
                                                              ^&lt;br/&gt;
ReferenceError: goog is not defined&lt;br/&gt;
    at Object.&amp;lt;anonymous&amp;gt; (/Users/pag/src/test/clj/pr/src/js/pr.js:1:63)&lt;br/&gt;
    at Module._compile (module.js:449:26)&lt;br/&gt;
    at Object.Module._extensions..js (module.js:467:10)&lt;br/&gt;
    at Module.load (module.js:356:32)&lt;br/&gt;
    at Function.Module._load (module.js:312:12)&lt;br/&gt;
    at Module.runMain (module.js:492:10)&lt;br/&gt;
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)&lt;/p&gt;

&lt;p&gt;&amp;#8212;&lt;br/&gt;
When running with optimizations of :whitespace the output is:&lt;/p&gt;

&lt;p&gt;$ node src/js/pr.js &lt;/p&gt;

&lt;p&gt;/Users/pag/src/test/clj/pr/src/js/pr.js:493&lt;br/&gt;
goog.string.Unicode = {NBSP:&quot;\u00a0&quot;};&lt;br/&gt;
                    ^&lt;br/&gt;
TypeError: Cannot set property &apos;Unicode&apos; of undefined&lt;br/&gt;
    at Object.&amp;lt;anonymous&amp;gt; (/Users/pag/src/test/clj/pr/src/js/pr.js:493:21)&lt;br/&gt;
    at Module._compile (module.js:449:26)&lt;br/&gt;
    at Object.Module._extensions..js (module.js:467:10)&lt;br/&gt;
    at Module.load (module.js:356:32)&lt;br/&gt;
    at Function.Module._load (module.js:312:12)&lt;br/&gt;
    at Module.runMain (module.js:492:10)&lt;br/&gt;
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)&lt;/p&gt;

&lt;p&gt;&amp;#8212;&lt;br/&gt;
When running with optimizations of either :simple or :advanced, the output is:&lt;/p&gt;

&lt;p&gt;$ node src/js/pr.js &lt;br/&gt;
Hello World!&lt;/p&gt;

&lt;p&gt;&amp;#8212;&lt;br/&gt;
I have included the two javascript output files that match the above errors.&lt;/p&gt;</description>
                <environment>Clojure 1.5.0-RC16&lt;br/&gt;
Clojurescript 0.0-1586&lt;br/&gt;
java version &amp;quot;1.7.0_04&amp;quot;&lt;br/&gt;
Java(TM) SE Runtime Environment (build 1.7.0_04-b21)&lt;br/&gt;
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)&lt;br/&gt;
OSX Mountain Lion 10.8.2</environment>
            <key id="16023">CLJS-475</key>
            <summary>Node.js target fails with optimizations set to :none or :whitespace</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="quoll">Paul Gearon</reporter>
                        <labels>
                        <label>Compiler</label>
                        <label>bug</label>
                    </labels>
                <created>Thu, 21 Feb 2013 16:34:15 -0600</created>
                <updated>Fri, 1 Mar 2013 13:26:48 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30641" author="quoll" created="Thu, 21 Feb 2013 16:40:49 -0600"  >&lt;p&gt;Remaining generated files&lt;/p&gt;</comment>
                    <comment id="30650" author="dnolen" created="Mon, 25 Feb 2013 15:46:41 -0600"  >&lt;p&gt;This is a known bug. We need goog.require/provide to actually mean something to Node.js. I&apos;m not sure how this can be made to work. I&apos;ve been hoping for a patch for this since ClojureScript was first announced, but I haven&apos;t seen anything yet.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11869" name="out-none.tar.gz" size="170636" author="quoll" created="Thu, 21 Feb 2013 16:40:49 -0600" />
                    <attachment id="11870" name="out-whitespace.tar.gz" size="125424" author="quoll" created="Thu, 21 Feb 2013 16:40:49 -0600" />
                    <attachment id="11867" name="pr.js-none" size="411" author="quoll" created="Thu, 21 Feb 2013 16:34:15 -0600" />
                    <attachment id="11868" name="pr.js-whitespace" size="758335" author="quoll" created="Thu, 21 Feb 2013 16:34:15 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-485] clojure.string/replace ignores regex flags</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-485</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The replace function in namespace clojure.string ignores regex flag provided in the match pattern. For example: &lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeHeader panelHeader&quot; style=&quot;border-bottom-width: 1px;&quot;&gt;&lt;b&gt;CLJS&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;clojure.string/replace &lt;span class=&quot;code-quote&quot;&gt;&quot;I am NOT matched&quot;&lt;/span&gt; #&lt;span class=&quot;code-quote&quot;&gt;&quot;(?i)not &quot;&lt;/span&gt; &quot;&quot;)
=&amp;gt; &lt;span class=&quot;code-quote&quot;&gt;&quot;I am NOT matched&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeHeader panelHeader&quot; style=&quot;border-bottom-width: 1px;&quot;&gt;&lt;b&gt;CLJ&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;clojure.string/replace &lt;span class=&quot;code-quote&quot;&gt;&quot;I am NOT matched&quot;&lt;/span&gt; #&lt;span class=&quot;code-quote&quot;&gt;&quot;(?i)not &quot;&lt;/span&gt; &quot;&quot;)
=&amp;gt; &lt;span class=&quot;code-quote&quot;&gt;&quot;I am matched&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The attached patch fixes this by parsing the m and i flags, if set, from the match object, instead of explicitly setting only &quot;g&quot;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16082">CLJS-485</key>
            <summary>clojure.string/replace ignores regex flags</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="starvinraven">Esa Virtanen</reporter>
                        <labels>
                        <label>bug</label>
                        <label>patch</label>
                        <label>test</label>
                    </labels>
                <created>Tue, 12 Mar 2013 07:27:06 -0500</created>
                <updated>Tue, 12 Mar 2013 10:36:36 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                                <attachments>
                    <attachment id="11909" name="0001-Take-regex-flags-m-i-into-account-in-clojure.string-.patch" size="2023" author="starvinraven" created="Tue, 12 Mar 2013 07:27:07 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-487] Make cljsc copy js sources to public directory</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-487</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I&apos;ll like cljsc to copy my js sources to the public directory as it does when compiling the cljs sources and make the correct entry in the generated deps.js so that the source can be retrievable with GET without extra configuration.&lt;/p&gt;</description>
                <environment>Linux jetty web server</environment>
            <key id="16092">CLJS-487</key>
            <summary>Make cljsc copy js sources to public directory</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="johnbendi">John Chijioke</reporter>
                        <labels>
                        <label>cljs</label>
                        <label>cljsc</label>
                        <label>js</label>
                    </labels>
                <created>Sat, 16 Mar 2013 00:03:41 -0500</created>
                <updated>Sat, 16 Mar 2013 00:03:41 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-490] cljs.closure/get-upstream-deps* should use RT/baseLoader instead of the TCCL</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-490</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;get-upstream-deps* currently uses the context classloader for the current thread, which causes issues when called from within a clojure runtime that has the intended classloader bound to Compiler.LOADER. Is there a specific reason to use the TCCL directly, or would calling RT.baseLoader suffice here? I&apos;m attaching a patch that uses baseLoader instead.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16109">CLJS-490</key>
            <summary>cljs.closure/get-upstream-deps* should use RT/baseLoader instead of the TCCL</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tcrawley">Toby Crawley</reporter>
                        <labels>
                    </labels>
                <created>Mon, 25 Mar 2013 09:04:10 -0500</created>
                <updated>Mon, 25 Mar 2013 10:12:47 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30817" author="tcrawley" created="Mon, 25 Mar 2013 10:12:47 -0500"  >&lt;p&gt;On further examination, this change may not make sense. Clojure itself uses the TCCL directly and ignores baseLoader when locating resources.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11928" name="2013-02-25-closure-RT-baseloader.diff" size="1079" author="tcrawley" created="Mon, 25 Mar 2013 09:09:06 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-257] optimize dead code elimination</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-257</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When compiling some code I noticed that cljs.core.apply doesn&apos;t get removed, I suspect this may trigger other fns to also not get eliminated. Needs investigation.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15445">CLJS-257</key>
            <summary>optimize dead code elimination</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 16 May 2012 12:36:57 -0500</created>
                <updated>Wed, 20 Feb 2013 08:43:49 -0600</updated>
                                                                            <due></due>
                    <votes>1</votes>
                        <watches>4</watches>
                        <comments>
                    <comment id="28507" author="dnolen" created="Wed, 16 May 2012 12:45:00 -0500"  >&lt;p&gt;It looks like removing apply manually eliminates apply-to as expected. Another dead code elimination issue - the global-hierarchy atom. No need to emit this if the user never uses multimethods.&lt;/p&gt;</comment>
                    <comment id="30627" author="dnolen" created="Wed, 20 Feb 2013 08:43:49 -0600"  >&lt;p&gt;Global hierarchy atom issue has been addressed in master.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-494] -lookup method call inside get macro and keyword invoke</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-494</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I noticed that -lookup method is called incorrectly at two places&lt;/p&gt;

&lt;p&gt;There are two -lookup methods defined for ILookup:&lt;/p&gt;

&lt;p&gt;cljs/cljs/core.cljs:198&lt;br/&gt;
(defprotocol ILookup&lt;br/&gt;
  (-lookup &lt;span class=&quot;error&quot;&gt;&amp;#91;o k&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;o k not-found&amp;#93;&lt;/span&gt;))&lt;/p&gt;

&lt;p&gt;clj/cljs/core.clj:426&lt;br/&gt;
(defmacro get&lt;br/&gt;
  (&lt;span class=&quot;error&quot;&gt;&amp;#91;coll k&amp;#93;&lt;/span&gt;&lt;br/&gt;
     `(-lookup ~coll ~k nil))&lt;br/&gt;
  (&lt;span class=&quot;error&quot;&gt;&amp;#91;coll k not-found&amp;#93;&lt;/span&gt;&lt;br/&gt;
     `(-lookup ~coll ~k ~not-found)))&lt;/p&gt;

&lt;p&gt;As you see, macro (get foo bar) never calls first method. In first case it supplies default argument (instead calling method with 2 arguments).&lt;/p&gt;

&lt;p&gt;Same for IFn and keywords:&lt;/p&gt;

&lt;p&gt;(deftype Keyword &lt;span class=&quot;error&quot;&gt;&amp;#91;k&amp;#93;&lt;/span&gt;&lt;br/&gt;
  IFn&lt;br/&gt;
  (invoke &lt;span class=&quot;error&quot;&gt;&amp;#91;_ coll&amp;#93;&lt;/span&gt;&lt;br/&gt;
    (when-not (nil? coll)&lt;br/&gt;
      (let &lt;span class=&quot;error&quot;&gt;&amp;#91;strobj (.-strobj coll)&amp;#93;&lt;/span&gt;&lt;br/&gt;
        (if (nil? strobj)&lt;br/&gt;
          (-lookup coll k nil)&lt;br/&gt;
          (aget strobj k)))))&lt;/p&gt;




</description>
                <environment>ClojureScript from githhub</environment>
            <key id="16136">CLJS-494</key>
            <summary>-lookup method call inside get macro and keyword invoke</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="skardan">Daniel Skarda</reporter>
                        <labels>
                    </labels>
                <created>Wed, 10 Apr 2013 07:47:33 -0500</created>
                <updated>Sun, 14 Apr 2013 17:57:38 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30936" author="wagjo" created="Fri, 12 Apr 2013 03:37:13 -0500"  >&lt;p&gt;Note that 2 argument &lt;tt&gt;get&lt;/tt&gt; guarantees to return &lt;tt&gt;nil&lt;/tt&gt; if the key is not found. This differs from e.g. 2 argument &lt;tt&gt;nth&lt;/tt&gt;, which should throw if key is not found (index is out of bounds). If 2 argument &lt;tt&gt;-lookup&lt;/tt&gt; does not guarantee to return &lt;tt&gt;nil&lt;/tt&gt; when key is not found, we should keep it as it is.&lt;/p&gt;</comment>
                    <comment id="30937" author="michalmarczyk" created="Fri, 12 Apr 2013 05:13:15 -0500"  >&lt;p&gt;&lt;tt&gt;get&lt;/tt&gt; insisting on &lt;tt&gt;nil&lt;/tt&gt; is definitely by design, as explained by Jozef. So, there is no bug here.&lt;/p&gt;

&lt;p&gt;As a matter of style it might be good to have &lt;tt&gt;get&lt;/tt&gt;-the-function and &lt;tt&gt;get&lt;/tt&gt;-the-macro do exactly the same thing; the question remains whether we should add an explicit &lt;tt&gt;nil&lt;/tt&gt; to the &lt;tt&gt;-lookup&lt;/tt&gt; call in &lt;tt&gt;get&lt;/tt&gt;-the-function or remove the &lt;tt&gt;nil&lt;/tt&gt; from the macro and just rely on &lt;tt&gt;-lookup&lt;/tt&gt; to do the right thing. I&apos;d probably go for the former to eliminate one unnecessary indirection (described below).&lt;/p&gt;

&lt;p&gt;About &lt;tt&gt;-lookup&lt;/tt&gt; &quot;doing the right thing&quot;: it certainly seems to me that &lt;tt&gt;-lookup&lt;/tt&gt;&apos;s contract is that of &lt;tt&gt;get&lt;/tt&gt;, even if this is not explicitly documented; also, in almost all instances the binary &lt;tt&gt;-lookup&lt;/tt&gt; delegates to ternary &lt;tt&gt;-lookup&lt;/tt&gt; or ternary &lt;tt&gt;-nth&lt;/tt&gt; (with &lt;tt&gt;nil&lt;/tt&gt; supplied as the final argument), the exception being &lt;tt&gt;TransientHashMap&lt;/tt&gt;&apos;s &lt;tt&gt;-lookup&lt;/tt&gt; which basically has that call inlined.&lt;/p&gt;

&lt;p&gt;Note that the binary &lt;tt&gt;-lookup&lt;/tt&gt; is called is also called in some other places in core.cljs.&lt;/p&gt;</comment>
                    <comment id="30960" author="dnolen" created="Sun, 14 Apr 2013 17:57:38 -0500"  >&lt;p&gt;Yes the main idea behind inlining get into -lookup was because they do essentially the same thing and we can remove a level of indirection. Similarly I&apos;d prefer that we add the nil to -lookup to avoid the the indirection if not given a not-found value.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-498] Reassess ObjectMap vs. PersistentArrayMap</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-498</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;On V8, PAMs are competitive with OMs. On other browsers the performance doesn&apos;t look as good but this is probably due to the higher order code in array-map-index-of. We should remove the higher order code and more closely follow the Java PAM implementation which has different lookup loops for the different cases.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16159">CLJS-498</key>
            <summary>Reassess ObjectMap vs. PersistentArrayMap</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Thu, 25 Apr 2013 11:46:20 -0500</created>
                <updated>Thu, 25 Apr 2013 11:46:20 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-503] v8 penalizes coercive nil?</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-503</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;We check for nil coercively with != and = because we want to handle both JavaScript null and undefined. These operations are slower than !== and ==. We would like to fix this but we can&apos;t simply make nil? not be coercive. The persistent data structures rely on this because they reach into JS Arrays that been allocated with a certain size. However in JS the empty slots are filled with undefined and null requiring the more expensive coercive nil? check.&lt;/p&gt;

&lt;p&gt;Making nil? non-coercive seems to bring less of performance boost in WebKit/Firefox Nightlies, but v8 is still the king and everyone seems to be moving towards it performance wise.&lt;/p&gt;

&lt;p&gt;One issue with making nil? non-coercive is that undefined will then fall through many of the core library functions. This means that users will need to be more careful in interop scenarios.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16177">CLJS-503</key>
            <summary>v8 penalizes coercive nil?</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sat, 4 May 2013 11:59:00 -0500</created>
                <updated>Sat, 4 May 2013 11:59:00 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-37] A way to create js objects and arrays from cljs maps and vectors, without copying if possible.</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-37</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;There&apos;s currently no convenient way to create a js object from a map.  Arrays can be created using the `array` function, but this always creates a copy.  In cases where you know the object or array will not be modified, it would be a shame to still pay for a copy of the object.  This is especially true when the cljs map or vector is a literal such that nothing else can have a reference to it anyway.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14534">CLJS-37</key>
            <summary>A way to create js objects and arrays from cljs maps and vectors, without copying if possible.</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="chouser@n01se.net">Chouser</reporter>
                        <labels>
                    </labels>
                <created>Tue, 26 Jul 2011 22:31:11 -0500</created>
                <updated>Tue, 18 Sep 2012 00:29:55 -0500</updated>
                                                                            <due></due>
                    <votes>4</votes>
                        <watches>7</watches>
                        <comments>
                    <comment id="26655" author="chouser@n01se.net" created="Tue, 26 Jul 2011 23:07:25 -0500"  >&lt;p&gt;My plan is a macro `as-js` that takes a single expression.  If it&apos;s a literal vector or map, it will expand to a js* form that will emit the appropriate array or object literal.  In the case of a map, all the keys must be constants (string, keyword, or symbol) in order to for this to work since literal object keys in javascript aren&apos;t evaluated.  Keyword and symbol keys would be converted to strings.&lt;/p&gt;

&lt;p&gt;If the argument to the `as-js` macro isn&apos;t a literal (or is a map with non-constant keys), the macro will expand to a call to an `-as-js` protocol fn.  When called on a vector, the vector will return its internal array.  When called on an ObjMap whose keys are all s convtrings, its internal strobj will be returned.  If any of the ObjMap&apos;s keys are not strings, then no appropriate js obj exists and a new one will be created, converting keys to strings just like the macro above.  HashMaps never contain an appropriate js object, so a new one would be created, again converting keys to strings.&lt;/p&gt;

&lt;p&gt;So in the common case of maps whose keys are known at compile time, such as (as-js {:foo &quot;bar&quot; :baz (str &quot;qu&quot; &quot;ux&quot;)}), this would at compile time become the js obj literal {&quot;foo&quot;: &quot;bar&quot;, &quot;baz&quot; cljs.core.str(&quot;qu&quot;, &quot;ux&quot;)}.  When the map or vector is not a literal, the least possible copying is done to produce the correct obj or array at runtime.&lt;/p&gt;


&lt;p&gt;...why do I have this annoying feeling that I may have done something too compound here?&lt;/p&gt;</comment>
                    <comment id="27181" author="dnolen" created="Fri, 28 Oct 2011 18:58:22 -0500"  >&lt;p&gt;Some work towards a solution: &lt;a href=&quot;https://github.com/clojure/clojurescript/compare/37-support-for-js-literals&quot;&gt;https://github.com/clojure/clojurescript/compare/37-support-for-js-literals&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="27182" author="chouser@n01se.net" created="Fri, 28 Oct 2011 20:53:51 -0500"  >&lt;p&gt;The macro-based solution I outlined above is unacceptable.&lt;/p&gt;

&lt;p&gt;The key issue is that Rich wants the reader to actually create the target type (js array or object) at read time, so special reader syntax is required.  I think the syntax was to be #js&lt;span class=&quot;error&quot;&gt;&amp;#91;1 2 3&amp;#93;&lt;/span&gt; for arrays and #js{k v k v} for objects.  Then of course there needs to be support in the compiler to generate code that evaluates the array elements and the object values (but not their keys, since the js literal produced can&apos;t have expressions for keys).&lt;/p&gt;</comment>
                    <comment id="27184" author="abrooks" created="Sat, 29 Oct 2011 12:28:13 -0500"  >&lt;p&gt;Does a special reader syntax ask for something readable across other platforms? i.e. #native[]/#native{}&lt;/p&gt;

&lt;p&gt;It seems that this would enhance the ability of ClojureScript libraries to be reusable across other platforms. It&apos;s easier to get around macro/function differences between platforms, however reader syntax differences would cut off the options for sharing source files between Clojure platforms.&lt;/p&gt;</comment>
                    <comment id="28100" author="budu" created="Wed, 11 Apr 2012 00:30:45 -0500"  >&lt;p&gt;Any update on this issue?&lt;/p&gt;</comment>
                    <comment id="28101" author="dnolen" created="Wed, 11 Apr 2012 14:41:55 -0500"  >&lt;p&gt;Waiting on whether Clojure becomes a JSON superset.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10296" name="0001-Add-as-js.-CLJS-37.patch" size="5364" author="chouser@n01se.net" created="Wed, 27 Jul 2011 22:17:36 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-510] Problems with :optimizations :whitespace &amp; :output-wrapper true</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-510</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When I have both output wrapper and :whitespace optimizations enabled, I get the following error when loading the produced output:&lt;/p&gt;

&lt;p&gt;goog.provide(&quot;goog.string&quot;);&lt;br/&gt;
goog.provide(&quot;goog.string.Unicode&quot;);&lt;br/&gt;
goog.string.Unicode = {NBSP:&quot;\u00a0&quot;};&lt;br/&gt;
   ^- Uncaught TypeError: Cannot set property &apos;Unicode&apos; of undefined&lt;/p&gt;

&lt;p&gt;Any ideas on what is going wrong? The error disappears if I use :simple or :advanced optimizations or if I set :output-wrapper to false (combined with any optimization level).&lt;/p&gt;</description>
                <environment>OS X 10.8.3, Google Chrome 28</environment>
            <key id="16205">CLJS-510</key>
            <summary>Problems with :optimizations :whitespace &amp; :output-wrapper true</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="arkx">Aku Kotkavuo</reporter>
                        <labels>
                    </labels>
                <created>Tue, 28 May 2013 10:09:14 -0500</created>
                <updated>Tue, 28 May 2013 10:30:10 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="31176" author="arkx" created="Tue, 28 May 2013 10:14:44 -0500"  >&lt;p&gt;ClojureScript version used is 0.0-1806.&lt;/p&gt;</comment>
                    <comment id="31179" author="arkx" created="Tue, 28 May 2013 10:30:10 -0500"  >&lt;p&gt;I&apos;m also seeing this:&lt;/p&gt;

&lt;p&gt;GET &lt;a href=&quot;http://localhost:7070/deps.js&quot;&gt;http://localhost:7070/deps.js&lt;/a&gt; 404 (Not Found)&lt;br/&gt;
  goog.writeScriptTag_&lt;br/&gt;
  goog.importScript_&lt;br/&gt;
  goog.importScript_(goog.basePath + &quot;deps.js&quot;)&lt;/p&gt;

&lt;p&gt;I have no idea what deps.js is, something related to Google Closure Compiler?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-511] The quick start guide should be written to use lein-cljsbuild</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-511</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The first line of the quick start guide ( &lt;a href=&quot;https://github.com/clojure/clojurescript/wiki/Quick-Start&quot;&gt;https://github.com/clojure/clojurescript/wiki/Quick-Start&lt;/a&gt; ) says:&lt;/p&gt;

&lt;p&gt;&quot;NOTE: The following instructions are useful if for some reason you need to use the ClojureScript compiler directly. For a more integrated workflow, Leiningen with lein-cljsbuild is recommended.&quot;&lt;/p&gt;

&lt;p&gt;This being the case, my first impression of the page is that this isn&apos;t really a quick start guide, but a way to do things in an obsolete way.  It should be updated to show the right way to get started instead of outsourcing the guide to the lein-cljsbuild page ( &lt;a href=&quot;https://github.com/emezeske/lein-cljsbuild&quot;&gt;https://github.com/emezeske/lein-cljsbuild&lt;/a&gt; ) or, perhaps the quick start guide link on &lt;a href=&quot;https://github.com/clojure/clojurescript&quot;&gt;https://github.com/clojure/clojurescript&lt;/a&gt; should directly link to the lein-cljsbuild page&lt;/p&gt;</description>
                <environment></environment>
            <key id="16207">CLJS-511</key>
            <summary>The quick start guide should be written to use lein-cljsbuild</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tietyt">Daniel Kaplan</reporter>
                        <labels>
                        <label>docs</label>
                        <label>documentation</label>
                    </labels>
                <created>Wed, 29 May 2013 13:10:17 -0500</created>
                <updated>Wed, 29 May 2013 13:10:17 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-514] Coordinate with Clojure on unsigned-bit-shift-right function name</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-514</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Gabriel Horner has mentioned in a comment on &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-827&quot; title=&quot;unsigned-bit-shift-right&quot;&gt;CLJ-827&lt;/a&gt; that &lt;tt&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/tt&gt;, currently known as &lt;tt&gt;bit-shift-right-zero-fill&lt;/tt&gt; in ClojureScript, will be introduced to Clojure under the name of &lt;tt&gt;unsigned-bit-shift-right&lt;/tt&gt;. Presumably this means a change to the ClojureScript name is in order.&lt;/p&gt;

&lt;p&gt;NB. &lt;tt&gt;bit-shift-right-zero-fill&lt;/tt&gt; is not marked private in ClojureScript, so this would technically be a breaking change. Perhaps the old function should stick around marked deprecated for a while?&lt;/p&gt;</description>
                <environment></environment>
            <key id="16214">CLJS-514</key>
            <summary>Coordinate with Clojure on unsigned-bit-shift-right function name</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="michalmarczyk">Micha&#322; Marczyk</reporter>
                        <labels>
                    </labels>
                <created>Fri, 31 May 2013 15:38:44 -0500</created>
                <updated>Sat, 1 Jun 2013 13:58:42 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="31193" author="dnolen" created="Sat, 1 Jun 2013 13:58:42 -0500"  >&lt;p&gt;It&apos;s early days yet for ClojureScript. I think it&apos;s OK to break and align with Clojure, it&apos;s a simple thing for users to fix.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-516] PersistentArrayMap keys uniqueness</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-516</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;PersistentArrayMap does not check the uniqueness of keys at init.&lt;/p&gt;

&lt;p&gt;PersistentHashSet also affected.&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;cljs.user&amp;gt; (array-map 1 10 2 20 1 100)
{1 10, 2 20, 1 100}

cljs.user&amp;gt; (hash-set 1 1 2 3)
#{1 1 2 3}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Simple (dirty?) workaround - init map by assoc.&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defn array-map
  [&amp;amp; keyvals]
  (apply assoc cljs.core.PersistentArrayMap/EMPTY keyvals))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="16217">CLJS-516</key>
            <summary>PersistentArrayMap keys uniqueness</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="skupri">Sergey Kupriyanov</reporter>
                        <labels>
                        <label>bug</label>
                    </labels>
                <created>Wed, 5 Jun 2013 04:07:23 -0500</created>
                <updated>Wed, 5 Jun 2013 08:40:59 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="31214" author="dnolen" created="Wed, 5 Jun 2013 08:40:59 -0500"  >&lt;p&gt;Yes that solution is likely too slow. Clojure already solved this problem, we should probably port the existing solution.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-509] Spurious warning about symbol not being a protocol</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-509</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;&quot;lein cljsbuild&quot; generates &quot;Symbol X is not a protocol&quot; warning. The following code snippet reproduces the issue. Renaming &quot;my.foo&quot; namespace to &quot;foo&quot; compiles with no warning.&lt;/p&gt;

&lt;p&gt;;; &lt;a href=&quot;file::&quot;&gt;file::&lt;/a&gt; foo.cljs&lt;br/&gt;
(ns my.foo)&lt;/p&gt;

&lt;p&gt;(defprotocol IFoo&lt;br/&gt;
  (bar&lt;span class=&quot;error&quot;&gt;&amp;#91;this&amp;#93;&lt;/span&gt;))&lt;/p&gt;

&lt;p&gt;;; file: fubar.cljs&lt;br/&gt;
(ns fubar&lt;br/&gt;
  (:require&lt;br/&gt;
   &lt;span class=&quot;error&quot;&gt;&amp;#91;my.foo :as foo&amp;#93;&lt;/span&gt;))&lt;/p&gt;

&lt;p&gt;(deftype FuBar []&lt;br/&gt;
  foo/IFoo&lt;br/&gt;
  (bar &lt;span class=&quot;error&quot;&gt;&amp;#91;this&amp;#93;&lt;/span&gt;))&lt;/p&gt;

&lt;p&gt;cljs output:&lt;br/&gt;
WARNING: Symbol foo/IFoo is not a protocol at line 5 src/fubar.cljs&lt;/p&gt;
</description>
                <environment>Clojure 1.5.1, ClojureScript, cljsbuild 0.3.2</environment>
            <key id="16196">CLJS-509</key>
            <summary>Spurious warning about symbol not being a protocol</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="praki">Praki Prakash</reporter>
                        <labels>
                    </labels>
                <created>Tue, 21 May 2013 09:22:44 -0500</created>
                <updated>Thu, 13 Jun 2013 02:17:57 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="31247" author="trptcolin" created="Tue, 11 Jun 2013 11:17:00 -0500"  >&lt;p&gt;We&apos;re seeing this warning as well.&lt;/p&gt;

&lt;p&gt;The code path that produces this warning appears to imply that the var could be found via `cljs.analyzer/resolve-existing-var`, but just didn&apos;t have the :protocol-symbol key attached. At first I suspected that .indexOf here should be .lastIndexOf: &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/61dee726a6878539f9c07b1eb49abc69e5c3cc21/src/clj/cljs/analyzer.clj#L172-L191&quot;&gt;https://github.com/clojure/clojurescript/blob/61dee726a6878539f9c07b1eb49abc69e5c3cc21/src/clj/cljs/analyzer.clj#L172-L191&lt;/a&gt; &lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;cljs.user=&amp;gt; (cljs.analyzer/resolve-existing-&lt;span class=&quot;code-keyword&quot;&gt;var&lt;/span&gt; (cljs.repl.rhino/repl-env) &apos;foo.bar.Baz)
{:ns foo, :name foo/bar.Baz}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But even if that&apos;s the case (and I&apos;m not really sure it is), it seems like the my.foo/IFoo case ought to take the first path in resolve-var&apos;s cond, so it&apos;s probably unrelated.&lt;/p&gt;

&lt;p&gt;There are no discernible problems at runtime, only when (auto-)building. I wonder whether this is limited to code reloading scenarios like the lein-cljsbuild auto-builder. Protocols in JVM clojure certainly have lots of code-reloading caveats around them.&lt;/p&gt;

&lt;p&gt;I only dug into it a bit before needing to give up for now, but hopefully this helps. &lt;/p&gt;</comment>
                    <comment id="31249" author="dnolen" created="Wed, 12 Jun 2013 02:36:28 -0500"  >&lt;p&gt;Colin thanks for the additional information. Will try to find some time to look into it.&lt;/p&gt;</comment>
                    <comment id="31252" author="mtyaka" created="Wed, 12 Jun 2013 16:38:26 -0500"  >&lt;p&gt;The reason for these warnings is that under some circumstances, some of the files that don&apos;t require compilation (as determined by &lt;tt&gt;cljs.compiler/requires-compilation?&lt;/tt&gt;), don&apos;t get properly analyzed.&lt;/p&gt;

&lt;p&gt;Normally when analyzing a file, the analyzer will also analyze all of the namespaces that the current file/namespace depends on (using &lt;tt&gt;cljs.analyzer/analyze-deps&lt;/tt&gt;). The analyzer tries to avoid analyzing the same namespace twice by checking whether the namespace is already present in &lt;tt&gt;cljs.analyzer/namespaces&lt;/tt&gt;, see: &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/f80956d90f455810be140cfec1632f55254385a5/src/clj/cljs/analyzer.clj#L615&quot;&gt;https://github.com/clojure/clojurescript/blob/f80956d90f455810be140cfec1632f55254385a5/src/clj/cljs/analyzer.clj#L615&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When trying to compile a file that doesn&apos;t require compilation, &lt;tt&gt;cljs.compiler/compile-file&lt;/tt&gt; delegates to &lt;tt&gt;cljs.compiler/parse-ns&lt;/tt&gt;, which uses &lt;tt&gt;cljs.analyzer/analyze&lt;/tt&gt; to parse the &lt;tt&gt;ns&lt;/tt&gt; form. Once it reaches the &lt;tt&gt;ns&lt;/tt&gt; form, it stops further analysis of the file. Analyzing the &lt;tt&gt;ns&lt;/tt&gt; form has the side effect of populating &lt;tt&gt;cljs.analyzer/namespaces&lt;/tt&gt; with the basic namespace info (&lt;a href=&quot;https://github.com/clojure/clojurescript/blob/f80956d90f455810be140cfec1632f55254385a5/src/clj/cljs/analyzer.clj#L710-L721&quot;&gt;https://github.com/clojure/clojurescript/blob/f80956d90f455810be140cfec1632f55254385a5/src/clj/cljs/analyzer.clj#L710-L721&lt;/a&gt;), preventing the analyzer from subsequently fully analyzing the file in case another file that gets compiled depends on it.&lt;/p&gt;

&lt;p&gt;In the example above, the warning will get printed when compiling foo.cljs and fubar.cljs for the second time, after fubar.cljs has changed since first compilation, but foo.cljs hasn&apos;t. It will only happen if &lt;tt&gt;compile-file&lt;/tt&gt; is called on foo.cljs before fubar.cljs. Since foo.cljs doesn&apos;t require compilation, only its &lt;tt&gt;ns&lt;/tt&gt; form will get analyzed, and basic namespace info put into &lt;tt&gt;cljs.analyzer/namespaces&lt;/tt&gt;. When &lt;tt&gt;compile-file&lt;/tt&gt; gets called on fubar.cljs later, the analyzer will see that fubar.cljs depends on foo.cljs, but will not go on to analyze it since &lt;tt&gt;&apos;foo.cljs&lt;/tt&gt; will already be present in &lt;tt&gt;cljs.analyzer/namespaces&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;I&apos;m attaching a patch that tries to reverse the change that &lt;tt&gt;parse-ns&lt;/tt&gt; makes to &lt;tt&gt;cljs.analyzer/namespaces&lt;/tt&gt;. It is the simplest patch I could come up with, although it would probably be more appropriate to not use &lt;tt&gt;cljs.analyzer/analyze&lt;/tt&gt; to parse the namespace form in &lt;tt&gt;parse-ns&lt;/tt&gt; at all, but instead create a separate function (&lt;tt&gt;cljs.analyzer/analyze-file-ns&lt;/tt&gt; ( ? )) whose only purpose would be to gather file&apos;s namespace info, without changing the analyzer&apos;s state.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="12028" name="CLJS-509-clean-up-after-parse-ns.diff" size="2493" author="mtyaka" created="Thu, 13 Jun 2013 02:17:57 -0500" />
                    <attachment id="12001" name="foo.cljs" size="46" author="praki" created="Tue, 21 May 2013 09:22:44 -0500" />
                    <attachment id="12002" name="fubar.cljs" size="90" author="praki" created="Tue, 21 May 2013 09:22:44 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-522] Make REPL reflection functions synchronous</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-522</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Pending &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-489&quot; title=&quot;Browser-REPL automation &amp;amp; usability enhancements&quot;&gt;CLJS-489&lt;/a&gt;, make it so that any &quot;reflection&quot; calls (&lt;tt&gt;doc&lt;/tt&gt;, &lt;tt&gt;macroexpand&lt;/tt&gt;, and &lt;tt&gt;meta&lt;/tt&gt; so far) print/return their results synchronously, so that the REPL prompt doesn&apos;t impinge.&lt;/p&gt;

&lt;p&gt;(Apparently goog xhr API calls can be made synchronous easily.)&lt;/p&gt;</description>
                <environment></environment>
            <key id="16234">CLJS-522</key>
            <summary>Make REPL reflection functions synchronous</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="cemerick">Chas Emerick</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Sun, 16 Jun 2013 22:30:01 -0500</created>
                <updated>Sun, 16 Jun 2013 22:30:01 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                                <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-521] Pass along compiler options added to REPL environments</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-521</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Many of the compiler options (esp. &lt;tt&gt;:libs&lt;/tt&gt;, &lt;tt&gt;:externs&lt;/tt&gt;, etc.) that are accepted by the compiler (and commonly specified via lein-cljsbuild options) should also apply to ClojureScript REPL sessions.  Since all known &lt;tt&gt;IJavaScriptEnv&lt;/tt&gt; implementations are records, the most straightforward way to do this is to allow one to add such options to REPL environment records, which can then be passed on to the compiler in &lt;tt&gt;cljs.repl&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;Making this change has had a big impact on my personal ClojureScript productivity.  Interested in the patch?&lt;/p&gt;</description>
                <environment></environment>
            <key id="16233">CLJS-521</key>
            <summary>Pass along compiler options added to REPL environments</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Sun, 16 Jun 2013 22:22:22 -0500</created>
                <updated>Mon, 17 Jun 2013 13:44:39 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="31291" author="dnolen" created="Mon, 17 Jun 2013 12:23:19 -0500"  >&lt;p&gt;Patch welcome!&lt;/p&gt;</comment>
                    <comment id="31297" author="cemerick" created="Mon, 17 Jun 2013 13:44:39 -0500"  >&lt;p&gt;Awesome; will put one up once the disposition of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-489&quot; title=&quot;Browser-REPL automation &amp;amp; usability enhancements&quot;&gt;CLJS-489&lt;/a&gt; is settled, since the browser-repl impl details are obviously implicated somewhat.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-489] Browser-REPL automation &amp; usability enhancements</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-489</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The current implementation of browser-REPL yields a number of usability problems:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;only one browser-REPL can be used at a time due to globals used to track REPL state&lt;/li&gt;
	&lt;li&gt;Browser-REPL currently involves two web servers: the one you&apos;re serving your app from, and the one that the REPL itself uses
	&lt;ul&gt;
		&lt;li&gt;This makes setup difficult in the interactive case &#8212; especially for newcomers, the less experienced, or the tired&lt;/li&gt;
		&lt;li&gt;Perhaps more significantly, coordinating the two servers and their associated state is less than easy if one wants to automate the browser-REPL for testing of DOM-related cljs code&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Attached is a patch that addresses these issues:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Multiple concurrent browser-REPLs can be safely used&lt;/li&gt;
	&lt;li&gt;The browser-REPL&apos;s HTTP server is now always-on&lt;/li&gt;
	&lt;li&gt;Replaced the custom HTTP server with com.sun.net.httpserver.* bits, which are a part of J2SE 6+, not random implementation details &lt;a href=&quot;http://docs.oracle.com/javase/7/docs/technotes/guides/net/enhancements-6.0.html&quot;&gt;http://docs.oracle.com/javase/7/docs/technotes/guides/net/enhancements-6.0.html&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Each browser-REPL session supports a new top-level &quot;entry&quot; URL that can be used to easily start the REPL in a browser or other JS runtime (i.e. you don&apos;t need to have a separate webapp running to initiate the browser-REPL connection)&lt;/li&gt;
	&lt;li&gt;The entry (and REPL) URLs are available in slots on the browser-REPL&apos;s environment, making it trivial to automate browser-REPL sessions with e.g. phantomjs or a headless chromium or etc.  This pattern is implemented by a new `exec-env` function; the default is to start the REPL in phantomjs using a temporary script, but it&apos;s super-easy to use a regular browser. e.g. this will use Chrome on OS X in the background:&lt;/li&gt;
&lt;/ul&gt;


&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(cljs.repl/repl (cljs.repl.browser/exec-env
                  :exec-cmds [&lt;span class=&quot;code-quote&quot;&gt;&quot;open&quot;&lt;/span&gt; &lt;span class=&quot;code-quote&quot;&gt;&quot;-ga&quot;&lt;/span&gt; &lt;span class=&quot;code-quote&quot;&gt;&quot;/Applications/Google Chrome.app&quot;&lt;/span&gt;]))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;(This enhancement has been discussed previously {here|http://groups.google.com/group/clojurescript/browse_thread/thread/963d6b7334bdf61c}.)&lt;/p&gt;</description>
                <environment></environment>
            <key id="16101">CLJS-489</key>
            <summary>Browser-REPL automation &amp; usability enhancements</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Fri, 22 Mar 2013 02:32:31 -0500</created>
                <updated>Tue, 18 Jun 2013 09:14:49 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30803" author="cemerick" created="Fri, 22 Mar 2013 03:24:49 -0500"  >&lt;p&gt;Aside: if this is accepted, a fair bit of documentation on the github wiki (and maybe dev.clojure.org wiki?) will need to be updated (something I&apos;m happy to do FWIW).&lt;/p&gt;</comment>
                    <comment id="30805" author="cemerick" created="Fri, 22 Mar 2013 15:54:49 -0500"  >&lt;p&gt;I just discovered that &lt;tt&gt;cljs.repl.reflect&lt;/tt&gt; depends directly upon &lt;tt&gt;cljs.repl.server&lt;/tt&gt;.  I&apos;ll have to unroll that in order to be able to remove the latter...&lt;/p&gt;</comment>
                    <comment id="30847" author="brentonashworth" created="Fri, 29 Mar 2013 17:24:37 -0500"  >&lt;p&gt;Thanks for working on this Chas. This has been in need of improvement for a long time. Can&apos;t wait to take this for a spin.&lt;/p&gt;</comment>
                    <comment id="30849" author="cemerick" created="Sat, 30 Mar 2013 08:43:04 -0500"  >&lt;p&gt;I&apos;ve never used &lt;tt&gt;cljs.repl.reflect&lt;/tt&gt;, so I had to take a close look at what it supports, thus the delay.  &lt;/p&gt;

&lt;p&gt;First, background: &lt;tt&gt;cljs.repl.reflect&lt;/tt&gt; provides backing support for two operations:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;getting the documentation for a cljs &quot;var&quot; (i.e. any top-level function or other definition), and&lt;/li&gt;
	&lt;li&gt;obtaining the macroexpansion of a Clojure macro as provided by the ClojureScript analyzer&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;These operations are exposed within the ClojureScript REPL via &lt;tt&gt;clojure.reflect/doc&lt;/tt&gt; and &lt;tt&gt;clojure.reflect/macroexpand&lt;/tt&gt;, respectively.&lt;/p&gt;

&lt;p&gt;I see a couple of issues here.  First, aside from the problems in their current implementations (e.g. &lt;tt&gt;clojure.reflect/doc&lt;/tt&gt; does not re-sugar arglists prior to printing them), both of these operations (&lt;tt&gt;doc&lt;/tt&gt; and &lt;tt&gt;macroexpand&lt;/tt&gt;) can simply be provided by macros, eliminating any dependence on a particular REPL environment/implementation.  e.g., this does well for `doc`:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defmacro doc
  [fq-sym]
  (let [meta (get-meta fq-sym)]
    `(&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt;
       (println &lt;span class=&quot;code-quote&quot;&gt;&quot;-------------------------&quot;&lt;/span&gt;)
       (println ~(:name meta))
       (println ~(pr-str (map (partial mapv :name) (read-string (:method-params meta)))))
       (println &lt;span class=&quot;code-quote&quot;&gt;&quot; &quot;&lt;/span&gt; ~(:doc meta)))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A similar macro for &lt;tt&gt;macroexpand&lt;/tt&gt; is trivial to produce.&lt;/p&gt;

&lt;p&gt;Second, &lt;tt&gt;doc&lt;/tt&gt; and &lt;tt&gt;macroexpand&lt;/tt&gt; just don&apos;t belong in &lt;tt&gt;clojure.reflect&lt;/tt&gt;.  AFAICT, &lt;tt&gt;clojure.*&lt;/tt&gt; namespaces in ClojureScript should be maximally isomorphic to their Clojure namesakes.  This means that &lt;tt&gt;doc&lt;/tt&gt; should be in &lt;tt&gt;clojure.repl&lt;/tt&gt;; placing &lt;tt&gt;macroexpand&lt;/tt&gt; is a little trickier, but perhaps a default-referred macro in &lt;tt&gt;cljs.core&lt;/tt&gt; would make sense? (&lt;tt&gt;clojure.core/macroexpand&lt;/tt&gt; is obviously already taken.)&lt;/p&gt;

&lt;p&gt;So, my tl;dr plan (which I&apos;ll make concrete in a patch after circulating this comment on various mailing lists to get feedback) is:&lt;/p&gt;

&lt;p&gt;1. reimplement &lt;tt&gt;doc&lt;/tt&gt; and &lt;tt&gt;macroexpand&lt;/tt&gt; as macros in more appropriate namespaces&lt;br/&gt;
2. rm the current &lt;tt&gt;cljs.repl.reflect&lt;/tt&gt; and &lt;tt&gt;clojure.reflect&lt;/tt&gt; namespaces&lt;/p&gt;

&lt;p&gt;This should clear the way for the improved browser-REPL to land.&lt;/p&gt;</comment>
                    <comment id="31264" author="cemerick" created="Fri, 14 Jun 2013 10:45:13 -0500"  >&lt;p&gt;Disregard the above plan; later discussion &lt;a href=&quot;http://groups.google.com/group/clojurescript/browse_thread/thread/9629333fff490800?hl=en&quot;&gt;here&lt;/a&gt; clarified the objectives of the browser REPL reflect bits, and contains a basic outline of the plan of attack for achieving them alongside the browser-REPL reimplementation.&lt;/p&gt;</comment>
                    <comment id="31267" author="cemerick" created="Fri, 14 Jun 2013 14:59:09 -0500"  >&lt;p&gt;New patch attached that retains reflection capabilities working with the new browser-repl backend.  As discussed in the previously-linked ML discussion, the user-facing reflection namespace is now &lt;tt&gt;cljs.repl.browser.reflect&lt;/tt&gt;.  Otherwise, all usage instructions discussed previously apply as before for phantomjs, head-ful browsers, and other external processes via &lt;tt&gt;exec-env&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;Two things:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;I am seeing a &lt;a href=&quot;https://gist.github.com/cemerick/5783641&quot;&gt;bunch of gclosure compilation warnings on master&lt;/a&gt;.  They&apos;re ugly, but not seeming to affect functionality.  The CLJS changes I&apos;ve made are minimal, so I&apos;ll just chalk them up to transient fickleness of master for now...&lt;/li&gt;
	&lt;li&gt;Since reflection requests are entirely asynchronous (i.e. responses are processed via a callback on an xhr-connection), there&apos;s no way to either (a) print them nicely in a REPL context (the prompt is often going to be interspersed), and (b) those results will never end up in e.g. &lt;tt&gt;&amp;#42;1&lt;/tt&gt;.  This is how the prior reflection utilities were, and I assume that that is intentional/desirable/low priority at the moment; in any case, I&apos;d consider &lt;em&gt;improvement&lt;/em&gt; of the reflection facilities (outside of the minor cleanup I&apos;ve done) to be out of scope for this particular effort.&lt;/li&gt;
&lt;/ul&gt;
</comment>
                    <comment id="31303" author="dnolen" created="Tue, 18 Jun 2013 07:42:10 -0500"  >&lt;p&gt;I&apos;ve taken my first pass over the patch, it looks nice!&lt;/p&gt;

&lt;p&gt;A couple of concerns, the instructions for the REPL sample now in the repo no longer work. For people who don&apos;t want or need to setup another server this seems unfortunate, but it also complicates basic browser REPL testing for compiler devs.&lt;/p&gt;

&lt;p&gt;So I think we need two things before moving forward with this:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Updated instructions for browser REPL sample&lt;/li&gt;
	&lt;li&gt;Preserve the old behavior (serve the directory) at port 9000 or some user specified port. The new behavior should have to be explicitly set.&lt;/li&gt;
&lt;/ul&gt;
</comment>
                    <comment id="31304" author="cemerick" created="Tue, 18 Jun 2013 08:51:18 -0500"  >&lt;p&gt;Yeah, definitely happy to refresh all the related docs, etc.&lt;/p&gt;

&lt;p&gt;But, part of the point of the work was to eliminate the server/port contention/management that the prior impl implied.  That the new repl environment carries around a URL string (@ &lt;tt&gt;:entry-url&lt;/tt&gt;) that can be dropped into a &lt;tt&gt;(connect ...)&lt;/tt&gt; call in your app makes it so you never have to think about ports, session identifiers, etc.&lt;/p&gt;

&lt;p&gt;Stepping back:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Basic browser-repl testing should be &lt;b&gt;much&lt;/b&gt; easier, especially if you use &lt;tt&gt;exec-env&lt;/tt&gt;.  Its default is to use phantomjs, but using e.g. Chrome is trivial, as described in at the top of the ticket.&lt;/li&gt;
	&lt;li&gt;That the browser-repl can serve non-REPL-related static content is clever, but I can&apos;t imagine that anyone is using it as their only or primary server...or if they are, they should probably stop (in neither browser-repl impl is the HTTP server up to snuff for anything other than servicing browser-REPLs).  Implicitly recommending this in a sample app seems not-good, whatever the details of the browser-repl&apos;s implementation.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I can update the sample and documentation to match the the prior experience, but surely the sample&apos;s current particulars shouldn&apos;t wag the dog of the browser-REPL implementation.  &lt;/p&gt;</comment>
                    <comment id="31305" author="dnolen" created="Tue, 18 Jun 2013 09:01:40 -0500"  >&lt;p&gt;Updating the sample &amp;amp; documentation is definitely a must. We should touch base with the lein cljsbuild folks to make sure this isn&apos;t going to cause massive breakage.&lt;/p&gt;</comment>
                    <comment id="31306" author="cemerick" created="Tue, 18 Jun 2013 09:14:49 -0500"  >&lt;p&gt;It&apos;s definitely going to cause breakage: the lifecycle of the supporting server is changing, which (positively) affects the semantics of calling &lt;tt&gt;repl-env&lt;/tt&gt;.  That breakage should make the browser-REPL more reliable and easier to use by all parties, including tool authors.&lt;/p&gt;

&lt;p&gt;Anyway, yeah, any feedback from all corners is always welcome.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="12031" name="CLJS-489.diff" size="36949" author="cemerick" created="Fri, 14 Jun 2013 14:59:09 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-297] Eliminate :meta, :vector, :set, and :map ops</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-297</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The attached patch eliminates the :meta, :set, :vector, and :map ops.&lt;/p&gt;

&lt;p&gt;These four operations can be defined more simply in terms of&lt;br/&gt;
calls to with-meta, set, vector, and hash-map respectively.&lt;/p&gt;

&lt;p&gt;The compiler was optimizing construction of vectors and maps. Now,&lt;br/&gt;
those optimizations are implemented as macros. Additionally, sets&lt;br/&gt;
are optimized in much the same way.&lt;/p&gt;

&lt;p&gt;3 files changed, 52 insertions&lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/add.gif&quot; height=&quot;16&quot; width=&quot;16&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;, 99 deletions&lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/forbidden.gif&quot; height=&quot;16&quot; width=&quot;16&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;

&lt;p&gt;Also worth mentioning: as macros instead of ops &amp;amp; emit methods, these optimizations can apply to any backend. The macros create ClojureScript forms, rather than manually generating JavaScript.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15508">CLJS-297</key>
            <summary>Eliminate :meta, :vector, :set, and :map ops</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Sun, 3 Jun 2012 20:17:47 -0500</created>
                <updated>Fri, 31 Aug 2012 09:24:51 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28850" author="bbloom" created="Sun, 17 Jun 2012 16:40:19 -0500"  >&lt;p&gt;I&apos;d also like to extend this for Symbols and Keywords.&lt;/p&gt;

&lt;p&gt;I&apos;ve been experimenting with fleshed out Symbol and Keyword objects with interning. I&apos;ve found that I need emitters, macros, and functions. With the approach here, I could eliminate the emitters and instead have the analyzer produce invocation forms.&lt;/p&gt;</comment>
                    <comment id="28861" author="raph_amiard" created="Mon, 18 Jun 2012 13:20:24 -0500"  >&lt;p&gt;I think this is an interesting patch. It would be worth adapting it to the decoupled emitters. It raises the question of how it would be possible to share part of the emitters between backends.&lt;/p&gt;</comment>
                    <comment id="28864" author="dnolen" created="Mon, 18 Jun 2012 15:25:23 -0500"  >&lt;p&gt;I don&apos;t see many benefits falling out of this patch. How to best emit language primitives like literals and constants may vary from host to host - perhaps emitting bytecode directly will work best for some implementations. &lt;/p&gt;</comment>
                    <comment id="28870" author="bbloom" created="Mon, 18 Jun 2012 17:18:46 -0500"  >&lt;p&gt;Couldn&apos;t macros emit bytecode via a mechanism similar to the js* form?&lt;/p&gt;

&lt;p&gt;My goals with this are:&lt;/p&gt;

&lt;p&gt;1) Move some optimizations from the emit phase further down the pipeline. For example, consider choosing the best associative data structure to create. Why should {:foo &quot;bar&quot;} be optimized to an ObjMap or ArrayMap but (hash-map :foo &quot;bar&quot;) not be? Why should that optimization be implemented in such a way that it can not be reused by alternative backends?&lt;/p&gt;

&lt;p&gt;2) Operate at a higher level. Prefer working with Clojure forms over target-language code fragments (either strings or byte codes). This is where the code length savings is coming from.&lt;/p&gt;

&lt;p&gt;If we continue with this approach, I see 4 or 5 more places where analyzer &amp;amp; emitter code can be replaced with shorter, simpler macros, which are more readily reused by alternate backends.&lt;/p&gt;

&lt;p&gt;The one implication (downside?) this approach has on consumers of the analyzer or API is that they may need to do a little extra work when considering :invoke operations for static analysis and the like. However, that seems likely for most analyzers anyway, so this would be a matter of (defmethod handle-special-form :map) vs (defmethod handle-invoke :hash-map)&lt;/p&gt;</comment>
                    <comment id="28871" author="michalmarczyk" created="Mon, 18 Jun 2012 17:53:32 -0500"  >&lt;p&gt;Re: 1, I don&apos;t think we should be &quot;optimizing&quot; &lt;tt&gt;hash-map&lt;/tt&gt; or &lt;tt&gt;array-map&lt;/tt&gt; (or similar) calls. These functions are a documented way of requesting a map of a particular type (see the docstrings) which I think should not be removed. If anything, we might want to introduce an &lt;tt&gt;obj-map&lt;/tt&gt; function to create arbitrarily large ObjMaps on request (in fact I&apos;ll look into that, but that is a separate discussion).&lt;/p&gt;

&lt;p&gt;Additionally, the fact that {} is optimized to be a ObjMap in CLJS goes to show that any map-emitting macro will need to be rewritten for each target platform (ObjMap only makes sense when targeting JS, so this optimization simply won&apos;t be applicable to other backends). If so and assuming &lt;tt&gt;hash-map&lt;/tt&gt; &amp;amp; Co. retain the behaviour advertised in their docstrings, there&apos;s not much gain to implementing this in a macro over just writings a bunch of emitters.&lt;/p&gt;

&lt;p&gt;As for decoupling emitters &amp;#8211; I think it&apos;s perfectly fine for them not to be decoupled, they are the layer closest to the platform after all. Certainly if there&apos;s some code which turns out to look the same across multiple platforms it might be worth it to move it upwards in the stack (not necessarily, though &amp;#8211; moving it sideways, to a utility namespace / library, might turn out to be more appropriate), but I have a feeling this is an issue best decided once there actually are multiple backends in place and the various costs and benefits can be judged properly.&lt;/p&gt;

&lt;p&gt;Now, the story might well be different if we were to introduce some generic factory functions &amp;#8211; &quot;create a map of some type&quot;, &quot;create a set of some type&quot; etc. &amp;#8211; if (and only if!) they would be meant for public consumption. Then implementing a bunch of compiler macros around those new factories and letting them handle data structure literals would save some duplicate work. I don&apos;t want to pronounce an opinion on the usefulness of such generic factory functions at this time &amp;#8211; just pointing out the possibility.&lt;/p&gt;</comment>
                    <comment id="28893" author="bbloom" created="Sat, 23 Jun 2012 17:14:31 -0500"  >&lt;p&gt;&amp;gt; These functions are a documented way of requesting a map of a particular type&lt;/p&gt;

&lt;p&gt;D&apos;oh! You&apos;re right.&lt;/p&gt;

&lt;p&gt;&amp;gt; we might want to introduce an obj-map&lt;/p&gt;

&lt;p&gt;I see you did just that with &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-322&quot; title=&quot;Introduce an obj-map function as an analogue of array-map&quot;&gt;&lt;del&gt;CLJS-322&lt;/del&gt;&lt;/a&gt; &amp;#8211; nice.&lt;/p&gt;

&lt;p&gt;&amp;gt; the story might well be different if we were to introduce some generic factory functions&lt;/p&gt;

&lt;p&gt;There are already &lt;b&gt;some&lt;/b&gt; generic factory functions. &apos;set, for example, is documented as &quot;Returns a set of the distinct elements of coll.&quot; despite always returning a PersistentHashSet. Similar for vector and some others. It seems like map is the only core data structure that realistically has several reasonable choices for a default representation.&lt;/p&gt;

&lt;p&gt;&amp;gt; implementing a bunch of compiler macros around those new factories and letting them handle data structure literals would save some duplicate work&lt;/p&gt;

&lt;p&gt;So all this was somewhat inspired by tagged_literals.clj &amp;#8211; You&apos;ll see that those functions are effectively macros which take a form and, generally, return an invocation form.&lt;/p&gt;

&lt;p&gt;In my mind, I see Clojure&apos;s sugar syntax as a strict expansion transformation.&lt;/p&gt;

&lt;p&gt;For example, ^:m {:x &lt;span class=&quot;error&quot;&gt;&amp;#91;@y &amp;#39;z/w true&amp;#93;&lt;/span&gt;} is simply a shortcut for:&lt;/p&gt;

&lt;p&gt;(with-meta (make-map (keyword &quot;x&quot;) (vector (deref y) (symbol &quot;z&quot; &quot;w&quot;) Boolean/TRUE)) (make-map (keyword &quot;m&quot;) Boolean/TRUE))&lt;/p&gt;

&lt;p&gt;This sort of thing already happens for @ derefs, # lambdas, etc.&lt;/p&gt;

&lt;p&gt;In theory, this could be implemented at a level lower than the compiler. You could, for instance, define a reader &quot;desugar&quot; mode which only returns lists and primitives instead of vectors, maps, etc. This would greatly reduce the number of special forms in the compiler, since all of these boil down to invocations with macros.&lt;/p&gt;

&lt;p&gt;Emit methods could be replaced with macros for at least these things: vars, maps, vectors, sets, nil, bools, regexes, keywords, symbols, metadata, and empty lists.&lt;/p&gt;

&lt;p&gt;The result would be a significant reduction in the amount of code in the compiler for a proportionally smaller increase in the amount of code in per-language macros and maybe the reader.&lt;/p&gt;

&lt;p&gt;&amp;gt; I have a feeling this is an issue best decided once there actually are multiple backends in place&lt;/p&gt;

&lt;p&gt;I&apos;ll grant you that.&lt;/p&gt;

&lt;p&gt;I&apos;ve said my piece on the topic and don&apos;t feel very strongly about this particular patch. I just wanted to spark the discussion about reusing more bits of the compiler between backends. In my mind, it&apos;s almost always preferable to transform lists than it is to emit strings. I tried that, and the result was a reduction in responsibilities for the analyzer and macros that were easier to work with than emit methods.&lt;/p&gt;</comment>
                    <comment id="28894" author="michalmarczyk" created="Sun, 24 Jun 2012 19:41:51 -0500"  >&lt;p&gt;Some further discussion here:&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;&lt;a href=&quot;http://clojure-log.n01se.net/date/2012-06-24.html#20:30a&quot;&gt;http://clojure-log.n01se.net/date/2012-06-24.html#20:30a&lt;/a&gt;&lt;/tt&gt;&lt;/p&gt;</comment>
                    <comment id="29199" author="bbloom" created="Thu, 16 Aug 2012 21:34:30 -0500"  >&lt;p&gt;One other advantage of function application over special casing maps/sets/etc is that argument evaluation order is well defined for function application (left-to-right). The Clojure reader returns un-ordered maps &amp;amp; sets, so without changing the reader, we have no way of being able to know what order map key-value-pairs or set elements were originally in. I filed a bug on that. I think we need to make the reader extensible to say to create the return values from their children expressions. In the case of the ClojureScript compiler, we do care about order, so we&apos;d want to return either a (make-map ...) form directly, or a sorted-map by read-order. Same goes for sets.&lt;/p&gt;</comment>
                    <comment id="29321" author="dnolen" created="Fri, 31 Aug 2012 09:24:51 -0500"  >&lt;p&gt;There&apos;s not enough rationale for this one.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11289" name="emit-ds-via-macros.patch" size="10052" author="bbloom" created="Sun, 3 Jun 2012 20:17:47 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-288] Compilation of unordered collections </title>
                <link>http://dev.clojure.org/jira/browse/CLJS-288</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Given:&lt;/p&gt;

&lt;p&gt;    (defn f &lt;span class=&quot;error&quot;&gt;&amp;#91;x&amp;#93;&lt;/span&gt; (println x) x)&lt;/p&gt;
    {(f 5) (f 10), (f :x) (f :y)}

&lt;p&gt;Clojure produces:&lt;/p&gt;

&lt;p&gt;    5&lt;br/&gt;
    10&lt;br/&gt;
    :x&lt;br/&gt;
    :y&lt;/p&gt;
    {5 10, :x :y}

&lt;p&gt;ClojureScript produces:&lt;/p&gt;

&lt;p&gt;    5&lt;br/&gt;
    :x&lt;br/&gt;
    10&lt;br/&gt;
    :y&lt;/p&gt;
    {5 10, :x :y}</description>
                <environment></environment>
            <key id="15496">CLJS-288</key>
            <summary>Compilation of unordered collections </summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                    </labels>
                <created>Thu, 31 May 2012 16:58:37 -0500</created>
                <updated>Sun, 23 Sep 2012 19:40:17 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29198" author="bbloom" created="Thu, 16 Aug 2012 21:28:16 -0500"  >&lt;p&gt;See also: &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1043&quot; title=&quot;Unordered literals does not preserve left-to-right evaluation of arguments&quot;&gt;CLJ-1043&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I realized that this problem is actually only partially solvable as is. We could assign the interleaved keys and values to locals before constructing the map. Unfortunately, that doesn&apos;t solve a bigger underlying problem: The reader returns unordered sets and maps.&lt;/p&gt;</comment>
                    <comment id="29320" author="dnolen" created="Fri, 31 Aug 2012 09:23:50 -0500"  >&lt;p&gt;Is this actually a problem?&lt;/p&gt;</comment>
                    <comment id="29527" author="bbloom" created="Sun, 23 Sep 2012 19:40:17 -0500"  >&lt;p&gt;See discussion at &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1043?focusedCommentId=29526#comment-29526&quot;&gt;http://dev.clojure.org/jira/browse/CLJ-1043?focusedCommentId=29526#comment-29526&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-301] Inline instance?</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-301</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;See discussion on &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-300&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-300&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a low priority patch for inlining instanceof checks. I don&apos;t know if it has any significant performance improvement, but the patch was sort of a side effect of my work on &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-300&quot; title=&quot;RegExp objects print incorrectly&quot;&gt;&lt;del&gt;CLJS-300&lt;/del&gt;&lt;/a&gt;, so I figured I&apos;d bundle it up and share it here in case someone wants to test it&apos;s perf impact and apply if it is a win.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15512">CLJS-301</key>
            <summary>Inline instance?</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Tue, 5 Jun 2012 00:58:11 -0500</created>
                <updated>Sat, 22 Dec 2012 16:33:35 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="30299" author="dnolen" created="Sat, 22 Dec 2012 15:29:01 -0600"  >&lt;p&gt;This will probably result in a minor performance boost, but it is nice to get another jsSTAR out of core.cljs. If you update the patch to work on master, I will apply it.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11775" name="CLJS-301-v002.patch" size="2180" author="bbloom" created="Sat, 22 Dec 2012 16:33:35 -0600" />
                    <attachment id="11293" name="inline-instanceof.patch" size="2704" author="bbloom" created="Tue, 5 Jun 2012 00:58:11 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-471] Empty regexp causes Closure Compiler error</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-471</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;An empty regexp of the form &lt;tt&gt;#&quot;&quot;&lt;/tt&gt; compiles to &lt;tt&gt;//&lt;/tt&gt;, which is not an empty regexp but a comment, causing the code following the supposed regexp on the affected line to be commented out. This tends to cause compiler errors when Closure Compiler tries to parse it.&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;#&quot;&quot;&lt;/tt&gt; should instead produce either &lt;tt&gt;/(?:&amp;#41;/&lt;/tt&gt; or &lt;tt&gt;new RegExp(&quot;&quot;)&lt;/tt&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16008">CLJS-471</key>
            <summary>Empty regexp causes Closure Compiler error</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="bodil">Bodil Stokke</reporter>
                        <labels>
                    </labels>
                <created>Wed, 13 Feb 2013 15:33:55 -0600</created>
                <updated>Thu, 25 Apr 2013 05:57:34 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30891" author="michalmarczyk" created="Sat, 6 Apr 2013 18:50:20 -0500"  >&lt;p&gt;Commit message:&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;CLJS-471: prevent empty regexps from causing compiler errors

This patch chooses to emit

  (new RegExp(&quot;&quot;))

rather than

  /(?:)/

so that (pr-str #&quot;&quot;) returns

  &quot;#\&quot;\&quot;&quot;

rather than

  &quot;#\&quot;(?:)\&quot;&quot;

A test for the above is included.
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="30994" author="dnolen" created="Wed, 24 Apr 2013 21:52:23 -0500"  >&lt;p&gt;I tried applying this in master, the included test fails.&lt;/p&gt;</comment>
                    <comment id="30996" author="michalmarczyk" created="Thu, 25 Apr 2013 05:57:34 -0500"  >&lt;p&gt;Thanks for letting me know. I&apos;ve checked the value of &lt;tt&gt;new RegExp(&quot;&quot;).source&lt;/tt&gt; in a Node.js REPL (0.10.3) and it turns out to be &lt;tt&gt;&apos;(?&lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&apos;&lt;/tt&gt;. So, how important is it that we return &lt;tt&gt;&quot;#\&quot;\&quot;&quot;&lt;/tt&gt; rather than &lt;tt&gt;&quot;#\&quot;(?&lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;\&quot;&quot;&lt;/tt&gt; anyway? I&apos;m thinking maybe not that much, seeing how regexp support in JS is different to that on the JVM in more fundamental ways. I&apos;ll just assume this is correct and attach a new patch accepting both representations soon. Of course if there&apos;s a better way to do it, I&apos;ll be happy to implement it.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11945" name="0001-CLJS-471-prevent-empty-regexps-from-causing-compiler.patch" size="1900" author="michalmarczyk" created="Sat, 6 Apr 2013 18:50:20 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>
</channel>
</rss>