<!--
RSS generated by JIRA (4.4#649-r158309) at Tue May 21 08:01:57 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+ORDER+BY+updated+DESC%2C+priority+DESC%2C+created+ASC&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+ORDER+BY+updated+DESC%2C+priority+DESC%2C+created+ASC</link>
        <description>An XML representation of a search request</description>
                <language>en-us</language>
                        <issue start="0" end="507" total="507"/>
                <build-info>
            <version>4.4</version>
            <build-number>649</build-number>
            <build-date>25-07-2011</build-date>
        </build-info>
<item>
            <title>[CLJS-508] Missing IReduce implementations and typo in clojure.core.reducers/append!</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-508</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;1) IReduce protocol is missing implementation for array and List.&lt;br/&gt;
2) append! uses (.add array), while the correct array method name is push&lt;/p&gt;

&lt;p&gt;Patch attached.&lt;/p&gt;

&lt;p&gt;Note: what is your experience with array.push performance? ClojureScript reducers/foldcat uses arrays for append! / cat implementation. My experience was that (into [] ...) using conj! and TransientVector was at least 5 times faster than reducers/foldcat using array and push. The reason is probably inefficient push implementation in Chrome/V8&lt;/p&gt;</description>
                <environment>Fresh CLJS checkout from github</environment>
            <key id="16195">CLJS-508</key>
            <summary>Missing IReduce implementations and typo in clojure.core.reducers/append!</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>Tue, 21 May 2013 05:51:11 -0500</created>
                <updated>Tue, 21 May 2013 05:51:11 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                    <attachment id="12000" name="reducers.patch" size="2281" author="skardan" created="Tue, 21 May 2013 05:51: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="10002">Code and Test</customfieldvalue>

                </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-499] Reassess ObjectMap vs. PersistentArrayMap</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-499</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Here are some benchmarks after performance improvements have been applied to PersistentArrayMap in master:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;ObjMap vs PersistentArrayMap 1 entry -lookup, &lt;a href=&quot;http://jsperf.com/ojbmap-vs-persistentarraymap-lookup-1&quot;&gt;http://jsperf.com/ojbmap-vs-persistentarraymap-lookup-1&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;ObjMap vs PersistentArrayMap 3 entry -lookup, &lt;a href=&quot;http://jsperf.com/objectmap-vs-persistentarraymap-3-lookup&quot;&gt;http://jsperf.com/objectmap-vs-persistentarraymap-3-lookup&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;ObjMap vs PersistentArrayMap 7 entry -lookup, &lt;a href=&quot;http://jsperf.com/objmap-vs-persistentarraymap-7-lookup&quot;&gt;http://jsperf.com/objmap-vs-persistentarraymap-7-lookup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;For the smallest sizes PAMs are nearly identical in performance to OMs, as we start nearing the PHM threshold PAMs are nearly 2X faster on WebKit Nightly, and nearly 3X faster on the latest Chrome. Only Firefox Nightly lags behind for lookup times at larger sizes.&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;ObjMap vs PersistentArrayMap assoc empty, &lt;a href=&quot;http://jsperf.com/objmap-vs-persistentarraymap-assoc-empty&quot;&gt;http://jsperf.com/objmap-vs-persistentarraymap-assoc-empty&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;ObjMap vs PersistentArrayMap assoc 3kv, &lt;a href=&quot;http://jsperf.com/objmap-vs-persistentarraymap-assoc-3&quot;&gt;http://jsperf.com/objmap-vs-persistentarraymap-assoc-3&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;ObjMap vs PersistentArrayMap assoc 7kv, &lt;a href=&quot;http://jsperf.com/objmap-vs-persistentarraymap-assoc-7kv&quot;&gt;http://jsperf.com/objmap-vs-persistentarraymap-assoc-7kv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Again we see nearly identical (or much better) performance at small sizes and much better performance for PAMs as we approach the PHM threshold.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16160">CLJS-499</key>
            <summary>Reassess ObjectMap vs. PersistentArrayMap</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Thu, 25 Apr 2013 11:46:22 -0500</created>
                <updated>Mon, 20 May 2013 07:59:37 -0500</updated>
                    <resolved>Mon, 20 May 2013 07:59:37 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="31060" author="dspiteself@gmail.com" created="Tue, 7 May 2013 12:11:58 -0500"  >&lt;p&gt;When I try to run the jsprefs I get &quot;ReferenceError: cljs_perf is not defined.&quot;&lt;/p&gt;</comment>
                    <comment id="31118" author="dnolen" created="Mon, 20 May 2013 07:59:37 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/08489f39060be1097fa23abc8d5042c86e68dd4d&quot;&gt;http://github.com/clojure/clojurescript/commit/08489f39060be1097fa23abc8d5042c86e68dd4d&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-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-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>Fri, 17 May 2013 17:25:23 -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>
                </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-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-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>2</votes>
                        <watches>3</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-502] add with-redefs</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-502</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This is helpful in JVM Clojure for replacing vars for testing purposes (think mocks/stubs). &lt;/p&gt;

&lt;p&gt;adding per discussion w/ David Nolen in #clojure IRC&lt;/p&gt;
</description>
                <environment></environment>
            <key id="16174">CLJS-502</key>
            <summary>add with-redefs</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="trptcolin">Colin Jones</assignee>
                                <reporter username="trptcolin">Colin Jones</reporter>
                        <labels>
                    </labels>
                <created>Tue, 30 Apr 2013 23:19:49 -0500</created>
                <updated>Wed, 8 May 2013 00:33:53 -0500</updated>
                    <resolved>Wed, 8 May 2013 00:33:53 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="31035" author="trptcolin" created="Tue, 30 Apr 2013 23:24:14 -0500"  >&lt;p&gt;This includes an update to binding to avoid ~18 lines of duplication. Happy to prepare a patch with all the duplication rolled back out if there&apos;s a good reason for it.&lt;/p&gt;</comment>
                    <comment id="31073" author="dnolen" created="Wed, 8 May 2013 00:33:53 -0500"  >&lt;p&gt;fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/ad771a67df8d69792bb81c04da3ce18fd4837f2c&quot;&gt;http://github.com/clojure/clojurescript/commit/ad771a67df8d69792bb81c04da3ce18fd4837f2c&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11976" name="CLJS-502.patch" size="3797" author="trptcolin" created="Tue, 30 Apr 2013 23:24:14 -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-504] Empty arrays and strings don&apos;t seq as nil</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-504</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This is in CLJS v. 0.0-1803&lt;/p&gt;

&lt;p&gt;The original symptom was that these objects didn&apos;t round-trip properly:&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; (js-&amp;gt;clj (clj-&amp;gt;js {}))
{&quot;&quot; nil}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A little more digging shows the underlying 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;cljs.user=&amp;gt; (seq (array)) 
(nil)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The same issue, with the same fix, exists for strings, so I&apos;m including that here as well.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16178">CLJS-504</key>
            <summary>Empty arrays and strings don&apos;t seq as nil</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="trptcolin">Colin Jones</assignee>
                                <reporter username="trptcolin">Colin Jones</reporter>
                        <labels>
                    </labels>
                <created>Mon, 6 May 2013 11:55:01 -0500</created>
                <updated>Tue, 7 May 2013 05:47:14 -0500</updated>
                    <resolved>Tue, 7 May 2013 00:21:21 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="31058" author="dnolen" created="Tue, 7 May 2013 00:21:21 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/49144218321bf8c355642fb683f197b05d6d9f8a&quot;&gt;http://github.com/clojure/clojurescript/commit/49144218321bf8c355642fb683f197b05d6d9f8a&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="31059" author="trptcolin" created="Tue, 7 May 2013 05:47:14 -0500"  >&lt;p&gt;Nice, thanks for cleaning up that test. Sorry about that, still working on interpreting the test output.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11985" name="CLJS-504.patch" size="2163" author="trptcolin" created="Mon, 6 May 2013 13:23: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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-500] Code Size Issue - Constructors</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-500</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When compiling something like spectral norm &lt;a href=&quot;http://github.com/swannodette/cljs-stl/blob/master/src/cljs_stl/spectral/demo.cljs&quot;&gt;http://github.com/swannodette/cljs-stl/blob/master/src/cljs_stl/spectral/demo.cljs&lt;/a&gt; where no ClojureScript data structures are used we still see many constructors in the advanced compiled output. The total KLOC of pretty printed advanced compiled code using master is ~3800.&lt;/p&gt;

&lt;p&gt;Quick testing shows that the following ctors are present in spectral norm:&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;PersistentTreeMap
RedNode
BlackNode
PersistentTreeMapSeq
TransientHashMap
PersistentHashMap
ArrayNodeSeq
NodeSeq
HashCollisionNode
ArrayNode
BitmapIndexedNode
TransientArrayMap
PersistentArrayMap
ObjMap
NeverEquiv
TransientVector
ChunkedSeq
PersistentVector
VectorNode
ChunkedCons
ArrayChunk
ChunkBuffer
LazySeq
Keyword
Cons
EmptyLIst
List
IndexedSeq&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We removed the runtime function dependency of cljs.core.PersistentTreeSet/EMPTY, all ctors related to PTSs disappeared.&lt;/p&gt;

&lt;p&gt;Removing the runtime constructions of the other EMPTY collections seems to have no further effect on code size, probably because we have avoided dependencies elsewhere.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16164">CLJS-500</key>
            <summary>Code Size Issue - Constructors</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sat, 27 Apr 2013 13:31:25 -0500</created>
                <updated>Sat, 4 May 2013 12:01:36 -0500</updated>
                    <resolved>Sat, 4 May 2013 12:01:36 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="31007" author="dnolen" created="Sat, 27 Apr 2013 20:41:46 -0500"  >&lt;p&gt;Another issue looks like recursive relationships between constructors, this occurs with hash map upgrading as well as with transient. Getting ridding rid of the IEditableCollection implementations removes all the transient related constructors from appearing. With this change on master we around ~3580 KLOCs.&lt;/p&gt;

&lt;p&gt;Coupled with the pr code removed we&apos;re down to ~2700 KLOCs. Many constructors magically disappear if we remove the printing code.&lt;/p&gt;

&lt;p&gt;After some more investigation, it&apos;s only necessary to remove pr-str and that puts us at ~2700 KLOCs.&lt;/p&gt;

&lt;p&gt;It appears my speculation about the variadic functions is way off. Recursive relationships between the core types and functions seems to be the real source of the issue.&lt;/p&gt;</comment>
                    <comment id="31008" author="dnolen" created="Sat, 27 Apr 2013 21:26:18 -0500"  >&lt;p&gt;There are many complex dependencies between functions and types currently. For example when writing a type it&apos;s tempting to rely on the standard library, but this has repercussions. For example calling map from a deftype implementation means you need to pull in the chunked types!&lt;/p&gt;

&lt;p&gt;Another example is how PersistentArrayMap and ObjMap both call reduce, in this case reduce doesn&apos;t pull in dependencies but it shows a kind of thinking that should probably be avoided in the collections at the heart of ClojureScript. The reduce cases should be probably be replaced with a loop/recur.&lt;/p&gt;</comment>
                    <comment id="31009" author="dnolen" created="Sat, 27 Apr 2013 21:51:04 -0500"  >&lt;p&gt;Instead of guessing it might be useful to examine the call graph of the AST - there some instructions on how to do so here &lt;a href=&quot;http://stackoverflow.com/questions/1385335/how-to-generate-function-call-graphs-for-javascript/12220307#12220307&quot;&gt;http://stackoverflow.com/questions/1385335/how-to-generate-function-call-graphs-for-javascript/12220307#12220307&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="31013" author="dnolen" created="Sun, 28 Apr 2013 11:43:33 -0500"  >&lt;p&gt;One way to control the amount of mutual reference, move that functionality out into a separate function, this way the usage of a specifc function triggers inclusions of data structures instead of it being implicit to using a particular data structure. A specific example is switching data structures based on size i.e. PAM -&amp;gt; PHM.&lt;/p&gt;</comment>
                    <comment id="31015" author="dnolen" created="Sun, 28 Apr 2013 12:54:34 -0500"  >&lt;p&gt;After attempting to limit the inclusion of transients collections in ClojureScript, Closure is indeed very accurate. The real problem is the reliance on convenience fns within deftypes this includes map/reduce/into/etc. for example map will bring in chunked types, into will bring in all transient collections. deftype should really only be written with the language primitives - this is better from a performance perspective anyhow. We should review the deftypes and eliminate the various conveniences where possible.&lt;/p&gt;</comment>
                    <comment id="31016" author="dnolen" created="Sun, 28 Apr 2013 13:32:59 -0500"  >&lt;p&gt;Other offenders are the top level extend-type/protocol on JS natives. extend-type nil calls hashcode, IPrintWithWriter includes all the printing machinery, string &amp;amp; array load primseq arrayseq.&lt;/p&gt;

&lt;p&gt;We should probably adopt the Clojure JVM and dispatch on the types where we can in the library fns themselves at not at the protocol level.&lt;/p&gt;</comment>
                    <comment id="31050" author="dnolen" created="Sat, 4 May 2013 12:01:36 -0500"  >&lt;p&gt;This has been addressed in master in a number of commits. (.log js/console &quot;Hello world!&quot;) is now ~100 lines of code. There are more enhancements that need further investigation like removing the various transient data structures if unused but this needs more investigation.&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-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-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-501] add boolean coercion fn</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-501</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;we often type-hint return values as boolean when they are not, we should instead provide a boolean coercion fn like Clojure has.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16166">CLJS-501</key>
            <summary>add boolean coercion fn</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 28 Apr 2013 18:00:01 -0500</created>
                <updated>Sun, 28 Apr 2013 22:59:38 -0500</updated>
                    <resolved>Sun, 28 Apr 2013 22:59:38 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="31018" author="dnolen" created="Sun, 28 Apr 2013 22:59:38 -0500"  >&lt;p&gt;this exists&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-367] doseq &amp; for macros should support chunked seqs</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-367</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15659">CLJS-367</key>
            <summary>doseq &amp; for macros should support chunked seqs</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Fri, 31 Aug 2012 09:48:40 -0500</created>
                <updated>Fri, 26 Apr 2013 16:55:00 -0500</updated>
                    <resolved>Fri, 26 Apr 2013 16:45:02 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30885" author="michalmarczyk" created="Sat, 6 Apr 2013 14:34:53 -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-367: chunked seq support in for, comprehension benchmarks
    
    Copy &amp;amp; paste from Clojure with small tweaks (-nth instead of .nth on
    chunks, ClojureScript-specific type hints).
    
    Also fixes a minor bug around argument format verification in for.
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;tt&gt;for&lt;/tt&gt; performance on the attached benchmark is dramatically improved by the patch. &lt;tt&gt;doseq&lt;/tt&gt; is unchanged for now, because a similar copy &amp;amp; paste approach makes it &lt;b&gt;slower&lt;/b&gt; by more than a factor of 2. I&apos;ll try and investigate the reasons for that, but in the meantime, the unchunked &lt;tt&gt;doseq&lt;/tt&gt; is still faster than even the chunked &lt;tt&gt;for&lt;/tt&gt; (&lt;tt&gt;doseq&lt;/tt&gt; benchmark takes around 4x as much time, but that&apos;s over 10x as many iterations) and &lt;tt&gt;for&lt;/tt&gt; can already benefit from the present patch.&lt;/p&gt;</comment>
                    <comment id="30895" author="michalmarczyk" created="Sun, 7 Apr 2013 02:05:36 -0500"  >&lt;p&gt;Two extra benchmarks, so that both &lt;tt&gt;for&lt;/tt&gt; and &lt;tt&gt;doseq&lt;/tt&gt; are benchmarked with both a chunked an a non-chunked seq.&lt;/p&gt;

&lt;p&gt;I should add that copy &amp;amp; pasted &lt;tt&gt;doseq&lt;/tt&gt; is substantially faster than the current &lt;tt&gt;doseq&lt;/tt&gt; on chunked seqs; it&apos;s on non-chunked seqs that it&apos;s pretty terrible.&lt;/p&gt;</comment>
                    <comment id="30896" author="michalmarczyk" created="Sun, 7 Apr 2013 02:10:11 -0500"  >&lt;p&gt;Hm, I now notice that, rather importantly, &lt;tt&gt;for&lt;/tt&gt; on non-chunked seqs is significantly slower with the patch (although by a smaller factor than &lt;tt&gt;doseq&lt;/tt&gt;). Guess this needs more baking.&lt;/p&gt;</comment>
                    <comment id="30897" author="michalmarczyk" created="Sun, 7 Apr 2013 02:26:22 -0500"  >&lt;p&gt;Here&apos;s the patch with the chunk-aware &lt;tt&gt;doseq&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;By the way: what sort of slowdown for the non-chunked case of chunk-aware comprehensions would be acceptable?&lt;/p&gt;</comment>
                    <comment id="30910" author="dnolen" created="Mon, 8 Apr 2013 16:52:44 -0500"  >&lt;p&gt;What are the differences between the two patches? It&apos;s preferable that there not be much difference in performance - how much slowdown are you seeing?&lt;/p&gt;

&lt;p&gt;I can give the patches and generated code a look to see if I see any optimization opportunities.&lt;/p&gt;</comment>
                    <comment id="30913" author="michalmarczyk" created="Mon, 8 Apr 2013 21:55:31 -0500"  >&lt;p&gt;I&apos;d love it if you reviewed the code!&lt;/p&gt;

&lt;p&gt;As for the patches, one makes &lt;tt&gt;for&lt;/tt&gt; chunk-aware and introduces the new benchmarks; the other does all that and also makes &lt;tt&gt;doseq&lt;/tt&gt; chunk-aware. I don&apos;t think either is particularly suitable for inclusion as it stands, so I&apos;ll just replace them both with a new one, chunkifying both macros and free of &lt;tt&gt;truth_&lt;/tt&gt; calls (turns out I missed one earlier; unfortunately it doesn&apos;t make a difference where it really matters, only makes the fast case slightly faster still). I&apos;ll be happy to split them apart in any way which is useful.&lt;/p&gt;

&lt;p&gt;The slowdown is large for &lt;tt&gt;for&lt;/tt&gt; and massive for &lt;tt&gt;doseq&lt;/tt&gt;. Here are some benchmark results:&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;;;; current master
;;; comprehensions
[xs (range 512)], (last (for [x xs y xs] (+ x y))), 10 runs, 4783 msecs
[xs (vec (range 512))], (last (for [x xs y xs] (+ x y))), 10 runs, 3900 msecs
[a (Box. 0) xs (range 512)], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 100 runs, 4062 msecs
[a (Box. 0) xs (vec (range 512))], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 100 runs, 4486 msecs

;;; latest patch
;;; comprehensions
[xs (range 512)], (last (for [x xs y xs] (+ x y))), 10 runs, 6350 msecs
[xs (vec (range 512))], (last (for [x xs y xs] (+ x y))), 10 runs, 813 msecs
[a (Box. 0) xs (range 512)], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 100 runs, 13801 msecs
[a (Box. 0) xs (vec (range 512))], (doseq [x xs y xs] (set! a -val (+ (.-val a) x))), 100 runs, 856 msecs
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="30991" author="dnolen" created="Wed, 24 Apr 2013 21:38:16 -0500"  >&lt;p&gt;First off I don&apos;t see the very dramatic slow down, but I do see a slowdown and this is not desirable. The issue is that both the seq and chunked seq cases share the same recursive function. So we actually test whether something is a chunked seq at every step. The problem is chunked-seq? calls into satisfies? which is somewhat slow in the false case - we have to check the bitmask and then call into type_satisfies if the bitmask test fails.&lt;/p&gt;

&lt;p&gt;So really we should only check &lt;b&gt;once&lt;/b&gt; to see if we have chunked seq, if we do we always have one. Obviously Clojure doesn&apos;t have this performance problem with chunked-seq? because this stuff happens via interfaces not protocols.&lt;/p&gt;</comment>
                    <comment id="30992" author="dnolen" created="Wed, 24 Apr 2013 21:43:58 -0500"  >&lt;p&gt;Oh and I do see a very big speedup for chunked seqs, on my machine it&apos;s faster than map now! &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="30995" author="michalmarczyk" created="Thu, 25 Apr 2013 05:45:12 -0500"  >&lt;p&gt;Good to know your measurements are more encouraging. As to the slowdown:&lt;/p&gt;

&lt;p&gt;I do realize that checking seq type every step of the day is problematic, but I don&apos;t know that we can simply not do it. Sequences routinely turn out to be part chunked, part not (e.g. cons a single element onto a vector seq, concat a non-chunked seq with a chunked-seq); Clojure switches processing mode midway in such cases and I thought it would be good to do so in ClojureScript as well. In fact in the chunked case we simply must do it, because the chunked logic makes no sense for non-chunked seqs; but it&apos;s clearly no problem there, given the speedup.&lt;/p&gt;

&lt;p&gt;I thought that maybe the check could be performed, say, every 8 steps or so (that is, if we start off in the non-chunked case), hoping that this would give most of the benefit for mostly chunked seqs, while only introducing a minor hit for mostly non-chunked seqs. I&apos;ve played with two patches along these lines with not quite satisfactory results; I was certainly planning to give it another go &amp;#8211; do you think this sounds worthwhile?&lt;/p&gt;

&lt;p&gt;Of course we could start with a version of the patch which does the straightforward thing (permanently switching to current behaviour at the first sign of non-chunkedness, but still boosting seqs which start off chunked) and then try to figure out if switching midway is possible without too much of a perf hit.&lt;/p&gt;

&lt;p&gt;On a side note, I need to upgrade my benchmarking setup, I think it may have been too long since I&apos;ve upgraded V8... This could explain the larger slowdown that I am seeing.&lt;/p&gt;</comment>
                    <comment id="30997" author="dnolen" created="Thu, 25 Apr 2013 07:04:57 -0500"  >&lt;p&gt;Hmm. You are right. I don&apos;t think adding more smarts is the way to go. I think a simpler approach until we can figure out some better way to make satisfies? less expensive - just make chunked-seq? do instance? checks for the two IChunkedSeq types that we currently have.&lt;/p&gt;</comment>
                    <comment id="30998" author="michalmarczyk" created="Thu, 25 Apr 2013 07:20:59 -0500"  >&lt;p&gt;Ah, good idea, I&apos;ll give it a try.&lt;/p&gt;

&lt;p&gt;Incidentally, about making &lt;tt&gt;satisfies?&lt;/tt&gt; faster: I had a look at the jsPerf benchmark linked to from &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; &amp;#8211; here&apos;s a direct link: &lt;a href=&quot;http://jsperf.com/direct-vs-chain/8&quot;&gt;http://jsperf.com/direct-vs-chain/8&lt;/a&gt; &amp;#8211; and it seems like JS engine perf profiles may be shifting. In Chrome 24 &quot;property&quot; and &quot;property many interfaces&quot; are about equally fast and somewhat faster than &quot;bit&quot; &amp;amp; &quot;bit m.i.&quot;. Chrome 21 saw no difference, recent versions of Firefox seem to be similar to Chrome w.r.t. relative results, Opera seems to prefer bit, but only slightly, Safari has a slightly stronger preference for bit than that.&lt;/p&gt;</comment>
                    <comment id="30999" author="dnolen" created="Thu, 25 Apr 2013 07:37:11 -0500"  >&lt;p&gt;Interesting! I&apos;d be happy to drop the bitmask stuff as it complicates the implementation, though looking at those benchmarks it doesn&apos;t appear that it would make much of a difference. It does seems that Safari 6 does greatly prefer the bitmask approach. We&apos;d have to do quite a bit more testing before deciding of course.&lt;/p&gt;</comment>
                    <comment id="31000" author="dnolen" created="Thu, 25 Apr 2013 07:46:18 -0500"  >&lt;p&gt;Reviewing the patch some more, it might be worth inlining chunk-append and chunk via macros. Also in the chunked seq branch, since we&apos;ve hinted the result of chunk-first as ^not-native we should make sure to just call the protocols fns directly where possible.&lt;/p&gt;</comment>
                    <comment id="31004" author="dnolen" created="Fri, 26 Apr 2013 16:45:02 -0500"  >&lt;p&gt;Fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/44389e2f233ccc26ed5a1c75b1e043054e61b586&quot;&gt;http://github.com/clojure/clojurescript/commit/44389e2f233ccc26ed5a1c75b1e043054e61b586&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;fixing chunked-seq? made the perf difference quite small for regular seqs. We can take futher enhancement in other tickets/patches.&lt;/p&gt;</comment>
                    <comment id="31005" author="michalmarczyk" created="Fri, 26 Apr 2013 16:55:00 -0500"  >&lt;p&gt;This is fantastic news, thanks!&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11950" name="0001-CLJS-367-chunked-seq-support-in-for-and-doseq-compre.patch" size="9131" author="michalmarczyk" created="Mon, 8 Apr 2013 21:55: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>
                                                                                                            </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-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-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>

<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-496] better implementation of char function</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-496</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;There are a number of compatibility functions that are currently defined as identity functions. Among these, char&lt;/p&gt;

&lt;p&gt;Suggested better implementation for char: &lt;/p&gt;

&lt;p&gt;(defn char &lt;span class=&quot;error&quot;&gt;&amp;#91;code&amp;#93;&lt;/span&gt;&lt;br/&gt;
    (.fromCharCode js/String code))&lt;/p&gt;

&lt;p&gt;rather than current&lt;/p&gt;

&lt;p&gt;(defn char &lt;span class=&quot;error&quot;&gt;&amp;#91;x&amp;#93;&lt;/span&gt; x)&lt;/p&gt;

&lt;p&gt;(not sure of compatibility with node)&lt;/p&gt;</description>
                <environment></environment>
            <key id="16152">CLJS-496</key>
            <summary>better implementation of char function</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="davesann">Dave Sann</reporter>
                        <labels>
                    </labels>
                <created>Sat, 20 Apr 2013 01:38:47 -0500</created>
                <updated>Wed, 24 Apr 2013 20:09:49 -0500</updated>
                    <resolved>Wed, 24 Apr 2013 20:09:49 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30982" author="dnolen" created="Mon, 22 Apr 2013 10:39:15 -0500"  >&lt;p&gt;Good point, thanks for the feedback.&lt;/p&gt;</comment>
                    <comment id="30990" author="dnolen" created="Wed, 24 Apr 2013 20:09:49 -0500"  >&lt;p&gt;fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/877a361da1c6904aa7f372aedf98b5fcf16e1e8d&quot;&gt;http://github.com/clojure/clojurescript/commit/877a361da1c6904aa7f372aedf98b5fcf16e1e8d&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-495] New undefined? macro that safely handles undeclared variables</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-495</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The current `undefined?` function will blow up with a JavaScript reference error if you pass it an undeclared variable.&lt;/p&gt;

&lt;p&gt;It&apos;d be nice to have a way to test if a JavaScript variable has been declared.&lt;br/&gt;
My use case is writing a ClojureScript library that extends cljs protocols to JavaScript things.&lt;br/&gt;
I&apos;d like to write&lt;/p&gt;

&lt;p&gt;    (when-not (undefined? js/jQuery)&lt;/p&gt;

&lt;p&gt;       ...)&lt;/p&gt;

&lt;p&gt;to extend-type jQuery when jQuery is around.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16144">CLJS-495</key>
            <summary>New undefined? macro that safely handles undeclared variables</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="lynaghk">Kevin Lynagh</reporter>
                        <labels>
                    </labels>
                <created>Tue, 16 Apr 2013 13:19:11 -0500</created>
                <updated>Thu, 18 Apr 2013 17:15:51 -0500</updated>
                    <resolved>Thu, 18 Apr 2013 17:15:51 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30966" author="dnolen" created="Thu, 18 Apr 2013 10:53:29 -0500"  >&lt;p&gt;What about bound? as a name for this macro?&lt;/p&gt;</comment>
                    <comment id="30967" author="lynaghk" created="Thu, 18 Apr 2013 11:59:35 -0500"  >&lt;p&gt;Yeah, `bound?` sounds like an appropriate name to me.&lt;/p&gt;</comment>
                    <comment id="30968" author="dnolen" created="Thu, 18 Apr 2013 14:36:47 -0500"  >&lt;p&gt;Stuart Sierra pointed out that `bound?` may have too many connotations already in Clojure. Maybe `exists?`?&lt;/p&gt;</comment>
                    <comment id="30969" author="dnolen" created="Thu, 18 Apr 2013 17:15:51 -0500"  >&lt;p&gt;fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3ee148acac436dd489396fc6783ba72bbd7ff79f&quot;&gt;http://github.com/clojure/clojurescript/commit/3ee148acac436dd489396fc6783ba72bbd7ff79f&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-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-481] doseq bindings with :let not properly scoped</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-481</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This seems to be a subtler version of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-39&quot; title=&quot;doseq bindings not properly scoped&quot;&gt;&lt;del&gt;CLJS-39&lt;/del&gt;&lt;/a&gt;:&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;(let [fs (atom [])]
  (doseq [x (range 4)
          :let [y (inc x)
                f (fn [] y)]]
    (swap! fs conj f))
  (map #(%) @fs))

;; =&amp;gt; (4 4 4 4)
;; should be (1 2 3 4)
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I think this example is minimal. The bug is not present if we use a proper let.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16037">CLJS-481</key>
            <summary>doseq bindings with :let not properly scoped</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="gfredericks">Gary Fredericks</reporter>
                        <labels>
                    </labels>
                <created>Sun, 3 Mar 2013 15:42:21 -0600</created>
                <updated>Thu, 11 Apr 2013 21:34:33 -0500</updated>
                    <resolved>Tue, 9 Apr 2013 03:07:28 -0500</resolved>
                                                                    <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30890" author="michalmarczyk" created="Sat, 6 Apr 2013 16:49:19 -0500"  >&lt;p&gt;It appears that this works correctly on current master. In fact, it worked correctly on r1576 &amp;#8211; but not on r1552. Also, splitting the &lt;tt&gt;:let&lt;/tt&gt; into two (&quot;adjacent&quot;) &lt;tt&gt;:let&lt;/tt&gt;&apos;s fixes this, whereas moving both the &lt;tt&gt;y&lt;/tt&gt; and &lt;tt&gt;f&lt;/tt&gt; bindings into a single regular &lt;tt&gt;let&lt;/tt&gt; inside the &lt;tt&gt;doseq&lt;/tt&gt; does not. That means it&apos;s probably an instance of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-442&quot; title=&quot;Lazy seqs fails to close over local vars&quot;&gt;&lt;del&gt;CLJS-442&lt;/del&gt;&lt;/a&gt; (fns defined in local init exprs not closing over earlier locals), fixed in &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/84e9488f49bcfea4b4037a562f8f797c7ddd79f0&quot;&gt;https://github.com/clojure/clojurescript/commit/84e9488f49bcfea4b4037a562f8f797c7ddd79f0&lt;/a&gt; (included in releases since r1576).&lt;/p&gt;</comment>
                    <comment id="30911" author="dnolen" created="Mon, 8 Apr 2013 16:53:51 -0500"  >&lt;p&gt;So I&apos;m assuming we can just close this one?&lt;/p&gt;</comment>
                    <comment id="30912" author="michalmarczyk" created="Mon, 8 Apr 2013 19:50:46 -0500"  >&lt;p&gt;Yeah, seems so.&lt;/p&gt;</comment>
                    <comment id="30916" author="dnolen" created="Tue, 9 Apr 2013 03:07:28 -0500"  >&lt;p&gt;added test, this test passes on master, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/a1b41bed8921dbd9ef9ee7d735b158ae71ed6132&quot;&gt;http://github.com/clojure/clojurescript/commit/a1b41bed8921dbd9ef9ee7d735b158ae71ed6132&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30934" author="gfredericks" created="Thu, 11 Apr 2013 21:34:33 -0500"  >&lt;p&gt;Sounds good to me. Thanks!&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-493] get should accept any type the same way Clojure JVM does</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-493</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The following throws instead of returning nil:&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;(get 42 :anything)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="16125">CLJS-493</key>
            <summary>get should accept any type the same way Clojure JVM does</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 3 Apr 2013 10:11:09 -0500</created>
                <updated>Fri, 5 Apr 2013 21:30:57 -0500</updated>
                    <resolved>Fri, 5 Apr 2013 21:30:57 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30867" author="michalmarczyk" created="Wed, 3 Apr 2013 16:50:02 -0500"  >&lt;p&gt;clojure.lang.RT-style fix.&lt;/p&gt;

&lt;p&gt;From the commit message:&lt;/p&gt;

&lt;p&gt;The fix involves changes to both core.cljs and core.clj, since get is backed by a macro. Tests are introduced for both direct and higher-order calls.&lt;/p&gt;</comment>
                    <comment id="30868" author="michalmarczyk" created="Wed, 3 Apr 2013 16:52:43 -0500"  >&lt;p&gt;Incidentally, I&apos;ve prepared the patch on top of patches for &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-491&quot; title=&quot;subvec should avoid creating layered Subvecs&quot;&gt;&lt;del&gt;CLJS-491&lt;/del&gt;&lt;/a&gt; and &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-492&quot; title=&quot;avoid producing unnecessary calls to next in emit-apply-to&quot;&gt;&lt;del&gt;CLJS-492&lt;/del&gt;&lt;/a&gt;, it should still apply to master though.&lt;/p&gt;</comment>
                    <comment id="30871" author="dnolen" created="Thu, 4 Apr 2013 18:57:22 -0500"  >&lt;p&gt;I&apos;d prefer that the macro not emit a conditional check. I think it&apos;s probably OK if we just provide a default case for ILookup. Thanks.&lt;/p&gt;</comment>
                    <comment id="30872" author="michalmarczyk" created="Thu, 4 Apr 2013 19:14:00 -0500"  >&lt;p&gt;Sure, here&apos;s a new patch, with a default case provided for ILookup and the tests from the previous patch. Both macro and function unchanged, since with this change everything &lt;tt&gt;satisfies? ILookup&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;Out of curiosity, why the preference? Do you think this sort of expansion jumping in at the wrong place could pose problems for GClosure?&lt;/p&gt;</comment>
                    <comment id="30873" author="dnolen" created="Thu, 4 Apr 2013 19:17:27 -0500"  >&lt;p&gt;Thanks get is just extremely common and likely to appear in expression cases - where the CLJS compiler will emit a function. If these get too nested GClosure won&apos;t handle them and it&apos;s a pretty big perf hit.&lt;/p&gt;</comment>
                    <comment id="30875" author="michalmarczyk" created="Thu, 4 Apr 2013 19:27:23 -0500"  >&lt;p&gt;Right, thanks.&lt;/p&gt;</comment>
                    <comment id="30882" author="dnolen" created="Fri, 5 Apr 2013 21:30:57 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/7b9fccd9a2502c1984c1880176a6b0d310151520&quot;&gt;http://github.com/clojure/clojurescript/commit/7b9fccd9a2502c1984c1880176a6b0d310151520&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11941" name="0001-CLJS-493-get-should-accept-any-type.patch" size="1635" author="michalmarczyk" created="Thu, 4 Apr 2013 19:14:00 -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-492] avoid producing unnecessary calls to next in emit-apply-to</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-492</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;A function like&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;(defn bar [a b c d e f g h i j &amp;amp; more])
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;currently receives a &lt;tt&gt;cljs$lang$applyTo&lt;/tt&gt; property of the following form:&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;function (arglist__4466) {
    var a = cljs.core.first(arglist__4466);
    var b = cljs.core.first(cljs.core.next(arglist__4466));
    var c = cljs.core.first(cljs.core.next(cljs.core.next(arglist__4466)));
    var d = cljs.core.first(cljs.core.next(cljs.core.next(cljs.core.next(arglist__4466))));
    var e = cljs.core.first(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(arglist__4466)))));
    var f = cljs.core.first(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(arglist__4466))))));
    var g = cljs.core.first(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(arglist__4466)))))));
    var h = cljs.core.first(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(arglist__4466))))))));
    var i = cljs.core.first(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(arglist__4466)))))))));
    var j = cljs.core.first(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(arglist__4466))))))))));
    var more = cljs.core.rest(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(cljs.core.next(arglist__4466))))))))));
    return bar__delegate(a, b, c, d, e, f, g, h, i, j, more);
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The forthcoming patch changes that to&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;function (arglist__4460) {
    var a = cljs.core.first(arglist__4460);
    arglist__4460 = cljs.core.next(arglist__4460);
    var b = cljs.core.first(arglist__4460);
    arglist__4460 = cljs.core.next(arglist__4460);
    var c = cljs.core.first(arglist__4460);
    arglist__4460 = cljs.core.next(arglist__4460);
    var d = cljs.core.first(arglist__4460);
    arglist__4460 = cljs.core.next(arglist__4460);
    var e = cljs.core.first(arglist__4460);
    arglist__4460 = cljs.core.next(arglist__4460);
    var f = cljs.core.first(arglist__4460);
    arglist__4460 = cljs.core.next(arglist__4460);
    var g = cljs.core.first(arglist__4460);
    arglist__4460 = cljs.core.next(arglist__4460);
    var h = cljs.core.first(arglist__4460);
    arglist__4460 = cljs.core.next(arglist__4460);
    var i = cljs.core.first(arglist__4460);
    arglist__4460 = cljs.core.next(arglist__4460);
    var j = cljs.core.first(arglist__4460);
    var more = cljs.core.rest(arglist__4460);
    return bar__delegate(a, b, c, d, e, f, g, h, i, j, more);
}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The included benchmark seems to demonstrate a substantial reduction in {apply} overhead on V8 for a function with 10 positional arguments preceding the rest arg and a less substantial reduction for a function with 2 positional arguments, as one would expect. The other benchmark entries for {apply} remain in the same ballpark ({list} actually produces the same compilation output with or without the patch; {+} is changed, but only slightly).&lt;/p&gt;</description>
                <environment></environment>
            <key id="16120">CLJS-492</key>
            <summary>avoid producing unnecessary calls to next in emit-apply-to</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="michalmarczyk">Micha&#322; Marczyk</reporter>
                        <labels>
                    </labels>
                <created>Mon, 1 Apr 2013 02:10:00 -0500</created>
                <updated>Fri, 5 Apr 2013 21:30:39 -0500</updated>
                    <resolved>Fri, 5 Apr 2013 21:30:39 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30881" author="dnolen" created="Fri, 5 Apr 2013 21:30:39 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/1a094e41ba482de1bc2e363874cdb29414bdac46&quot;&gt;http://github.com/clojure/clojurescript/commit/1a094e41ba482de1bc2e363874cdb29414bdac46&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11935" name="0001-CLJS-492-avoid-producing-unnecessary-calls-to-next-i.patch" size="2638" author="michalmarczyk" created="Mon, 1 Apr 2013 02:12:08 -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-491] subvec should avoid creating layered Subvecs</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-491</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;cljs.core/subvec (or rather build-subvec, the implementation detail behind it) currently fails to check whether its vector argument is already a Subvec and, if so, base the new Subvec off the original regular vector. The Clojure implementation does perform the unwrapping.&lt;/p&gt;

&lt;p&gt;The forthcoming patch fixes this and includes a basic test.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16119">CLJS-491</key>
            <summary>subvec should avoid creating layered Subvecs</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="michalmarczyk">Micha&#322; Marczyk</reporter>
                        <labels>
                    </labels>
                <created>Sun, 31 Mar 2013 22:32:19 -0500</created>
                <updated>Fri, 5 Apr 2013 21:30:18 -0500</updated>
                    <resolved>Fri, 5 Apr 2013 21:30:18 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30880" author="dnolen" created="Fri, 5 Apr 2013 21:30:18 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3ca249a5a3ad07586c91b143463374a89d1fcf25&quot;&gt;http://github.com/clojure/clojurescript/commit/3ca249a5a3ad07586c91b143463374a89d1fcf25&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11934" name="0001-CLJS-491-avoid-layered-subvecs.patch" size="2144" author="michalmarczyk" created="Sun, 31 Mar 2013 22:34:10 -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-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>Sat, 30 Mar 2013 09:24:26 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</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>
                </comments>
                    <attachments>
                    <attachment id="11925" name="CLJS-489.diff" size="18967" author="cemerick" created="Fri, 22 Mar 2013 03:16:58 -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-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-488] aliased keywords do not work</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-488</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The folks from Pedestal encountered this.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16097">CLJS-488</key>
            <summary>aliased keywords do not work</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 20 Mar 2013 10:45:44 -0500</created>
                <updated>Thu, 21 Mar 2013 22:05:24 -0500</updated>
                    <resolved>Thu, 21 Mar 2013 22:05:24 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30799" author="dnolen" created="Thu, 21 Mar 2013 22:05:24 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/69741f2af76035e4adf1e6333c502095581b2179&quot;&gt;http://github.com/clojure/clojurescript/commit/69741f2af76035e4adf1e6333c502095581b2179&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-486] Consider to export  cljs.core.*print-fn*</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-486</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;External tools often have the need to redefine ClojureScript&apos;s&lt;br/&gt;
cljs.core.&lt;b&gt;print-fn&lt;/b&gt; var in order to get printing in different&lt;br/&gt;
runtimes working. In a browser environment it is usually&lt;br/&gt;
redefined to console.log for example.&lt;/p&gt;

&lt;p&gt;This works fine in whitespace and simple mode because the&lt;br/&gt;
cljs.core.&lt;b&gt;print-fn&lt;/b&gt; var is accessible from the outside&lt;br/&gt;
environment. However, in advanced mode the cljs.core.&lt;b&gt;print-fn&lt;/b&gt;&lt;br/&gt;
gets renamed and external tools can&apos;t access this var anymore.&lt;/p&gt;

&lt;p&gt;Since it looks like redefining cljs.core.&lt;b&gt;print-fn&lt;/b&gt; is common&lt;br/&gt;
task, it would make sense to add ^:export to it&apos;s meta data to&lt;br/&gt;
prevent the Goolge Closure Compiler from renaming it.&lt;/p&gt;

&lt;p&gt;References:&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;&lt;a href=&quot;http://clojure-log.n01se.net/date/2013-03-12.html#14:25&quot;&gt;http://clojure-log.n01se.net/date/2013-03-12.html#14:25&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://github.com/cemerick/clojurescript.test/pull/2#discussion_r3334941&quot;&gt;https://github.com/cemerick/clojurescript.test/pull/2#discussion_r3334941&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;







</description>
                <environment></environment>
            <key id="16084">CLJS-486</key>
            <summary>Consider to export  cljs.core.*print-fn*</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="r0man">Roman Scherer</assignee>
                                <reporter username="r0man">Roman Scherer</reporter>
                        <labels>
                    </labels>
                <created>Tue, 12 Mar 2013 13:49:08 -0500</created>
                <updated>Sun, 17 Mar 2013 15:10:41 -0500</updated>
                    <resolved>Sun, 17 Mar 2013 15:10:41 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30744" author="r0man" created="Tue, 12 Mar 2013 15:20:03 -0500"  >&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;Unfortunatly it&apos;s not that easy. Advanced compilation is quite a
beast. I added :export true to the meta data of *print-fn*, build a
ClojureScript release and put it into my local Maven repo. Changed the
ClojureScript version in clojurescript.test and recompiled. The var is
exported:

    function s() {
      d(Error(&quot;No *print-fn* fn set for evaluation environment&quot;))
    }
   fa(&quot;cljs.core._STAR_print_fn_STAR_&quot;, s);                                                                                                                                                                                                                                                    

The fn &quot;fa&quot; is the goog/exportSymbol fn, which (i guess) builds up
some nested object and finally assigns &quot;s&quot; under the proper path.

    function fa(a, b) {
      var c = a.split(&quot;.&quot;), e = ba;                                                                                                                                                                                                                                                            
      !(c[0] in e) &amp;amp;&amp;amp; e.execScript &amp;amp;&amp;amp; e.execScript(&quot;var &quot; + c[0]);                                                                                                                                                                                                                             
      for(var f;c.length &amp;amp;&amp;amp; (f = c.shift());) {                                                                                                                                                                                                                                                
        !c.length &amp;amp;&amp;amp; b !== g ? e[f] = b : e = e[f] ? e[f] : e[f] = {}
      }
    }  

Assigning cljs.core._STAR_print_fn_STAR_ from the outside just points
anyone actually calling cljs.core._STAR_print_fn_STAR_ to the new
function. I tried this in clojurescript.test:

    #!/usr/bin/env phantomjs

    // reusable phantomjs script for running clojurescript.test tests
    // see http://github.com/cemerick/clojurescript.test for more info

    var p = require(&apos;webpage&apos;).create();                                                                                                                                                                                                                                                       
    p.injectJs(require(&apos;system&apos;).args[1]);                                                                                                                                                                                                                                                     

    p.onConsoleMessage = function (x) { console.log(x); };                                                                                                                                                                                                                                     
    // p.evaluate(function () {
    //     cemerick.cljs.test.set_print_fn();                                                                                                                                                                                                                                                  
    // });                                                                                                                                                                                                                                                                                     

    p.evaluate(function () {

      // Try to redefine cljs.core._STAR_print_fn_STAR_
      console.log(cljs.core._STAR_print_fn_STAR_);                                                                                                                                                                                                                                             
      cljs.core._STAR_print_fn_STAR_ = function (x) {
          x = x.replace(/\n/g, &quot;&quot;);                                                                                                                                                                                                                                                            
          console.log(x);                                                                                                                                                                                                                                                                      
      };                                                                                                                                                                                                                                                                                       

      // BUT THIS HAS TO BE REDEFINED
      console.log(s);                                                                                                                                                                                                                                                                          
      s = function (x) {
          x = x.replace(/\n/g, &quot;&quot;);                                                                                                                                                                                                                                                            
          console.log(x);                                                                                                                                                                                                                                                                      
      };                                                                                                                                                                                                                                                                                       
    });                                                                                                                                                                                                                                                                                        

    var success = p.evaluate(function () {
      var results = cemerick.cljs.test.run_all_tests();                                                                                                                                                                                                                                        
      console.log(results);                                                                                                                                                                                                                                                                    
      return cemerick.cljs.test.successful_QMARK_(results);                                                                                                                                                                                                                                    
    });                                                                                                                                                                                                                                                                                        

    phantom.exit(success ? 0 : 1);                                                                                                                                                                                                                                                             


Anyone else calling the renamed &quot;s&quot; still has a problem. We actually
need to reasign &quot;s&quot;, which external tools still don&apos;t know by name.

In clojurescript.test I solved this dilemma by providing
something like this:

    (defn ^:export set-print-fn! [f]
      (set! cljs.core.*print-fn* f))

and pass the print fn as an argument

    cemerick.cljs.test.set_print_fn_BANG_(function(x) {
        x = x.replace(/\n/g, &quot;&quot;);                                                                                                                                                                                                                                                              
        console.log(x);                                                                                                                                                                                                                                                                        
    });                                                                                                                                                                                                                                                                                        

In summary, exporting *print-fn* does not help as I initially
thought. You have to get to the renamed var. We could provide the
mentioned set-print-fn! from above for tools to use. But then
this could be done by tools themself.

Any other thoughts?


&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="30761" author="dnolen" created="Thu, 14 Mar 2013 18:58:24 -0500"  >&lt;p&gt;I&apos;m fine with this change. Patch welcome.&lt;/p&gt;</comment>
                    <comment id="30763" author="r0man" created="Thu, 14 Mar 2013 19:26:36 -0500"  >&lt;p&gt;Ok, here is the patch.&lt;/p&gt;</comment>
                    <comment id="30781" author="dnolen" created="Sun, 17 Mar 2013 15:10:41 -0500"  >&lt;p&gt;fixed,&lt;br/&gt;
&lt;a href=&quot;http://github.com/clojure/clojurescript/commit/c47ae7683e9b7be77cb4bd4e5bc821a41a9f61cd&quot;&gt;http://github.com/clojure/clojurescript/commit/c47ae7683e9b7be77cb4bd4e5bc821a41a9f61cd&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11915" name="set-print-fn.diff" size="1422" author="r0man" created="Thu, 14 Mar 2013 19:25:26 -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-438] copy cond-&gt; etc from 1.5</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-438</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Attached patch (cljs-438-condetc.patch, 11 Dec 2012) copies cond-&amp;gt;, cond-&amp;gt;&amp;gt;, as-&amp;gt;, some-&amp;gt;, and some-&amp;gt;&amp;gt; from 1.5 master. This lets ClojureScript users use these macros without requiring Clojure 1.5.&lt;/p&gt;

&lt;p&gt;I suppose this maybe should wait until 1.5.0 is out, in case another renaming occurs.&lt;/p&gt;

&lt;p&gt;Another way to do this would be to have import-macros ignore missing macros and add these there. Then the macros would only be available for users requiring Clojure 1.5 (which.. makes sense), and we wouldn&apos;t have to copy them.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15883">CLJS-438</key>
            <summary>copy cond-&gt; etc from 1.5</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tomoj">Tom Jack</reporter>
                        <labels>
                    </labels>
                <created>Tue, 11 Dec 2012 17:50:07 -0600</created>
                <updated>Sun, 17 Mar 2013 15:01:52 -0500</updated>
                    <resolved>Sun, 17 Mar 2013 15:01:52 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="30295" author="dnolen" created="Sat, 22 Dec 2012 14:32:58 -0600"  >&lt;p&gt;I&apos;m inclined to hold off on this one since 1.5 is so close. As soon as 1.5 becomes official I&apos;d like to make it a requirement for ClojureScript - as then I can merge the source-map branch and hopefully get some help on that work.&lt;/p&gt;</comment>
                    <comment id="30305" author="tomoj" created="Sat, 22 Dec 2012 23:25:20 -0600"  >&lt;p&gt;Sounds good.&lt;/p&gt;</comment>
                    <comment id="30626" author="dnolen" created="Wed, 20 Feb 2013 08:42:42 -0600"  >&lt;p&gt;Is this patch up-to-date? Seems like 1.5 is just around the corner.&lt;/p&gt;</comment>
                    <comment id="30683" author="dnolen" created="Fri, 1 Mar 2013 13:28:15 -0600"  >&lt;p&gt;Can we get an updated version of this patch that applies to master? Thanks!&lt;/p&gt;</comment>
                    <comment id="30690" author="tomoj" created="Sun, 3 Mar 2013 12:28:47 -0600"  >&lt;p&gt;You want the patch as is, copying the macros from 1.5? I assumed we&apos;d move to 1.5 and then we can just add cond-&amp;gt; etc to the import-macros call.&lt;/p&gt;</comment>
                    <comment id="30774" author="tomoj" created="Sat, 16 Mar 2013 14:10:42 -0500"  >&lt;p&gt;Here&apos;s the patch I think you want. It applies to master and assumes 1.5. (&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-438&quot; title=&quot;copy cond-&amp;gt; etc from 1.5&quot;&gt;&lt;del&gt;CLJS-438&lt;/del&gt;&lt;/a&gt;_2012-03-16.patch)&lt;/p&gt;</comment>
                    <comment id="30780" author="dnolen" created="Sun, 17 Mar 2013 15:01:52 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/f311159889e66f7029e41ae5f61fda9ac3779643&quot;&gt;http://github.com/clojure/clojurescript/commit/f311159889e66f7029e41ae5f61fda9ac3779643&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11920" name="CLJS-438_2012-03-16.patch" size="1244" author="tomoj" created="Sat, 16 Mar 2013 14:10:42 -0500" />
                    <attachment id="11757" name="cljs-438-condetc.patch" size="3215" author="tomoj" created="Tue, 11 Dec 2012 17:50:07 -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-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-482] Rhino REPL env prints to System/out</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-482</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;All non-terminal REPLs bind &lt;tt&gt;&amp;#42;out&amp;#42;&lt;/tt&gt;, so printing REPL output to &lt;tt&gt;System/out&lt;/tt&gt; is unexpected (and sometimes black-holed depending on the environment).&lt;/p&gt;

&lt;p&gt;Attached patch binds &lt;tt&gt;&amp;#42;out&amp;#42;&lt;/tt&gt; in place of &lt;tt&gt;System/out&lt;/tt&gt; in the Rhino evaluation Context.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16055">CLJS-482</key>
            <summary>Rhino REPL env prints to System/out</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Tue, 5 Mar 2013 06:50:06 -0600</created>
                <updated>Thu, 14 Mar 2013 19:15:12 -0500</updated>
                    <resolved>Thu, 14 Mar 2013 19:15:12 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30701" author="cemerick" created="Tue, 5 Mar 2013 07:03:05 -0600"  >&lt;p&gt;Attached wrong patch initially.&lt;/p&gt;</comment>
                    <comment id="30762" author="dnolen" created="Thu, 14 Mar 2013 19:15:12 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/ab6325dc1619e1629d51a0f0a8bcb42dd380a39e&quot;&gt;http://github.com/clojure/clojurescript/commit/ab6325dc1619e1629d51a0f0a8bcb42dd380a39e&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11892" name="CLJS-482.diff" size="1096" author="cemerick" created="Tue, 5 Mar 2013 07:03:05 -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-483] Wrap cljs.compiler/compile-file in try/catch to clarify which file failed compilation</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-483</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;lein-cljsbuild compiles files via cljs.closure/compile-dir which in turn calls compile-file. If one file fails to compile it can be rather hard to find out which file caused the error since the reference to the file is lost.&lt;/p&gt;

&lt;p&gt;The patch ensures that the file is known and wraps the compile exception.&lt;/p&gt;

&lt;p&gt;See example confusing trace:&lt;br/&gt;
&lt;a href=&quot;https://gist.github.com/thheller/5103320#file-lein-cljsbuild-stracktrace-txt&quot;&gt;https://gist.github.com/thheller/5103320#file-lein-cljsbuild-stracktrace-txt&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the more helpful version:&lt;br/&gt;
&lt;a href=&quot;https://gist.github.com/thheller/5103320#file-better-trace-txt&quot;&gt;https://gist.github.com/thheller/5103320#file-better-trace-txt&lt;/a&gt;&lt;/p&gt;
</description>
                <environment></environment>
            <key id="16060">CLJS-483</key>
            <summary>Wrap cljs.compiler/compile-file in try/catch to clarify which file failed compilation</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="thheller">Thomas Heller</reporter>
                        <labels>
                    </labels>
                <created>Thu, 7 Mar 2013 04:19:56 -0600</created>
                <updated>Tue, 12 Mar 2013 10:49:37 -0500</updated>
                    <resolved>Tue, 12 Mar 2013 10:49:37 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30743" author="dnolen" created="Tue, 12 Mar 2013 10:49:37 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/1ad0b8de131d529afee38c18334e129574985691&quot;&gt;http://github.com/clojure/clojurescript/commit/1ad0b8de131d529afee38c18334e129574985691&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11898" name="cljs-wrap-compile-file.patch" size="1362" author="thheller" created="Thu, 7 Mar 2013 04:19:56 -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-484] defmulti compiler macro tries to throw a blank string in error case</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-484</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Test case&lt;/p&gt;

&lt;p&gt;&amp;gt; (defmulti foo bar {:hierarchy h})&lt;br/&gt;
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Throwable&lt;/p&gt;

&lt;p&gt;with the attached patch this is&lt;br/&gt;
clojure.lang.ExceptionInfo: The syntax for defmulti has changed. Example: (defmulti name dispatch-fn :default dispatch-value)&lt;/p&gt;</description>
                <environment></environment>
            <key id="16076">CLJS-484</key>
            <summary>defmulti compiler macro tries to throw a blank string in error case</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                    </labels>
                <created>Sun, 10 Mar 2013 22:18:39 -0500</created>
                <updated>Tue, 12 Mar 2013 10:46:27 -0500</updated>
                    <resolved>Tue, 12 Mar 2013 10:46:27 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30723" author="bendlas" created="Sun, 10 Mar 2013 22:22:58 -0500"  >&lt;p&gt;Feels kind of stupid to open a ticket for this. &lt;br/&gt;
Can we have a meta-ticket for patches that won&apos;t need any discussion, such as this almost - syntax error?&lt;/p&gt;</comment>
                    <comment id="30742" author="dnolen" created="Tue, 12 Mar 2013 10:46:27 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/2e1ee414689547c65c0feafd157048ccecd5c3ad&quot;&gt;http://github.com/clojure/clojurescript/commit/2e1ee414689547c65c0feafd157048ccecd5c3ad&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11906" name="0001-CLJS-484-Throw-exception-instead-of-trying-to-throw-.patch" size="1041" author="bendlas" created="Sun, 10 Mar 2013 22:22:58 -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-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-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-468] Extend CollFold and IKVReduce to nil</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-468</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This has been accepted and fixed for Clojure in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1098&quot; title=&quot;Extend CollFold and IKVReduce to nil&quot;&gt;&lt;del&gt;CLJ-1098&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="16002">CLJS-468</key>
            <summary>Extend CollFold and IKVReduce to nil</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                    </labels>
                <created>Tue, 12 Feb 2013 00:27:37 -0600</created>
                <updated>Fri, 1 Mar 2013 13:24:16 -0600</updated>
                    <resolved>Fri, 1 Mar 2013 13:24:16 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30617" author="dnolen" created="Tue, 19 Feb 2013 08:55:51 -0600"  >&lt;p&gt;Is there a patch for this?&lt;/p&gt;</comment>
                    <comment id="30669" author="bendlas" created="Wed, 27 Feb 2013 21:10:25 -0600"  >&lt;p&gt;Attached patches test and implement&lt;/p&gt;</comment>
                    <comment id="30682" author="dnolen" created="Fri, 1 Mar 2013 13:24:16 -0600"  >&lt;p&gt;fixed&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/clojure/clojurescript/commit/e1e14cb2e0437fae2ba5e5c194b1b3e8d2f23b59&quot;&gt;http://github.com/clojure/clojurescript/commit/e1e14cb2e0437fae2ba5e5c194b1b3e8d2f23b59&lt;/a&gt;&lt;br/&gt;
&lt;a href=&quot;http://github.com/clojure/clojurescript/commit/0b3187fb45d81fad8ea2e761cd5af22132b358f0&quot;&gt;http://github.com/clojure/clojurescript/commit/0b3187fb45d81fad8ea2e761cd5af22132b358f0&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11880" name="0001-CLJS-468-Test-reduce-kv-and-fold-with-nil.patch" size="2014" author="bendlas" created="Wed, 27 Feb 2013 21:10:25 -0600" />
                    <attachment id="11881" name="0002-CLJS-468-Implement-IKVReduce-for-nil.patch" size="604" author="bendlas" created="Wed, 27 Feb 2013 21:10:25 -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-466] Records are printed without namespace</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-466</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When printing a Record it is currently printed without the proper namespace.&lt;/p&gt;

&lt;p&gt;(ns dummy)&lt;br/&gt;
(defrecord Foo &lt;span class=&quot;error&quot;&gt;&amp;#91;bar&amp;#93;&lt;/span&gt;)&lt;br/&gt;
(pr-str (Foo. &quot;bar&quot;))&lt;/p&gt;

&lt;p&gt;will print as &quot;#dummy.Foo{...&quot; in CLJ but &quot;#Foo{...&quot; in CLJS.&lt;/p&gt;

&lt;p&gt;The attached patch fixes the implementation as well as the &quot;incorrect&quot; test.&lt;/p&gt;</description>
                <environment>Any</environment>
            <key id="15993">CLJS-466</key>
            <summary>Records are printed without namespace</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="thheller">Thomas Heller</reporter>
                        <labels>
                    </labels>
                <created>Tue, 5 Feb 2013 16:27:26 -0600</created>
                <updated>Tue, 26 Feb 2013 12:23:49 -0600</updated>
                    <resolved>Tue, 26 Feb 2013 12:18:54 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30559" author="dnolen" created="Wed, 6 Feb 2013 11:39:59 -0600"  >&lt;p&gt;Thanks, have you submitted your CA?&lt;/p&gt;</comment>
                    <comment id="30561" author="thheller" created="Wed, 6 Feb 2013 15:57:55 -0600"  >&lt;p&gt;Will do ASAP, I&apos;m in Germany so its probably gonna take a week or so.&lt;/p&gt;</comment>
                    <comment id="30654" author="dnolen" created="Tue, 26 Feb 2013 10:52:35 -0600"  >&lt;p&gt;This patch was not properly created. Please follow the example demonstrated here - &lt;a href=&quot;http://ariejan.net/2009/10/26/how-to-create-and-apply-a-patch-with-git&quot;&gt;http://ariejan.net/2009/10/26/how-to-create-and-apply-a-patch-with-git&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30660" author="thheller" created="Tue, 26 Feb 2013 12:14:47 -0600"  >&lt;p&gt;Patch updated.&lt;/p&gt;

&lt;p&gt;I sent me CA over 2 weeks ago, should I assume it was lost and try again or does it usually take this long?&lt;/p&gt;</comment>
                    <comment id="30661" author="dnolen" created="Tue, 26 Feb 2013 12:18:54 -0600"  >&lt;p&gt;Fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/8aa0cd7a0ba3f8466fcde83558ce83f275b61b32&quot;&gt;http://github.com/clojure/clojurescript/commit/8aa0cd7a0ba3f8466fcde83558ce83f275b61b32&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It looks like your CA made it just fine, thank you very much for the contribution! &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="30662" author="thheller" created="Tue, 26 Feb 2013 12:23:49 -0600"  >&lt;p&gt;Ah, awesome. Thanks.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11875" name="cljs-print-record-with-namespace.patch" size="1884" author="thheller" created="Tue, 26 Feb 2013 12:14: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="10002">Code and Test</customfieldvalue>

                </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-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-477] Variable argument functions break when first vararg is undefined</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-477</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;If the first of the variable arguments to a vararg function is the javascript value &lt;tt&gt;undefined&lt;/tt&gt;, the function behaves as though it didn&apos;t receive any variable arguments at all:&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 f [&amp;amp; &lt;span class=&quot;code-keyword&quot;&gt;rest&lt;/span&gt;] &lt;span class=&quot;code-keyword&quot;&gt;rest&lt;/span&gt;)

(f 1 2 3)
;; =&amp;gt; (1 2 3) ; correct

(f 1 js/undefined 3)
;; =&amp;gt; (1 nil 3) ; correct

(f js/undefined 2 3)
;; =&amp;gt; nil ; wrong&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="16027">CLJS-477</key>
            <summary>Variable argument functions break when first vararg is undefined</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="mtyaka">Matjaz Gregoric</assignee>
                                <reporter username="mtyaka">Matjaz Gregoric</reporter>
                        <labels>
                    </labels>
                <created>Sat, 23 Feb 2013 23:05:02 -0600</created>
                <updated>Tue, 26 Feb 2013 07:45:03 -0600</updated>
                    <resolved>Tue, 26 Feb 2013 07:45:03 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30647" author="mtyaka" created="Sat, 23 Feb 2013 23:11:45 -0600"  >&lt;p&gt;Attaching a patch that determines whether varargs were passed to the function by examining &lt;tt&gt;arguments.length&lt;/tt&gt; rather than checking the first argument in the vararg position with &lt;tt&gt;goog.isDef(arg)&lt;/tt&gt;.&lt;/p&gt;</comment>
                    <comment id="30649" author="dnolen" created="Mon, 25 Feb 2013 15:40:35 -0600"  >&lt;p&gt;This looks good, thanks!&lt;/p&gt;</comment>
                    <comment id="30652" author="dnolen" created="Tue, 26 Feb 2013 07:45:03 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/17f9c53e2c10f8565a1070df492d0b06028cdeec&quot;&gt;http://github.com/clojure/clojurescript/commit/17f9c53e2c10f8565a1070df492d0b06028cdeec&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11874" name="vararg-undefined.diff" size="1760" author="mtyaka" created="Sat, 23 Feb 2013 23:11:45 -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-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-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>3</votes>
                        <watches>3</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-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-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-362] Varargs protococol impls can be defined but not called</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-362</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Pretty much the same issue I described here &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1024&quot;&gt;http://dev.clojure.org/jira/browse/CLJ-1024&lt;/a&gt; but for ClojureScript rather than for Clojure. After the following declaration:&lt;/p&gt;

&lt;p&gt;(extend-protocol IFn js/Array (-invoke (&lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;amp; args&amp;#93;&lt;/span&gt; args)))&lt;/p&gt;

&lt;p&gt;Calling &lt;tt&gt;((array) 1 2 3)&lt;/tt&gt; will return 1 rather than (1 2 3).&lt;/p&gt;</description>
                <environment></environment>
            <key id="15648">CLJS-362</key>
            <summary>Varargs protococol impls can be defined but not called</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="vemv">V&#237;ctor M. Valenzuela</reporter>
                        <labels>
                    </labels>
                <created>Mon, 27 Aug 2012 12:49:05 -0500</created>
                <updated>Wed, 20 Feb 2013 08:41:48 -0600</updated>
                    <resolved>Wed, 20 Feb 2013 08:41:48 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30286" author="dnolen" created="Fri, 21 Dec 2012 18:10:02 -0600"  >&lt;p&gt;That is not how you extend to array nor are rest args supported on protocol implementations. I&apos;m inclined to decline this ticket if I don&apos;t have more information.&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-427] Unqualified use of excluded/re-assigned set! symbol causes compilation error </title>
                <link>http://dev.clojure.org/jira/browse/CLJS-427</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Compilation (with :optimizations :whitespace) fails when using an unqualified, re-assigned set! symbol, producing the following exception:&lt;/p&gt;

&lt;p&gt;java.lang.AssertionError: Assert failed: set! target must be a field or a symbol naming a var targetexpr&lt;br/&gt;
    analyzer.clj:578 cljs.analyzer/eval337&lt;span class=&quot;error&quot;&gt;&amp;#91;fn&amp;#93;&lt;/span&gt;&lt;br/&gt;
    ...&lt;/p&gt;

&lt;p&gt;(This only occurs when using set! without qualification.)&lt;/p&gt;</description>
                <environment>Linux, using lein-cljsbuild with clojurescript 0.0-1513</environment>
            <key id="15855">CLJS-427</key>
            <summary>Unqualified use of excluded/re-assigned set! symbol causes compilation error </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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="pandeiro">Murphy McMahon</reporter>
                        <labels>
                    </labels>
                <created>Sun, 25 Nov 2012 10:24:01 -0600</created>
                <updated>Wed, 20 Feb 2013 08:40:52 -0600</updated>
                    <resolved>Wed, 20 Feb 2013 08:40:52 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30282" author="dnolen" created="Fri, 21 Dec 2012 17:53:43 -0600"  >&lt;p&gt;Can we get a code example please? Thanks.&lt;/p&gt;</comment>
                    <comment id="30288" author="pandeiro" created="Sat, 22 Dec 2012 08:59:20 -0600"  >&lt;p&gt;Sure, given something 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;(ns store.local
  (:refer-clojure :exclude [set!]))

(defn set! [k x]
  (.setItem js/localStorage k x))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;


&lt;p&gt;...The following code breaks during compilation for me (tested just now with r1552):&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 app.core
  (:require [store.local :refer [set!]])
  (:refer-clojure :exclude [set!])

(defn store-items! [xs]
  (set! &lt;span class=&quot;code-quote&quot;&gt;&quot;data&quot;&lt;/span&gt; xs))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;...Whereas this code does not:&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 app.core
  (:require [store.local :as store]))

(defn store-items! [xs]
  (store/set! &lt;span class=&quot;code-quote&quot;&gt;&quot;data&quot;&lt;/span&gt; xs))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="30301" author="dnolen" created="Sat, 22 Dec 2012 15:42:10 -0600"  >&lt;p&gt;I looked a bit into the Clojure behavior, set! is a special form, one of the few things that can&apos;t be overridden. This behavior is the same as Clojure&apos;s and thus is unlikely to change. Unless you have some other argument for supporting this behavior I am inclined to close this ticket.&lt;/p&gt;</comment>
                    <comment id="30307" author="pandeiro" created="Sun, 23 Dec 2012 02:44:23 -0600"  >&lt;p&gt;No other argument, David; just that the behavior was unexpected since I was unaware set! is a special form. (Would it be helpful if the compiler warned against re-assignment then?) Anyhow, thanks for looking into it.&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-462] cljs.reader/read-string keyword parsing is inconsistent with clojure.core/read-string</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-462</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;cljs/reader.cljs:120 (def symbol-pattern (re-pattern &quot;&lt;span class=&quot;error&quot;&gt;&amp;#91;:&amp;#93;&lt;/span&gt;?(&lt;span class=&quot;error&quot;&gt;&amp;#91;^0-9/&amp;#93;&lt;/span&gt;.*/)?(&lt;span class=&quot;error&quot;&gt;&amp;#91;^0-9/&amp;#93;&lt;/span&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;^/&amp;#93;&lt;/span&gt;*)&quot;))&lt;br/&gt;
cljs/reader.cljs:330 a (re-matches* symbol-pattern token)&lt;/p&gt;

&lt;p&gt;symbol-pattern is not consistent with clojure&apos;s interpretation of valid keywords, e.g. the following are valid keywords in clojure that are not allowed by this regex:&lt;/p&gt;

&lt;p&gt;:0foo&lt;br/&gt;
:/foo/bar/baz&lt;/p&gt;</description>
                <environment></environment>
            <key id="15976">CLJS-462</key>
            <summary>cljs.reader/read-string keyword parsing is inconsistent with clojure.core/read-string</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="sfnelson">Stephen Nelson</reporter>
                        <labels>
                    </labels>
                <created>Wed, 23 Jan 2013 16:13:19 -0600</created>
                <updated>Wed, 20 Feb 2013 08:36:21 -0600</updated>
                    <resolved>Wed, 20 Feb 2013 08:36:21 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30483" author="dnolen" created="Sat, 26 Jan 2013 10:59:13 -0600"  >&lt;p&gt;Just because they are accepted by the reader doesn&apos;t make them valid - &lt;a href=&quot;http://clojure.org/reader&quot;&gt;http://clojure.org/reader&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unless there&apos;s some stronger evidence that this is meant to be allowed I&apos;m inclined to close 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-455] Warn on invalid js forms</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-455</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The ClojureScript compiler happily accepts forms like js/Math.MAX_NUMBER and (js/Math.ceil 3.14) which is not valid Clojure code. The correct way to write these expressions in ClojureScript is (.-MAX_NUMBER js/Math) and (.ceil js/Math 3.14). &lt;/p&gt;

&lt;p&gt;The ClojureScript analyzer should at least emit a warning when these bad forms are encountered. Preferably compilation should fail but that would probably break lots of existing code.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15957">CLJS-455</key>
            <summary>Warn on invalid js forms</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="jonase">Jonas Enlund</assignee>
                                <reporter username="jonase">Jonas Enlund</reporter>
                        <labels>
                    </labels>
                <created>Sat, 12 Jan 2013 06:12:16 -0600</created>
                <updated>Wed, 20 Feb 2013 08:35:37 -0600</updated>
                    <resolved>Wed, 20 Feb 2013 08:35:37 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30423" author="jonase" created="Sat, 12 Jan 2013 06:13:59 -0600"  >&lt;p&gt;Mailing list discussion here: &lt;a href=&quot;https://groups.google.com/d/topic/clojure/rtmPtmpo4qA/discussion&quot;&gt;https://groups.google.com/d/topic/clojure/rtmPtmpo4qA/discussion&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30424" author="jonase" created="Sat, 12 Jan 2013 06:21:24 -0600"  >&lt;p&gt;patch-cljs-455.diff adds a warning message and updates cljs.core and twitterbuzz to use correct js/ syntax.&lt;/p&gt;</comment>
                    <comment id="30432" author="dnolen" created="Sun, 13 Jan 2013 10:44:09 -0600"  >&lt;p&gt;Fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/b2df2c2a69a4f1c9be8d698b74122c98b1e22491&quot;&gt;http://github.com/clojure/clojurescript/commit/b2df2c2a69a4f1c9be8d698b74122c98b1e22491&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30533" author="jonase" created="Sat, 2 Feb 2013 15:28:29 -0600"  >&lt;p&gt;I&apos;m having second thoughts about this. Looking at the commit when the js namespace was introduced&lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt; you can see that, for example (goog.global.Math/exp x) was changed to (js/Math.exp x). I&apos;m thinking maybe the js magic namespace is meant to support these kinds of calls?&lt;/p&gt;

&lt;p&gt;Another issue I ran into was when using a js library (paper.js) and I was supposed to translate&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-keyword&quot;&gt;var&lt;/span&gt; x = &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; paper.Path()&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;into ClojureScript. I could not find any way to achieve this except &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 [x (js/paper.Path.)]
  ...)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There is an assertion&lt;span class=&quot;error&quot;&gt;&amp;#91;2&amp;#93;&lt;/span&gt; in the analyzer that prohibits the following alternative: &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 [x (&lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; (.-Path js/paper))]
  ...)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Removing the assertion (and the call to &apos;resolve-existing-var&apos;) the above expression seems to work just fine.&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt; &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/954e8529b1ec814f40af77d6035f90e93a9126ea&quot;&gt;https://github.com/clojure/clojurescript/commit/954e8529b1ec814f40af77d6035f90e93a9126ea&lt;/a&gt;&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;2&amp;#93;&lt;/span&gt; &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/analyzer.clj#L528&quot;&gt;https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/analyzer.clj#L528&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30536" author="dnolen" created="Sun, 3 Feb 2013 15:12:56 -0600"  >&lt;p&gt;This patch creates issues around using constructors provided by libraries outside ClojureScript and GClosure. Also from Rich&apos;s original commit support js prefix, it seems like JS style access after the / was actually intended.&lt;/p&gt;</comment>
                    <comment id="30538" author="jonase" created="Sun, 3 Feb 2013 22:25:01 -0600"  >&lt;p&gt;The patch revert455 removes the warnings on js/Foo.bar forms.&lt;/p&gt;</comment>
                    <comment id="30542" author="dnolen" created="Mon, 4 Feb 2013 10:40:05 -0600"  >&lt;p&gt;Patch applied to master&lt;/p&gt;</comment>
                    <comment id="30624" author="dnolen" created="Wed, 20 Feb 2013 08:35:37 -0600"  >&lt;p&gt;closing this one&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11804" name="patch-cljs-455.diff" size="3673" author="jonase" created="Sat, 12 Jan 2013 06:21:24 -0600" />
                    <attachment id="11830" name="revert-455.diff" size="3743" author="jonase" created="Sun, 3 Feb 2013 22:23:49 -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-467] ArrayNode&apos;s kv-reduce skips certain nodes</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-467</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When gaps are present in an ArrayNode&apos;s array, kv-reduce would skip nodes after the first gap due to a missing else branch.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15994">CLJS-467</key>
            <summary>ArrayNode&apos;s kv-reduce skips certain nodes</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="dergutemoritz">Moritz Heidkamp</reporter>
                        <labels>
                    </labels>
                <created>Thu, 7 Feb 2013 18:42:59 -0600</created>
                <updated>Tue, 19 Feb 2013 09:02:49 -0600</updated>
                    <resolved>Tue, 19 Feb 2013 09:02:49 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30568" author="dnolen" created="Thu, 7 Feb 2013 18:46:09 -0600"  >&lt;p&gt;Michal, does this seem correct to you?&lt;/p&gt;</comment>
                    <comment id="30569" author="michalmarczyk" created="Thu, 7 Feb 2013 19:21:01 -0600"  >&lt;p&gt;Yes, it does! Good catch.&lt;/p&gt;</comment>
                    <comment id="30618" author="dnolen" created="Tue, 19 Feb 2013 09:02:49 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/6dc1cafba44fb137ded63f106da694daf93c9621&quot;&gt;http://github.com/clojure/clojurescript/commit/6dc1cafba44fb137ded63f106da694daf93c9621&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11843" name="0001-Fix-bug-in-ArrayNode-s-kv-reduce.patch" size="1575" author="dergutemoritz" created="Thu, 7 Feb 2013 18:42:59 -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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-473] cljs.closure/add-dep-string calls wrong munge</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-473</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;cljs.closure/add-dep-string calls wrong munge (Clojure one), while it should be calling cljs.compiler/munge.&lt;/p&gt;

&lt;p&gt;The problem shows up when namespace contains a reserved js name and incremental dev build is performed.&lt;/p&gt;</description>
                <environment>latest CLJS</environment>
            <key id="16016">CLJS-473</key>
            <summary>cljs.closure/add-dep-string calls wrong munge</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="wagjo">Jozef Wagner</reporter>
                        <labels>
                    </labels>
                <created>Mon, 18 Feb 2013 09:25:20 -0600</created>
                <updated>Tue, 19 Feb 2013 08:50:10 -0600</updated>
                    <resolved>Tue, 19 Feb 2013 08:50:10 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30615" author="dnolen" created="Tue, 19 Feb 2013 08:50:10 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/896a1421ed720628f8d1a58c9a97050f2885d4bb&quot;&gt;http://github.com/clojure/clojurescript/commit/896a1421ed720628f8d1a58c9a97050f2885d4bb&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11862" name="cljs-473.diff" size="963" author="wagjo" created="Mon, 18 Feb 2013 09:34:10 -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-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-418] Unspecified dependency on google-closure-library-third-party</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-418</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Temporary fix to this issue: Add the G.Closure Library third-party extensions as a project dependency. &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;;; In :dependencies vector of Leiningen&apos;s project.clj
[org.clojure/google-closure-library-third-party &lt;span class=&quot;code-quote&quot;&gt;&quot;0.0-2029&quot;&lt;/span&gt;]&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;p&gt;We currently distribute the Google Closure Library in two separate JARs: the main library and the third-party extensions. We do this because the third-party extensions are covered by different licenses.&lt;/p&gt;

&lt;p&gt;But, as it turns out, various classes in the main library have explicit dependencies on things in the third-party extensions. See See also this &lt;a href=&quot;https://groups.google.com/d/msg/closure-library-discuss/4DG-XJn0s4E/i7nlq84V41kJ&quot;&gt;G.Closure mailing list discussion&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As a result, the ClojureScript browser-connected REPL has a transitive dependency on the Google Closure Library third-party extensions. This manifests as an error in script/cljsc and a NullPointerException in lein-cljsbuild.&lt;/p&gt;

&lt;p&gt;See the &lt;a href=&quot;https://groups.google.com/d/msg/clojure/kzzBoCZiAx0/W_wlfiSTMZgJ&quot;&gt;initial Clojure-dev mailing list discussion&lt;/a&gt; and &lt;a href=&quot;https://groups.google.com/d/msg/clojure/SFX4m0h6Z0g/gLLGOJFhSwsJ&quot;&gt;discussion of this ticket&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;See also &lt;a href=&quot;https://github.com/emezeske/lein-cljsbuild/issues/155&quot;&gt;lein-cljsbuild issue #155&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It seems that the dependency on third-party extensions is unavoidable. There are several possible fixes:&lt;/p&gt;

&lt;p&gt;1. Release a new G.Closure Library JAR with a &lt;b&gt;declared dependency&lt;/b&gt; on the third-party extensions JAR. This best reflects the &lt;b&gt;actual&lt;/b&gt; dependency relationships.&lt;/p&gt;

&lt;p&gt;2. Release a new G.Closure Library JAR with the third-party extensions included in the JAR. This would make it harder to exclude the third-party-licensed code from projects which do not actually require it.&lt;/p&gt;

&lt;p&gt;3. Release a new version of ClojureScript with a declared dependency on the third-party extensions JAR. This makes the dependency more visible to ClojureScript developers.&lt;/p&gt;

&lt;p&gt;Regardless of the approach taken, developers can always use explicit dependencies/exclusions to choose which version of the G.Closure library to include in their projects.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15827">CLJS-418</key>
            <summary>Unspecified dependency on google-closure-library-third-party</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="stuart.sierra">Stuart Sierra</assignee>
                                <reporter username="stuart.sierra">Stuart Sierra</reporter>
                        <labels>
                    </labels>
                <created>Fri, 16 Nov 2012 18:50:02 -0600</created>
                <updated>Sat, 16 Feb 2013 14:59:54 -0600</updated>
                    <resolved>Sat, 16 Feb 2013 14:59:54 -0600</resolved>
                                                                    <due></due>
                    <votes>3</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="30173" author="bendlas" created="Tue, 4 Dec 2012 19:10:36 -0600"  >&lt;p&gt;Attached patch implements option 1&lt;/p&gt;

&lt;p&gt;The generated closure-library depends on the old clojure-library-third-party.&lt;br/&gt;
Still, I would recommend releasing the -2 version of third-party too, in case someone includes third-party by c&amp;amp;p the library version.&lt;/p&gt;</comment>
                    <comment id="30245" author="emezeske" created="Sun, 16 Dec 2012 20:29:25 -0600"  >&lt;p&gt;I added a workaround for this so that I can release lein-cljsbuild without breaking every single project that uses it: &lt;a href=&quot;https://github.com/emezeske/lein-cljsbuild/issues/163&quot;&gt;https://github.com/emezeske/lein-cljsbuild/issues/163&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;I would like to revert this workaround ASAP.  I&apos;m going to do a bad job of maintaining the right version of the third party libraries, and it will cause problems down the road.&lt;/p&gt;</comment>
                    <comment id="30498" author="cemerick" created="Sun, 27 Jan 2013 17:37:17 -0600"  >&lt;p&gt;Option 1 is proper, 3 is acceptable.  &lt;b&gt;Any&lt;/b&gt; solution will do though; drove myself nuts with this today for longer than I&apos;d like to admit before I discovered this ticket.&lt;/p&gt;</comment>
                    <comment id="30499" author="dnolen" created="Sun, 27 Jan 2013 17:41:05 -0600"  >&lt;p&gt;Is everyone cool with option 1? It would be nice to resolve this one soon as people are running into non-working browser REPLs.&lt;/p&gt;</comment>
                    <comment id="30501" author="michalmarczyk" created="Sun, 27 Jan 2013 19:29:33 -0600"  >&lt;p&gt;+1 for option 1.&lt;/p&gt;</comment>
                    <comment id="30537" author="stuart.sierra" created="Sun, 3 Feb 2013 15:50:49 -0600"  >&lt;p&gt;Deployed new version of Google Closure library to Sonatype OSS today. Please try it out.&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;[org.clojure/google-closure-library &lt;span class=&quot;code-quote&quot;&gt;&quot;0.0-2029-2&quot;&lt;/span&gt;]&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This release declares an explicit dependency from google-closure-library on google-closure-library-third-party (Option 1 in the ticket description).&lt;/p&gt;

&lt;p&gt;It will be available in the Maven Central repository within 24 hours. Until then, you can get it from the Sonatype repository with these instructions:&lt;br/&gt;
&lt;a href=&quot;http://dev.clojure.org/display/doc/Maven+Settings+and+Repositories&quot;&gt;http://dev.clojure.org/display/doc/Maven+Settings+and+Repositories&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it works, we can update the ClojureScript POM to depend on it.&lt;/p&gt;

&lt;p&gt;-S&lt;/p&gt;</comment>
                    <comment id="30612" author="stuart.sierra" created="Sat, 16 Feb 2013 14:59:54 -0600"  >&lt;p&gt;pom.template updated in commit &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/f2e0d9050a1b3244b23d2be16ec34af60061121f&quot;&gt;f2e0d9050a1b&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11746" name="0001-CLJS-418-closure-r0.0-2029-2-specifies-dependency-on.patch" size="2117" author="bendlas" created="Tue, 4 Dec 2012 19:37: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-470] defprotocol warnings in REPL outside of cljs.user</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-470</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="16006">CLJS-470</key>
            <summary>defprotocol warnings in REPL outside of cljs.user</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bronsa">Nicola Mometto</reporter>
                        <labels>
                    </labels>
                <created>Wed, 13 Feb 2013 09:05:28 -0600</created>
                <updated>Wed, 13 Feb 2013 12:36:54 -0600</updated>
                    <resolved>Wed, 13 Feb 2013 12:36:54 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30583" author="jonase" created="Wed, 13 Feb 2013 11:12:29 -0600"  >&lt;p&gt;What is the point of &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/core.clj#L701&quot;&gt;this line&lt;/a&gt;? It seems to be a primitive kind of resolve-var? If this line is removed (and also the calls to fqn a few lines below) the errors are gone. The effect of removing fqn is that (defprotocol Foo (f &lt;span class=&quot;error&quot;&gt;&amp;#91;x&amp;#93;&lt;/span&gt;)) expands to &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.core/defn f
   ([x] (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (cljs.core/and x (. x -foo$Foo$f$arity$1))
          (. x foo$Foo$f$arity$1 x)
          (cljs.core/let [x__2284__auto__ (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (cljs.core/nil? x) nil x)]
                         ((cljs.core/or (cljs.core/aget f (goog.typeOf x__2284__auto__))
                                        (cljs.core/aget f &lt;span class=&quot;code-quote&quot;&gt;&quot;_&quot;&lt;/span&gt;)
                                        (&lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; (cljs.core/missing-protocol &lt;span class=&quot;code-quote&quot;&gt;&quot;Foo.f&quot;&lt;/span&gt; x))) x)))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;instead of &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.core/defn f
   ([x] (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (cljs.core/and x
                           (. x -foo$Foo$f$arity$1))
          (. x foo$Foo$f$arity$1 x)
          (cljs.core/let [x__2284__auto__ (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (cljs.core/nil? x) nil x)]
                         ((cljs.core/or (cljs.core/aget foo.f (goog.typeOf x__2284__auto__))
                                        (cljs.core/aget foo.f &lt;span class=&quot;code-quote&quot;&gt;&quot;_&quot;&lt;/span&gt;)
                                        (&lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; (cljs.core/missing-protocol &lt;span class=&quot;code-quote&quot;&gt;&quot;Foo.f&quot;&lt;/span&gt; x))) x)))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note the missing &quot;foo.&quot; in (cljs.core/get ...)&lt;/p&gt;</comment>
                    <comment id="30586" author="dnolen" created="Wed, 13 Feb 2013 11:32:50 -0600"  >&lt;p&gt;Can we please get a patch that doesn&apos;t change whitespace, thanks! Also a comment on the patch explaining precisely how this addresses issues at the REPL would be nice.&lt;/p&gt;</comment>
                    <comment id="30587" author="dnolen" created="Wed, 13 Feb 2013 12:19:38 -0600"  >&lt;p&gt;I believe the issue is really 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;user&amp;gt;(ns foo)
foo&amp;gt;(fn [] foo.-woz)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Will trigger a resolution warning even tho foo.-woz is an interop/implementation form, not a real way to specify Clojure vars.&lt;/p&gt;

&lt;p&gt;We should probably change to resolve-var in analyzer to not warn on cases like this.&lt;/p&gt;</comment>
                    <comment id="30588" author="dnolen" created="Wed, 13 Feb 2013 12:36:54 -0600"  >&lt;p&gt;Fixed in master &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/e33a6ba9c4b6e8d744e1ac2f3e784822459a5530&quot;&gt;http://github.com/clojure/clojurescript/commit/e33a6ba9c4b6e8d744e1ac2f3e784822459a5530&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11857" name="001-CLJS-470.patch" size="3385" author="bronsa" created="Wed, 13 Feb 2013 11:45:09 -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-465] Point to ClojureScript instead of Clojure mailing list in README.md</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-465</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Summary self explanatory&lt;/p&gt;</description>
                <environment></environment>
            <key id="15992">CLJS-465</key>
            <summary>Point to ClojureScript instead of Clojure mailing list in README.md</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="kanwei">Kanwei Li</reporter>
                        <labels>
                    </labels>
                <created>Tue, 5 Feb 2013 11:41:55 -0600</created>
                <updated>Wed, 6 Feb 2013 11:35:33 -0600</updated>
                    <resolved>Wed, 6 Feb 2013 11:35:33 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30557" author="dnolen" created="Wed, 6 Feb 2013 11:35:33 -0600"  >&lt;p&gt;The ClojureScript mailing list is a community run user list. I&apos;ve added a link. There is no good reason to only direct people interested in ClojureScript there.&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-464] `get-in` not behaving like Clojure when accessing non-existing inner maps</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-464</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;In Clojurescript:&lt;br/&gt;
(get-in {:a {:b 1}} &lt;span class=&quot;error&quot;&gt;&amp;#91;:a :b :c&amp;#93;&lt;/span&gt;)&lt;br/&gt;
=&amp;gt; Error: 1 is not an instance of ILookup&lt;/p&gt;

&lt;p&gt;In Clojure:&lt;br/&gt;
(get-in {:a {:b 1}} &lt;span class=&quot;error&quot;&gt;&amp;#91;:a :b :c&amp;#93;&lt;/span&gt;)&lt;br/&gt;
=&amp;gt; nil&lt;/p&gt;</description>
                <environment>Gentoo 64, oracle-jvm</environment>
            <key id="15979">CLJS-464</key>
            <summary>`get-in` not behaving like Clojure when accessing non-existing inner maps</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="roman">Roman Gonzalez</reporter>
                        <labels>
                        <label>bug</label>
                    </labels>
                <created>Sat, 26 Jan 2013 22:58:15 -0600</created>
                <updated>Mon, 28 Jan 2013 22:39:13 -0600</updated>
                    <resolved>Mon, 28 Jan 2013 22:39:13 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30493" author="roman" created="Sat, 26 Jan 2013 23:01:28 -0600"  >&lt;p&gt;Code and Test patch v1&lt;/p&gt;</comment>
                    <comment id="30495" author="dnolen" created="Sun, 27 Jan 2013 17:25:09 -0600"  >&lt;p&gt;Isn&apos;t this a duplicate of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-458&quot; title=&quot;get-in throws exception when key-list contains key that doesn&amp;#39;t satisfy ILookup&quot;&gt;&lt;del&gt;CLJS-458&lt;/del&gt;&lt;/a&gt;? That&apos;s been fixed in master.&lt;/p&gt;</comment>
                    <comment id="30502" author="roman" created="Mon, 28 Jan 2013 22:06:11 -0600"  >&lt;p&gt;Hey David, &lt;/p&gt;

&lt;p&gt;Thanks for your prompt reply, I tested latest version of github&apos;s master with the test-case I added and got this error.&lt;/p&gt;

&lt;p&gt;```shell&lt;br/&gt;
Testing with V8                                                                                                                                                                  &lt;br/&gt;
out/core-advanced-test.js:1: Error: No protocol method ILookup.-lookup defined for type number: 2                                                                                &lt;br/&gt;
function d(a){throw a;}var e=void 0,f=!0,g=null,h=!1;function aa(){return func                                                                                                   &lt;br/&gt;
                    ^                                                                                                                                                            &lt;br/&gt;
Error: No protocol method ILookup.-lookup defined for type number: 2                                                                                                             &lt;br/&gt;
    at Error (&amp;lt;anonymous&amp;gt;)                                                                                                                                                       &lt;br/&gt;
    at t (out/core-advanced-test.js:5:962)                                                                                                                                       &lt;br/&gt;
    at Function.ab &lt;span class=&quot;error&quot;&gt;&amp;#91;as c&amp;#93;&lt;/span&gt; (out/core-advanced-test.js:11:239)                                                                                                                     &lt;br/&gt;
    at Function.wd &lt;span class=&quot;error&quot;&gt;&amp;#91;as c&amp;#93;&lt;/span&gt; (out/core-advanced-test.js:49:60)                                                                                                                      &lt;br/&gt;
    at Function.Dc &lt;span class=&quot;error&quot;&gt;&amp;#91;as h&amp;#93;&lt;/span&gt; (out/core-advanced-test.js:36:58)                                                                                                                      &lt;br/&gt;
    at Nk.l.Da (out/core-advanced-test.js:176:128)                                                                                                                               &lt;br/&gt;
    at Function.Bb &lt;span class=&quot;error&quot;&gt;&amp;#91;as h&amp;#93;&lt;/span&gt; (out/core-advanced-test.js:16:342)                                                                                                                     &lt;br/&gt;
    at Function.Ye &lt;span class=&quot;error&quot;&gt;&amp;#91;as h&amp;#93;&lt;/span&gt; (out/core-advanced-test.js:65:210)                                                                                                                     &lt;br/&gt;
    at Function.Lj &lt;span class=&quot;error&quot;&gt;&amp;#91;as c&amp;#93;&lt;/span&gt; (out/core-advanced-test.js:164:27)                                                                                                                     &lt;br/&gt;
    at Eu (out/core-advanced-test.js:602:398)                                                                                                                                    &lt;/p&gt;

&lt;p&gt;SPIDERMONKEY_HOME not set, skipping SpiderMonkey tests                                                                                                                           &lt;br/&gt;
JSC_HOME not set, skipping JavaScriptCore tests                                                                                                                                  &lt;br/&gt;
Tested with 1 out of 3 possible js targets&lt;br/&gt;
```&lt;/p&gt;

&lt;p&gt;The test case is:&lt;/p&gt;

&lt;p&gt;```gitdiff&lt;br/&gt;
diff --git a/test/cljs/cljs/core_test.cljs b/test/cljs/cljs/core_test.cljs                                                                                                       &lt;br/&gt;
index 2d1d2f3..bf3f7bb 100644                                                                                                                                                    &lt;br/&gt;
&amp;#8212; a/test/cljs/cljs/core_test.cljs                                                                                                                                              &lt;br/&gt;
+++ b/test/cljs/cljs/core_test.cljs                                                                                                                                              &lt;br/&gt;
@@ -656,6 +656,7 @@                                                                                                                                                              &lt;br/&gt;
   (assert (= 1 (get-in &lt;span class=&quot;error&quot;&gt;&amp;#91;{:foo 1}, {:foo 2}&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;0 :foo&amp;#93;&lt;/span&gt;)))                                                                                                                         &lt;br/&gt;
   (assert (= 4 (get-in [{:foo 1 :bar &lt;span class=&quot;error&quot;&gt;&amp;#91;{:baz 1}, {:buzz 2}&amp;#93;&lt;/span&gt;}, {:foo 3 :bar &lt;span class=&quot;error&quot;&gt;&amp;#91;{:baz 3}, {:buzz 4}&amp;#93;&lt;/span&gt;}]                                                                               &lt;br/&gt;
                        &lt;span class=&quot;error&quot;&gt;&amp;#91;1 :bar 1 :buzz&amp;#93;&lt;/span&gt;)))                                                                                                                                      &lt;br/&gt;
+  (assert (nil? (get-in {:foo {:bar 2}} &lt;span class=&quot;error&quot;&gt;&amp;#91;:foo :bar :baz&amp;#93;&lt;/span&gt;)))                                                                                                                     &lt;/p&gt;

&lt;p&gt;   ;; arrays                                                                                                                                                                     &lt;br/&gt;
   (let [a (to-array &lt;span class=&quot;error&quot;&gt;&amp;#91;1 2 3&amp;#93;&lt;/span&gt;)] &lt;br/&gt;
```&lt;/p&gt;

&lt;p&gt;In case github&apos;s master is not the latest one, and test works on master, please discard this message.&lt;/p&gt;

&lt;p&gt;Cheers.&lt;/p&gt;</comment>
                    <comment id="30503" author="dnolen" created="Mon, 28 Jan 2013 22:39:13 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/2b21e9d5b09cdd09f2831d11810fa2c5ae4f14b1&quot;&gt;http://github.com/clojure/clojurescript/commit/2b21e9d5b09cdd09f2831d11810fa2c5ae4f14b1&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11823" name="get-in-fix.patch" size="1299" author="roman" created="Sat, 26 Jan 2013 23:01:28 -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-461] repeated assoc into map eventually drops meta data</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-461</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When running this loop, then the map&apos;s meta is lost after 32 assocs:&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;(loop [i 0, m (with-meta {} {:foo :bar})]
  (when (&amp;lt;= i 34)
    (.log js/console i (pr-str (meta m)))
    (recur (inc i) (assoc m (str i) i))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The last 4 lines of output read&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;31 {:foo :bar}
  32 {:foo :bar}
  33 nil
  34 nil&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;cljs.core.ObjMap/HASHMAP_THRESHOLD happens to be 32, so I guess&lt;br/&gt;
there is a connection.&lt;/p&gt;</description>
                <environment>[org.clojure/clojurescript &amp;quot;0.0-1552&amp;quot;]</environment>
            <key id="15973">CLJS-461</key>
            <summary>repeated assoc into map eventually drops meta data</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="mva">Michael van Acken</reporter>
                        <labels>
                    </labels>
                <created>Tue, 22 Jan 2013 07:57:22 -0600</created>
                <updated>Sun, 27 Jan 2013 17:31:41 -0600</updated>
                    <resolved>Sun, 27 Jan 2013 17:31:41 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30478" author="michalmarczyk" created="Thu, 24 Jan 2013 00:51:44 -0600"  >&lt;p&gt;obj-map-&amp;gt;hash-map failed to take into account the fact that transients don&apos;t support metadata. The attached patch fixes this.&lt;/p&gt;</comment>
                    <comment id="30480" author="michalmarczyk" created="Fri, 25 Jan 2013 06:11:26 -0600"  >&lt;p&gt;Just realized that this also happens with PAMs. New patch addresses the issue in both places. (Also tweaks the PAM-&amp;gt;PHM conversion &amp;#8211; no more transient creation for a single assoc.)&lt;/p&gt;</comment>
                    <comment id="30485" author="dnolen" created="Sat, 26 Jan 2013 11:06:24 -0600"  >&lt;p&gt;I tried the patch and it did not seem to resolve the case above. Could we get a patch that includes a test case? Thanks!&lt;/p&gt;</comment>
                    <comment id="30490" author="michalmarczyk" created="Sat, 26 Jan 2013 22:13:24 -0600"  >&lt;p&gt;I tried it again at a Rhino REPL and for me it resolves both problems (OM and PAM). New patch with test cases based on the form from the ticket attached. (The tests do fail on master.)&lt;/p&gt;</comment>
                    <comment id="30491" author="michalmarczyk" created="Sat, 26 Jan 2013 22:20:15 -0600"  >&lt;p&gt;Tweaked patch with ticket number mentioned in a comment above the new test cases.&lt;/p&gt;</comment>
                    <comment id="30497" author="dnolen" created="Sun, 27 Jan 2013 17:31:41 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3ed16f32c6532d30eccd76ed41f90c956051ac58&quot;&gt;http://github.com/clojure/clojurescript/commit/3ed16f32c6532d30eccd76ed41f90c956051ac58&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11821" name="0001-CLJS-461-preserve-metadata-on-automatic-map-conversi.patch" size="2807" author="michalmarczyk" created="Sat, 26 Jan 2013 22:20: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-459] Make order in which sorted map nodes are visited by reduce-kv consistent with entry order</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-459</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;On master, (reduce-kv prn nil (sorted-map :foo 1 :bar 2)) prints :foo before :bar. With the forthcoming patch applied, :bar comes first.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15969">CLJS-459</key>
            <summary>Make order in which sorted map nodes are visited by reduce-kv consistent with entry order</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="michalmarczyk">Micha&#322; Marczyk</reporter>
                        <labels>
                    </labels>
                <created>Sun, 20 Jan 2013 18:45:21 -0600</created>
                <updated>Sun, 27 Jan 2013 17:28:52 -0600</updated>
                    <resolved>Sun, 27 Jan 2013 17:28:52 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30486" author="dnolen" created="Sat, 26 Jan 2013 11:08:21 -0600"  >&lt;p&gt;Can we add test case via pr-str? Thanks!&lt;/p&gt;</comment>
                    <comment id="30492" author="michalmarczyk" created="Sat, 26 Jan 2013 22:39:20 -0600"  >&lt;p&gt;Sure, here&apos;s same patch plus a test case based on conjing onto a vector.&lt;/p&gt;

&lt;p&gt;I just noticed that Clojure 1.4&apos;s kvreduce on tree maps has funky visit order. Current RC of 1.5 is fixed (thanks to a patch by Alan Malloy, see 3c22b53f94f583bfda6b59c97310de82595e993c).&lt;/p&gt;</comment>
                    <comment id="30496" author="dnolen" created="Sun, 27 Jan 2013 17:28:52 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/306ff2282a7415a0e3e4822b61fb6151761f98a2&quot;&gt;http://github.com/clojure/clojurescript/commit/306ff2282a7415a0e3e4822b61fb6151761f98a2&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11822" name="0001-CLJS-459-fix-reduce-kv-node-visit-order-for-sorted-m.patch" size="1832" author="michalmarczyk" created="Sat, 26 Jan 2013 22:39:20 -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-458] get-in throws exception when key-list contains key that doesn&apos;t satisfy ILookup</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-458</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;(get-in {:a {:b 1}} &lt;span class=&quot;error&quot;&gt;&amp;#91;:a :b :c&amp;#93;&lt;/span&gt; :nothing-there)&lt;/p&gt;

&lt;p&gt;cljs throws exception &quot;Error: No protocol method ILookup.-lookup defined for type number: 1&quot;&lt;br/&gt;
clj returns :nothing-there&lt;/p&gt;

&lt;p&gt;Following snippet contains an additional (satisfies? ILookup m) test to end iteration and return no-value.&lt;br/&gt;
If solution looks ok, I can provide a patch.&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 get-in*
  &quot;Returns the value in a nested associative structure,
  where ks is a sequence of keys. Returns nil &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; the key is not present,
  or the not-found value &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; supplied.&quot;
  {:added &lt;span class=&quot;code-quote&quot;&gt;&quot;1.2&quot;&lt;/span&gt;
   :&lt;span class=&quot;code-keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;}
  ([m ks]
     (reduce get m ks))
  ([m ks not-found]
     (loop [sentinel lookup-sentinel
            m m
            ks (seq ks)]
       (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; ks
         (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-not (satisfies? ILookup m)
           not-found
           (let [m (get m (first ks) sentinel)]
             (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (identical? sentinel m)
               not-found
               (recur sentinel m (next ks)))))
         m))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment>clojurescript r1552</environment>
            <key id="15964">CLJS-458</key>
            <summary>get-in throws exception when key-list contains key that doesn&apos;t satisfy ILookup</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="franks">Frank Siebenlist</reporter>
                        <labels>
                    </labels>
                <created>Tue, 15 Jan 2013 13:14:39 -0600</created>
                <updated>Sat, 26 Jan 2013 11:15:03 -0600</updated>
                    <resolved>Sat, 26 Jan 2013 11:15:03 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30454" author="dnolen" created="Fri, 18 Jan 2013 15:26:02 -0600"  >&lt;p&gt;Yes patch welcome.&lt;/p&gt;</comment>
                    <comment id="30488" author="dnolen" created="Sat, 26 Jan 2013 11:15:03 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/e8d20229ee87747e3012ac97b5b7006d3703a305&quot;&gt;http://github.com/clojure/clojurescript/commit/e8d20229ee87747e3012ac97b5b7006d3703a305&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-460] defmulti ignores optional :hierarchy argument</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-460</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When an alternative hierarchy is provided to a defmulti declaration it should be used in place of the global hierarchy for isa?-based method dispatch. However, clojurescript multimethods seem to ignore this hierarchy and always use the global hierarchy. Test case provided.&lt;/p&gt;</description>
                <environment>clojurescript 1552</environment>
            <key id="15971">CLJS-460</key>
            <summary>defmulti ignores optional :hierarchy argument</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="sfnelson">Stephen Nelson</reporter>
                        <labels>
                    </labels>
                <created>Mon, 21 Jan 2013 15:01:20 -0600</created>
                <updated>Sat, 26 Jan 2013 11:09:34 -0600</updated>
                    <resolved>Sat, 26 Jan 2013 11:09:34 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30477" author="michalmarczyk" created="Thu, 24 Jan 2013 00:19:57 -0600"  >&lt;p&gt;The attached patch fixes the issue and introduces a very basic, directly relevant test.&lt;/p&gt;</comment>
                    <comment id="30487" author="dnolen" created="Sat, 26 Jan 2013 11:09:34 -0600"  >&lt;p&gt;fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/ad3ffece4af0fdbcf809e92a070440cfc7b2c500&quot;&gt;http://github.com/clojure/clojurescript/commit/ad3ffece4af0fdbcf809e92a070440cfc7b2c500&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11814" name="0001-CLJS-460-make-MultiFn-use-custom-hierarchy-when-spec.patch" size="2215" author="michalmarczyk" created="Thu, 24 Jan 2013 00:19:57 -0600" />
                    <attachment id="11809" name="mm-test-case.cljs" size="1159" author="sfnelson" created="Mon, 21 Jan 2013 15:01:20 -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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-358] Cannot restart Rhino ClojureScript REPL</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-358</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;In at least some environments (some have not been able to replicate this, others have), the ClojureScript REPL cannot be restarted.  Here&apos;s an example interaction, using the stock &lt;tt&gt;script/repl&lt;/tt&gt; script and a clean clone of ClojureScript (&lt;tt&gt;v0.0-1465-gdf6f316&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;la-mer:cljs chas$ script/repl
Clojure 1.4.0
user=&amp;gt; (require &apos;[cljs.repl :as repl])
nil
user=&amp;gt; (require &apos;[cljs.repl.rhino :as rhino])
nil
user=&amp;gt; (repl/repl (rhino/repl-env))
&lt;span class=&quot;code-quote&quot;&gt;&quot;Type: &quot;&lt;/span&gt; :cljs/quit &lt;span class=&quot;code-quote&quot;&gt;&quot; to quit&quot;&lt;/span&gt;
ClojureScript:cljs.user&amp;gt; (+ 1 2 3)
6
ClojureScript:cljs.user&amp;gt; :cljs/quit
nil
user=&amp;gt; (repl/repl (rhino/repl-env))
&lt;span class=&quot;code-quote&quot;&gt;&quot;Type: &quot;&lt;/span&gt; :cljs/quit &lt;span class=&quot;code-quote&quot;&gt;&quot; to quit&quot;&lt;/span&gt;
ClojureScript:cljs.user&amp;gt; (+ 1 2 3)
&lt;span class=&quot;code-quote&quot;&gt;&quot;Error evaluating:&quot;&lt;/span&gt; (+ 1 2 3) :as &lt;span class=&quot;code-quote&quot;&gt;&quot;((1 + 2) + 3);\n&quot;&lt;/span&gt;
org.mozilla.javascript.EcmaError: TypeError: Cannot read property &lt;span class=&quot;code-quote&quot;&gt;&quot;&lt;span class=&quot;code-object&quot;&gt;StringBuffer&lt;/span&gt;&quot;&lt;/span&gt; from undefined (cljs/core.cljs#6154)
at cljs/core.cljs:6154 (pr_sb)
at cljs/core.cljs:6168 (pr_str_with_opts)
at cljs/core.cljs:6212 (anonymous)
at cljs/core.cljs:6219 (anonymous)
at &amp;lt;cljs repl&amp;gt;:7

nil
ClojureScript:cljs.user&amp;gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15637">CLJS-358</key>
            <summary>Cannot restart Rhino ClojureScript REPL</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Tue, 21 Aug 2012 00:46:58 -0500</created>
                <updated>Sat, 26 Jan 2013 11:00:06 -0600</updated>
                    <resolved>Sat, 26 Jan 2013 10:59:59 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29290" author="dnolen" created="Wed, 29 Aug 2012 19:55:27 -0500"  >&lt;p&gt;Any leads on this specific directions on how to reproduce?&lt;/p&gt;</comment>
                    <comment id="29300" author="cemerick" created="Thu, 30 Aug 2012 06:22:20 -0500"  >&lt;p&gt;I&apos;m afraid not.  It happens for me 100% of the time from a fresh clone using &lt;tt&gt;script/repl&lt;/tt&gt; in two different environments:&lt;/p&gt;

&lt;p&gt;OS X 10.7.4&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;java version &lt;span class=&quot;code-quote&quot;&gt;&quot;1.6.0_33&quot;&lt;/span&gt;
Java(TM) SE &lt;span class=&quot;code-object&quot;&gt;Runtime&lt;/span&gt; Environment (build 1.6.0_33-b03-424-11M3720)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ubuntu 12.0.4&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;java version &lt;span class=&quot;code-quote&quot;&gt;&quot;1.7.0_03&quot;&lt;/span&gt;
OpenJDK &lt;span class=&quot;code-object&quot;&gt;Runtime&lt;/span&gt; Environment (IcedTea7 2.1.1pre) (7~u3-2.1.1~pre1-1ubuntu3)
OpenJDK Client VM (build 22.0-b10, mixed mode, sharing)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29301" author="xeqi" created="Thu, 30 Aug 2012 07:29:47 -0500"  >&lt;p&gt;I can reproduce this every time from a checkout.&lt;/p&gt;

&lt;p&gt;Transcript:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;tmp$ git clone &lt;a href=&quot;https://github.com/clojure/clojurescript.git&quot;&gt;https://github.com/clojure/clojurescript.git&lt;/a&gt;&lt;br/&gt;
Cloning into &apos;clojurescript&apos;...&lt;br/&gt;
remote: Counting objects: 10307, done.&lt;br/&gt;
remote: Compressing objects: 100% (4349/4349), done.&lt;br/&gt;
remote: Total 10307 (delta 4828), reused 10032 (delta 4589)&lt;br/&gt;
Receiving objects: 100% (10307/10307), 1.37 MiB | 346 KiB/s, done.&lt;br/&gt;
Resolving deltas: 100% (4828/4828), done.&lt;br/&gt;
tmp$ cd clojurescript/&lt;br/&gt;
clojurescript$ git rev-parse HEAD&lt;br/&gt;
dae155a34cd30dabba94f90e306afac930345dcf&lt;br/&gt;
clojurescript$ ./script/bootstrap &lt;br/&gt;
Fetching Clojure...&lt;br/&gt;
Copying clojure-1.4.0/clojure-1.4.0.jar to lib/clojure.jar...&lt;br/&gt;
Cleaning up Clojure directory...&lt;br/&gt;
Cleaning up Clojure archive...&lt;br/&gt;
Fetching Google Closure library...&lt;br/&gt;
Fetching Google Closure library...&lt;br/&gt;
Cleaning up Google Closure library archive...&lt;br/&gt;
Fetching Google Closure compiler...&lt;br/&gt;
Cleaning up Google Closure compiler archive...&lt;br/&gt;
Building lib/goog.jar...&lt;br/&gt;
jar cf ./lib/goog.jar -C closure/library/closure/ goog&lt;br/&gt;
Fetching Rhino...&lt;br/&gt;
Copying rhino1_7R3/js.jar to lib/js.jar...&lt;br/&gt;
Cleaning up Rhino directory...&lt;br/&gt;
Cleaning up Rhino archive...&lt;br/&gt;
Copying closure/compiler/compiler.jar to lib/compiler.jar&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;Bootstrap Completed&amp;#93;&lt;/span&gt;&lt;br/&gt;
clojurescript$ ./script/repl&lt;br/&gt;
Clojure 1.4.0&lt;br/&gt;
user=&amp;gt; (require &apos;&lt;span class=&quot;error&quot;&gt;&amp;#91;cljs.repl :as repl&amp;#93;&lt;/span&gt;)&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; (require &apos;&lt;span class=&quot;error&quot;&gt;&amp;#91;cljs.repl.rhino :as rhino&amp;#93;&lt;/span&gt;)&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; (repl/repl (rhino/repl-env))&lt;br/&gt;
&quot;Type: &quot; :cljs/quit &quot; to quit&quot;&lt;br/&gt;
ClojureScript:cljs.user&amp;gt; (+ 1 2 3)&lt;br/&gt;
6&lt;br/&gt;
ClojureScript:cljs.user&amp;gt; :cljs/quit&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; (repl/repl (rhino/repl-env))&lt;br/&gt;
&quot;Type: &quot; :cljs/quit &quot; to quit&quot;&lt;br/&gt;
ClojureScript:cljs.user&amp;gt; (+ 1 2 3)&lt;br/&gt;
&quot;Error evaluating:&quot; (+ 1 2 3) :as &quot;((1 + 2) + 3);\n&quot;&lt;br/&gt;
org.mozilla.javascript.EcmaError: TypeError: Cannot read property &quot;StringBuffer&quot; from undefined (cljs/core.cljs#6161)&lt;br/&gt;
	at cljs/core.cljs:6161 (pr_sb)&lt;br/&gt;
	at cljs/core.cljs:6175 (pr_str_with_opts)&lt;br/&gt;
	at cljs/core.cljs:6219 (anonymous)&lt;br/&gt;
	at cljs/core.cljs:6226 (anonymous)&lt;br/&gt;
	at &amp;lt;cljs repl&amp;gt;:7&lt;/p&gt;

&lt;p&gt;nil&lt;br/&gt;
ClojureScript:cljs.user&amp;gt; :cljs/quit&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; &lt;br/&gt;
clojurescript$ java -version&lt;br/&gt;
java version &quot;1.6.0_24&quot;&lt;br/&gt;
OpenJDK Runtime Environment (IcedTea6 1.11.3) (6b24-1.11.3-1ubuntu0.12.04.1)&lt;br/&gt;
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)&lt;/p&gt;&lt;/blockquote&gt;</comment>
                    <comment id="30482" author="cemerick" created="Sat, 26 Jan 2013 05:50:09 -0600"  >&lt;p&gt;The root cause of this problem is some shared state used by each flavour of REPL environment:&lt;/p&gt;

&lt;p&gt;Rhino: &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/repl/rhino.clj#L19&quot;&gt;https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/repl/rhino.clj#L19&lt;/a&gt;&lt;br/&gt;
Browser-REPL: &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/repl/browser.clj#L18&quot;&gt;https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/repl/browser.clj#L18&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Specifically related to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-358&quot; title=&quot;Cannot restart Rhino ClojureScript REPL&quot;&gt;&lt;del&gt;CLJS-358&lt;/del&gt;&lt;/a&gt; is the `loaded-libs` set used by the Rhino REPL environment; if I &lt;tt&gt;(reset! rhino/loaded-libs #{})&lt;/tt&gt; in between REPL sessions, then the failure noted in the ticket does not occur, and the REPL appears to be quite healthy.&lt;/p&gt;

&lt;p&gt;(further discussion @ &lt;a href=&quot;http://groups.google.com/group/clojure-dev/browse_thread/thread/df89f14489402e25&quot;&gt;http://groups.google.com/group/clojure-dev/browse_thread/thread/df89f14489402e25&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Fixing this by bringing the &lt;tt&gt;loaded-libs&lt;/tt&gt; set into the &lt;tt&gt;RhinoEnv&lt;/tt&gt; REPL environment type ended up being fairly straightforward, and is enough for me to call it a fix for this issue (resolving the same issues for browser REPL is much more involved).&lt;/p&gt;</comment>
                    <comment id="30484" author="dnolen" created="Sat, 26 Jan 2013 10:59:59 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3cdbf30a4965986e344f3918bad6543699c06566&quot;&gt;http://github.com/clojure/clojurescript/commit/3cdbf30a4965986e344f3918bad6543699c06566&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11818" name="CLJS-358.diff" size="3987" author="cemerick" created="Sat, 26 Jan 2013 05:50:09 -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-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-439] IEncodeClojure only works on same-context Objects</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-439</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The default impl uses &lt;tt&gt;(identical? (type x) js/Object)&lt;/tt&gt;, but objects created in another JS context (e.g. another frame) will fail this test, since their constructor is a &lt;em&gt;different&lt;/em&gt; js/Object. Thus js-&amp;gt;clj is the identity on such objects.&lt;/p&gt;

&lt;p&gt;I wonder if there are any related problems anywhere else, e.g. with protocols? This seems to be the only occurrence of &lt;tt&gt;js/Object&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;Maybe this can be fixed by extending IEncodeClojure to object? I don&apos;t immediately see how to do that without incurring the option destructuring overhead recursively.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15884">CLJS-439</key>
            <summary>IEncodeClojure only works on same-context Objects</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tomoj">Tom Jack</reporter>
                        <labels>
                    </labels>
                <created>Tue, 11 Dec 2012 18:54:11 -0600</created>
                <updated>Sun, 20 Jan 2013 00:52:27 -0600</updated>
                    <resolved>Sun, 20 Jan 2013 00:52:27 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="30224" author="dnolen" created="Thu, 13 Dec 2012 07:55:00 -0600"  >&lt;p&gt;I don&apos;t think this is something that ClojureScript should try to address at all. To me it seems similar to various classloader issues in JVM land.&lt;/p&gt;</comment>
                    <comment id="30233" author="tomoj" created="Sat, 15 Dec 2012 02:31:30 -0600"  >&lt;p&gt;OK, I don&apos;t disagree.&lt;/p&gt;</comment>
                    <comment id="30246" author="sgrove" created="Mon, 17 Dec 2012 00:33:10 -0600"  >&lt;p&gt;This is causing some unpleasantness, and I&apos;m not aware of the classloader issues. Why check (identical? js/object x) instead of (goog.isObject x) on &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L6948&quot;&gt;https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L6948&lt;/a&gt; ? &lt;/p&gt;</comment>
                    <comment id="30247" author="ibdknox" created="Mon, 17 Dec 2012 01:26:03 -0600"  >&lt;p&gt;this bit me as well and I can&apos;t see a downside to using goog.isObject. I agree with David about not going down a rabbit hole here, but I think we can do the &quot;right thing&quot; for free.&lt;/p&gt;

&lt;p&gt;EDIT: I spoke too soon. Looks like native objects, like dom nodes would blow up in this scenario. Also, goog.isObject returns true on functions, but that would be easy enough to deal with.&lt;/p&gt;</comment>
                    <comment id="30248" author="tomoj" created="Mon, 17 Dec 2012 02:31:28 -0600"  >&lt;p&gt;I suppose extending to object would similarly cause trouble for dom nodes etc?&lt;/p&gt;

&lt;p&gt;If you can get ahold of the js/Object from another frame, is it possible to extend IEncodeClojure to it?&lt;/p&gt;</comment>
                    <comment id="30281" author="dnolen" created="Fri, 21 Dec 2012 17:50:45 -0600"  >&lt;p&gt;I have some experience with this stuff - it&apos;s a rabbit hole. There are many objects that can cross contexts for which we can provide no sensible equality guarantees. If you need to move data between JS contexts then use GClosure and stick to the basic JS data types. I&apos;m inclined to close this one unless someone has a brilliant comprehensive solution that I&apos;m not seeing right now.&lt;/p&gt;</comment>
                    <comment id="30459" author="dnolen" created="Sun, 20 Jan 2013 00:52:27 -0600"  >&lt;p&gt;This one is tricky. Closing for now.&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-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-425] JavaScriptCore advanced compilation tests fail with StackOverflow</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-425</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Regression - we need to git bisect to determine the commit.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15844">CLJS-425</key>
            <summary>JavaScriptCore advanced compilation tests fail with StackOverflow</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 21 Nov 2012 10:15:31 -0600</created>
                <updated>Sun, 20 Jan 2013 00:47:55 -0600</updated>
                    <resolved>Sun, 20 Jan 2013 00:47:55 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30457" author="dnolen" created="Sun, 20 Jan 2013 00:47:55 -0600"  >&lt;p&gt;Haven&apos;t been able to repro&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-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-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-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-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-451] keywords should be implemented as JavaScript functions</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-451</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Keywords are currently implemented as JavaScript strings. This makes certain JavaScript interop situations awkward: to provide a javascript api a function that can pull data from a map, one must use #(:foo %) instead of the more natural :foo. This is confusing because ClojureScript functions are otherwise fully usable in contexts expecting JavaScript functions.&lt;/p&gt;

&lt;p&gt;The proposed alternative is to have keywords instead be implemented as JavaScript functions that accept a map and optional default value, assuming this doesn&apos;t otherwise screw up their core functionality of providing fast equality tests, etc.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15931">CLJS-451</key>
            <summary>keywords should be implemented as JavaScript functions</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dribnet">tom white</reporter>
                        <labels>
                    </labels>
                <created>Sun, 30 Dec 2012 05:47:11 -0600</created>
                <updated>Fri, 4 Jan 2013 16:52:27 -0600</updated>
                    <resolved>Fri, 4 Jan 2013 16:52:27 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30373" author="dnolen" created="Fri, 4 Jan 2013 16:52:27 -0600"  >&lt;p&gt;Keywords &amp;amp; Symbols are likely to become a proper ClojureScript datatypes. The benefit of keywords &amp;amp; symbols as implemented as functions is small.&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-448] Support for runtime reading of tagged elements</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-448</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;We ned the abilty to supply custom and default tag parsers when using &lt;tt&gt;cljs.reader/read-string&lt;/tt&gt; (found in &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/reader.cljs&quot;&gt;src/cljs/cljs/reader.cljs&lt;/a&gt;) in running ClojureScript applications.&lt;/p&gt;

&lt;h2&gt;&lt;a name=&quot;nsprefixedtags&quot;&gt;&lt;/a&gt;ns prefixed tags&lt;/h2&gt;

&lt;p&gt;As per the &lt;a href=&quot;https://github.com/edn-format/edn&quot;&gt;edn specification&lt;/a&gt; &quot;user tags must contain a prefix component&quot;. Currently, because &lt;tt&gt;(name tag)&lt;/tt&gt; is being called, the ns prefix component is dropped when looking up the tag in &lt;tt&gt;&amp;#42;tag-table&amp;#42;&lt;/tt&gt;&lt;/p&gt;

&lt;h2&gt;&lt;a name=&quot;defaultreaderfn&quot;&gt;&lt;/a&gt;default reader fn&lt;/h2&gt;

&lt;p&gt;Currently, there is no support for supplying a default reader fn (akin to &lt;tt&gt;&amp;#42;default-data-reader-fn&amp;#42;&lt;/tt&gt; in Clojure proper).&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;2issuesrolledintoone%3F&quot;&gt;&lt;/a&gt;2 issues rolled into one?&lt;/h3&gt;

&lt;p&gt;I know this may be bad practice rolling 2 issues into one, but I do not know how to formulate the separate patches that affect the same lines of code and have the apply correctly regardless of order. If I need to correct this, please advise.&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;Alreadyreported%3F&quot;&gt;&lt;/a&gt;Already reported?&lt;/h3&gt;

&lt;p&gt;I know this issue was already raised in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-335&quot; title=&quot;user defined tagged literals in CLJS&quot;&gt;CLJS-335&lt;/a&gt;, but from my experience with making these modifications for a running ClojureScript app, I did not come across the fns in the files mentioned in that task. I assume this is because that had more to do with compiling cljs code, but please correct me if I&apos;m wrong.&lt;/p&gt;

&lt;p&gt;Along those lines, is this patch not acceptable if it doesn&apos;t fix both places at once?&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;Approach%26Naming&quot;&gt;&lt;/a&gt;Approach &amp;amp; Naming&lt;/h3&gt;

&lt;p&gt;I followed the approach that was already in place for tag parsers, supplying register and deregister helper fns. I was a bit torn on naming because in Clojure &lt;tt&gt;&amp;#42;default-data-reader-fn&amp;#42;&lt;/tt&gt; is used, but in the existing ClojureScript code they are called &lt;tt&gt;tag-parser&lt;/tt&gt;. Should the &quot;reader&quot; vs &quot;parser&quot; nomenclature be unified between Clojure and ClojureScript, or are they named differently because they are fundamentally different in some way that I am missing?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15914">CLJS-448</key>
            <summary>Support for runtime reading of tagged elements</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="thickey">Tom Hickey</reporter>
                        <labels>
                    </labels>
                <created>Fri, 21 Dec 2012 10:15:27 -0600</created>
                <updated>Tue, 25 Dec 2012 13:42:53 -0600</updated>
                    <resolved>Sat, 22 Dec 2012 13:40:45 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30277" author="dnolen" created="Fri, 21 Dec 2012 17:03:27 -0600"  >&lt;p&gt;I don&apos;t think we can have a unified solution without a reader that is shared both at compile time and run time and I think the benefits &lt;b&gt;today&lt;/b&gt; of run time support trumps the possible future convenience of compile time support. I don&apos;t think there is any good reason for the difference in naming - I&apos;m inclined to keep things in line with Clojure as much as possible.&lt;/p&gt;

&lt;p&gt;Happy to move forward with this one unless there are objections from others.&lt;/p&gt;</comment>
                    <comment id="30293" author="dnolen" created="Sat, 22 Dec 2012 13:40:46 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/19d265dfc262ae93b9d6b1be5bf13905ef5445c6&quot;&gt;http://github.com/clojure/clojurescript/commit/19d265dfc262ae93b9d6b1be5bf13905ef5445c6&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30321" author="kovasb" created="Tue, 25 Dec 2012 13:42:53 -0600"  >&lt;p&gt;My problem in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-335&quot; title=&quot;user defined tagged literals in CLJS&quot;&gt;CLJS-335&lt;/a&gt; was that you couldn&apos;t compile cljs code with embedded user-defined tagged literals.&lt;/p&gt;

&lt;p&gt;The code in this ticket is also great. But it would be even better if there was a generic function for reading tagged literals, known or unknown, that had the exact same argument structure as the the tag reader functions.&lt;/p&gt;

&lt;p&gt;My solution for &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-335&quot; title=&quot;user defined tagged literals in CLJS&quot;&gt;CLJS-335&lt;/a&gt; is to read the TL into code that resolves and invokes the tag reader function on the CLJS side.&lt;/p&gt;

&lt;p&gt;However it will fail for unknown tags, and will not fall back on the default reader functionality defined in the solution for this ticket. It would be trivial to fix this, if there was a single function that my solution can use that handled both known and unknown tags. &lt;/p&gt;

&lt;p&gt;Otherwise, my solution can be extended with more code, to first check for a specific reader, and then fall back on the default reader.&lt;/p&gt;



</comment>
                </comments>
                    <attachments>
                    <attachment id="11771" name="prefixed-tags-20121221.diff" size="4744" author="thickey" created="Fri, 21 Dec 2012 10:15:27 -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="10002">Code and Test</customfieldvalue>

                </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-447] Throw exception if multiple namespaces are required with the same alias</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-447</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Take for example this 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;(ns foo
  (:require [views.bar :as bar]
            [model.bar :as bar]))

;; &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; is meant to use views.bar
(bar/update-view)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The call to update-view fails with a &quot;Cannot call method call of undefined&quot;, which is quite confusing if you have a big list of requires at the beginning. The expected behavior would be a compile-time error.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15913">CLJS-447</key>
            <summary>Throw exception if multiple namespaces are required with the same alias</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bsteuber">Benjamin Teuber</reporter>
                        <labels>
                    </labels>
                <created>Fri, 21 Dec 2012 06:50:52 -0600</created>
                <updated>Sun, 23 Dec 2012 16:10:08 -0600</updated>
                    <resolved>Sat, 22 Dec 2012 16:15:04 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30303" author="dnolen" created="Sat, 22 Dec 2012 16:15:04 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/7be30517f9204098bd193baa6c8241f8016f2eed&quot;&gt;http://github.com/clojure/clojurescript/commit/7be30517f9204098bd193baa6c8241f8016f2eed&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30306" author="tomoj" created="Sun, 23 Dec 2012 01:11:08 -0600"  >&lt;p&gt;I had found it convenient to be able to do &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 [foo :as f]) (:require-macros [foo :as f])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;, although I admit I was a bit surprised when I discovered that that worked.&lt;/p&gt;

&lt;p&gt;Would you be interested in a patch which preserves this behavior, or will we have to use separate aliases for fn/macro ns&apos;s from now on?&lt;/p&gt;</comment>
                    <comment id="30311" author="dnolen" created="Sun, 23 Dec 2012 11:52:38 -0600"  >&lt;p&gt;A patch to allow macro dependencies to reuse a namespace alias is welcome.&lt;/p&gt;</comment>
                    <comment id="30313" author="tomoj" created="Sun, 23 Dec 2012 16:10:08 -0600"  >&lt;p&gt;Here&apos;s a patch that does that (macro-realias.patch, 23 Dec 2012).&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11778" name="macro-realias.patch" size="2437" author="tomoj" created="Sun, 23 Dec 2012 16:10:08 -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-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-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-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-160] Reserved words not escaped in namespace names</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-160</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;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;(ns foo.&lt;span class=&quot;code-keyword&quot;&gt;interface&lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Since &quot;interface&quot; is a reserved word in JavaScript, any attempt to use functions in this namespace fails in the Google Closure Compiler with the message &quot;ERROR - Parse error. missing name after . operator.&quot;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15273">CLJS-160</key>
            <summary>Reserved words not escaped in namespace names</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="stuart.sierra">Stuart Sierra</reporter>
                        <labels>
                    </labels>
                <created>Mon, 12 Mar 2012 08:52:38 -0500</created>
                <updated>Sat, 22 Dec 2012 16:29:34 -0600</updated>
                    <resolved>Sat, 22 Dec 2012 16:29:34 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30304" author="dnolen" created="Sat, 22 Dec 2012 16:29:34 -0600"  >&lt;p&gt;This has been fixed for a while as far as I know.&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-424] Internal representation of keywords can not be differentiated by printable characters</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-424</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Currently, Symbols are represented by (str \uFDD1 \&apos; name) and keywords are represented by (str \uFDD0 \&apos; name)&lt;/p&gt;

&lt;p&gt;The \uFDDX character is not printable, so it appears as a little box when printed in a javascript repl such as the browser&apos;s console. The following character is always a \&apos; regardless of whether the object is a symbol or a keyword. This has bitten me during debugging on several occasions. The attached patch changes keywords to be represented internally by (str \uFFD1 \: name)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15838">CLJS-424</key>
            <summary>Internal representation of keywords can not be differentiated by printable characters</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 19 Nov 2012 17:33:48 -0600</created>
                <updated>Sat, 22 Dec 2012 15:45:34 -0600</updated>
                    <resolved>Sat, 22 Dec 2012 15:45:34 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30302" author="dnolen" created="Sat, 22 Dec 2012 15:45:34 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/21eab986826bd7a9e852712aaeda647a5de59b3b&quot;&gt;http://github.com/clojure/clojurescript/commit/21eab986826bd7a9e852712aaeda647a5de59b3b&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11689" name="CLJS-424-v1.patch" size="1526" author="bbloom" created="Mon, 19 Nov 2012 17:35: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-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-396] &quot;Simplify&quot; lower-case and upper-case functions in cljs.string</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-396</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15756">CLJS-396</key>
            <summary>&quot;Simplify&quot; lower-case and upper-case functions in cljs.string</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="edtsech">Edward Tsech</reporter>
                        <labels>
                    </labels>
                <created>Tue, 16 Oct 2012 07:07:36 -0500</created>
                <updated>Sat, 22 Dec 2012 15:26:26 -0600</updated>
                    <resolved>Sat, 22 Dec 2012 15:26:26 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30298" author="dnolen" created="Sat, 22 Dec 2012 15:26:26 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/00952e6c2c85fdc7dd2f97285fb8c142822444ac&quot;&gt;http://github.com/clojure/clojurescript/commit/00952e6c2c85fdc7dd2f97285fb8c142822444ac&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11565" name="lower-upper-case.patch" size="812" author="edtsech" created="Tue, 16 Oct 2012 07:07: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>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJS-386] Remove TODO comments in clojure.browser.dom</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-386</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Remove line &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/cljs/clojure/browser/dom.cljs#L151&quot;&gt;https://github.com/clojure/clojurescript/blob/master/src/cljs/clojure/browser/dom.cljs#L151&lt;/a&gt;&lt;br/&gt;
and &lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/cljs/clojure/browser/dom.cljs#L152&quot;&gt;https://github.com/clojure/clojurescript/blob/master/src/cljs/clojure/browser/dom.cljs#L152&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Because we can just use Google Closure class library directly:&lt;br/&gt;
(ns boom.core&lt;br/&gt;
  (:require &lt;span class=&quot;error&quot;&gt;&amp;#91;clojure.browser.dom :as dom&amp;#93;&lt;/span&gt;&lt;br/&gt;
            &lt;span class=&quot;error&quot;&gt;&amp;#91;goog.dom.classes :as cl&amp;#93;&lt;/span&gt;&lt;br/&gt;
            &lt;span class=&quot;error&quot;&gt;&amp;#91;goog.dom :as gdom&amp;#93;&lt;/span&gt;))&lt;/p&gt;

&lt;p&gt;(def el (gdom/getElement &quot;some-element&quot;))&lt;/p&gt;

&lt;p&gt;;; Add class&lt;br/&gt;
(cl/add el &quot;boom&quot;)&lt;br/&gt;
;; Remove class&lt;br/&gt;
(cl/remove el &quot;boom&quot;)&lt;br/&gt;
;; Toggle class&lt;br/&gt;
(cl/toggle el &quot;boom&quot;)&lt;br/&gt;
...&lt;/p&gt;</description>
                <environment></environment>
            <key id="15728">CLJS-386</key>
            <summary>Remove TODO comments in clojure.browser.dom</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="edtsech">Edward Tsech</reporter>
                        <labels>
                    </labels>
                <created>Sun, 30 Sep 2012 10:15:18 -0500</created>
                <updated>Sat, 22 Dec 2012 15:25:36 -0600</updated>
                    <resolved>Sat, 22 Dec 2012 15:25:36 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30297" author="dnolen" created="Sat, 22 Dec 2012 15:25:36 -0600"  >&lt;p&gt;Not even important enough to be considered trivial &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>
                </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-179] (ns &apos;foo) throws REPL into infinite loop</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-179</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;At a ClojureScript REPL (Rhino or browser-connected), accidentally quoting the argument to &lt;tt&gt;ns&lt;/tt&gt; yields a neverending stream of error messages:&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 &apos;whoops)

ClojureScript:(quote whoops)&amp;gt; clojure.lang.Cons cannot be &lt;span class=&quot;code-keyword&quot;&gt;cast&lt;/span&gt; to clojure.lang.Symbol
ClojureScript:(quote whoops)&amp;gt; clojure.lang.Cons cannot be &lt;span class=&quot;code-keyword&quot;&gt;cast&lt;/span&gt; to clojure.lang.Symbol
ClojureScript:(quote whoops)&amp;gt; clojure.lang.Cons cannot be &lt;span class=&quot;code-keyword&quot;&gt;cast&lt;/span&gt; to clojure.lang.Symbol
ClojureScript:(quote whoops)&amp;gt; clojure.lang.Cons cannot be &lt;span class=&quot;code-keyword&quot;&gt;cast&lt;/span&gt; to clojure.lang.Symbol
...&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15329">CLJS-179</key>
            <summary>(ns &apos;foo) throws REPL into infinite loop</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="harto">Stuart Campbell</reporter>
                        <labels>
                    </labels>
                <created>Wed, 11 Apr 2012 23:07:50 -0500</created>
                <updated>Sat, 22 Dec 2012 15:22:41 -0600</updated>
                    <resolved>Sat, 22 Dec 2012 15:22:41 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28930" author="craigbrozefsky" created="Sun, 1 Jul 2012 22:11:16 -0500"  >&lt;p&gt;Ignrore my previous comment, got confused by my own emacs. 8^)&lt;/p&gt;</comment>
                    <comment id="28931" author="craigbrozefsky" created="Sun, 1 Jul 2012 22:31:17 -0500"  >&lt;p&gt;I resolved this by putting an assertion in the parse method for &apos;ns, which ensures that the name value is a symbol.  I&apos;ll attach a patch, but I don&apos;t have my contributors agreement in place yet.  I put this patch in the public domain if that helps.th&lt;/p&gt;</comment>
                    <comment id="28932" author="craigbrozefsky" created="Sun, 1 Jul 2012 22:32:13 -0500"  >&lt;p&gt;Placed in the public domain.  I am putting together my CA now.&lt;/p&gt;</comment>
                    <comment id="28933" author="dnolen" created="Mon, 2 Jul 2012 11:54:28 -0500"  >&lt;p&gt;Thanks!&lt;/p&gt;</comment>
                    <comment id="30296" author="dnolen" created="Sat, 22 Dec 2012 15:22:41 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/2cc3f1e8106a5d09b59df3b63504bf1def4bce7e&quot;&gt;http://github.com/clojure/clojurescript/commit/2cc3f1e8106a5d09b59df3b63504bf1def4bce7e&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11358" name="ns-symbol-assertion.patch" size="443" author="craigbrozefsky" created="Sun, 1 Jul 2012 22:32:13 -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-435] Stack overflow error when adding large numerical keys to maps</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-435</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The following code causes a stack overflow in Google Chrome browser and repljs. Transcript follows.&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;~/tools/clojurescript$  script/repljs
&lt;span class=&quot;code-quote&quot;&gt;&quot;Type: &quot;&lt;/span&gt; :cljs/quit &lt;span class=&quot;code-quote&quot;&gt;&quot; to quit&quot;&lt;/span&gt;
ClojureScript:cljs.user&amp;gt; (assoc {}
  154618822656 1
  261993005056 1)
&lt;span class=&quot;code-quote&quot;&gt;&quot;Error evaluating:&quot;&lt;/span&gt; (assoc {} 154618822656 1 261993005056 1) :as &lt;span class=&quot;code-quote&quot;&gt;&quot;cljs.core.assoc.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;,cljs.core.ObjMap.EMPTY,154618822656,1,261993005056,1);\n&quot;&lt;/span&gt;
java.lang.StackOverflowError
        org.mozilla.javascript.NativeCall.&amp;lt;init&amp;gt;(NativeCall.java:65)
        org.mozilla.javascript.ScriptRuntime.createFunctionActivation(ScriptRuntime.java:3273)
        org.mozilla.javascript.gen.cljs_core_cljs_834._c__hash_1(cljs/core.cljs)
        org.mozilla.javascript.gen.cljs_core_cljs_834.call(cljs/core.cljs)
        org.mozilla.javascript.ScriptRuntime.applyOrCall(ScriptRuntime.java:2521)
        org.mozilla.javascript.BaseFunction.execIdCall(BaseFunction.java:300)
        org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:129)
        org.mozilla.javascript.optimizer.OptRuntime.call2(OptRuntime.java:76)
        org.mozilla.javascript.gen.cljs_core_cljs_909._c_anonymous_3(cljs/core.cljs:905)
        org.mozilla.javascript.gen.cljs_core_cljs_909.call(cljs/core.cljs)
        org.mozilla.javascript.ScriptRuntime.applyOrCall(ScriptRuntime.java:2521)
        org.mozilla.javascript.BaseFunction.execIdCall(BaseFunction.java:300)
        org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:129)
        org.mozilla.javascript.optimizer.OptRuntime.callN(OptRuntime.java:86)
        org.mozilla.javascript.gen.cljs_core_cljs_909._c_anonymous_5(cljs/core.cljs:913)
        org.mozilla.javascript.gen.cljs_core_cljs_909.call(cljs/core.cljs)
        org.mozilla.javascript.ScriptRuntime.applyOrCall(ScriptRuntime.java:2521)
        org.mozilla.javascript.BaseFunction.execIdCall(BaseFunction.java:300)
        org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:129)
        org.mozilla.javascript.optimizer.OptRuntime.callN(OptRuntime.java:86)
        org.mozilla.javascript.gen.cljs_core_cljs_909._c_anonymous_2(cljs/core.cljs:893)
        org.mozilla.javascript.gen.cljs_core_cljs_909.call(cljs/core.cljs)
        org.mozilla.javascript.ScriptRuntime.applyOrCall(ScriptRuntime.java:2521)
        org.mozilla.javascript.BaseFunction.execIdCall(BaseFunction.java:300)
        org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:129)
        org.mozilla.javascript.optimizer.OptRuntime.call2(OptRuntime.java:76)
        org.mozilla.javascript.gen.cljs_core_cljs_909._c_anonymous_5(cljs/core.cljs:911)
        org.mozilla.javascript.gen.cljs_core_cljs_909.call(cljs/core.cljs)
        org.mozilla.javascript.ScriptRuntime.applyOrCall(ScriptRuntime.java:2521)
        org.mozilla.javascript.BaseFunction.execIdCall(BaseFunction.java:300)
        org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:129)
        org.mozilla.javascript.optimizer.OptRuntime.call2(OptRuntime.java:76)
        org.mozilla.javascript.gen.cljs_core_cljs_1175._c_anonymous_2(cljs/core.cljs:4481)
        org.mozilla.javascript.gen.cljs_core_cljs_1175.call(cljs/core.cljs)
        org.mozilla.javascript.ScriptRuntime.applyOrCall(ScriptRuntime.java:2521)
        org.mozilla.javascript.BaseFunction.execIdCall(BaseFunction.java:300)
        org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:129)
        org.mozilla.javascript.optimizer.OptRuntime.callN(OptRuntime.java:86)
        org.mozilla.javascript.gen.cljs_core_cljs_1175._c_anonymous_4(cljs/core.cljs:4501)
        org.mozilla.javascript.gen.cljs_core_cljs_1175.call(cljs/core.cljs)
        org.mozilla.javascript.ScriptRuntime.applyOrCall(ScriptRuntime.java:2521)
        org.mozilla.javascript.BaseFunction.execIdCall(BaseFunction.java:300)
        org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:129)
        org.mozilla.javascript.optimizer.OptRuntime.callN(OptRuntime.java:86)
        org.mozilla.javascript.gen.cljs_core_cljs_1169._c_anonymous_12(cljs/core.cljs:4388)
        org.mozilla.javascript.gen.cljs_core_cljs_1169.call(cljs/core.cljs)
        org.mozilla.javascript.optimizer.OptRuntime.callN(OptRuntime.java:86)
        org.mozilla.javascript.gen.cljs_core_cljs_1175._c_anonymous_2(cljs/core.cljs:4486)
        org.mozilla.javascript.gen.cljs_core_cljs_1175.call(cljs/core.cljs)
        org.mozilla.javascript.ScriptRuntime.applyOrCall(ScriptRuntime.java:2521)
        org.mozilla.javascript.BaseFunction.execIdCall(BaseFunction.java:300)
        org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:129)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment>Linux 2.6.32-44-generic #98-Ubuntu SMP  i686 GNU/Linux, java version &amp;quot;1.6.0_26&amp;quot;, just bootstrapped clojurescript.</environment>
            <key id="15871">CLJS-435</key>
            <summary>Stack overflow error when adding large numerical keys to maps</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="praki">Praki Prakash</reporter>
                        <labels>
                    </labels>
                <created>Wed, 5 Dec 2012 15:55:28 -0600</created>
                <updated>Sat, 22 Dec 2012 14:01:36 -0600</updated>
                    <resolved>Sat, 22 Dec 2012 14:01:36 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30294" author="dnolen" created="Sat, 22 Dec 2012 14:01:36 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/61455e64f58a07706c9b5ecebc9247bf085f7df1&quot;&gt;http://github.com/clojure/clojurescript/commit/61455e64f58a07706c9b5ecebc9247bf085f7df1&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-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-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-413] Using &apos;null&apos; as a var name leads to illegal code</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-413</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;(ns pkg)

(def &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;code-quote&quot;&gt;&quot;abc&quot;&lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;compiles to the following javascript&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;pkg.&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt; = &lt;span class=&quot;code-quote&quot;&gt;&quot;abc&quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;which is not legal. Other reserved javascript keywords may have the same issue.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15806">CLJS-413</key>
            <summary>Using &apos;null&apos; as a var name leads to illegal code</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                    </labels>
                <created>Tue, 30 Oct 2012 15:07:19 -0500</created>
                <updated>Fri, 21 Dec 2012 17:58:32 -0600</updated>
                    <resolved>Fri, 21 Dec 2012 17:58:32 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30283" author="dnolen" created="Fri, 21 Dec 2012 17:58:32 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/9219dacfefc6e90012eedd89487747e10f013372&quot;&gt;http://github.com/clojure/clojurescript/commit/9219dacfefc6e90012eedd89487747e10f013372&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-441] Require implicit &apos;do nodes for all blocks in AST</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-441</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Discussion here: &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/6CVTsW1EQn4/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/6CVTsW1EQn4/discussion&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15886">CLJS-441</key>
            <summary>Require implicit &apos;do nodes for all blocks in AST</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Wed, 12 Dec 2012 13:15:48 -0600</created>
                <updated>Fri, 21 Dec 2012 17:36:42 -0600</updated>
                    <resolved>Fri, 21 Dec 2012 17:36:42 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30220" author="bbloom" created="Wed, 12 Dec 2012 13:18:34 -0600"  >&lt;p&gt;This patch depends on the patch at &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-440&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-440&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30221" author="bbloom" created="Wed, 12 Dec 2012 15:18:35 -0600"  >&lt;p&gt;This patch would also address &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-416&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-416&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30280" author="dnolen" created="Fri, 21 Dec 2012 17:36:42 -0600"  >&lt;p&gt;Fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/764565e9e7696379ada5ac8168b20ee5f9cde6a2&quot;&gt;http://github.com/clojure/clojurescript/commit/764565e9e7696379ada5ac8168b20ee5f9cde6a2&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11760" name="CLJS-441-v001.patch" size="11443" author="bbloom" created="Wed, 12 Dec 2012 13:18:34 -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-416] emit-block doesn&apos;t use context argument</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-416</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;emit-block currently has arguments &lt;span class=&quot;error&quot;&gt;&amp;#91;context statements ret&amp;#93;&lt;/span&gt; but the context argument is never used and all call sites always draw statements and ret from the same block AST node. The attach patch simplifies emit-block and all call sites to use arguments [{:keys &lt;span class=&quot;error&quot;&gt;&amp;#91;statement ret&amp;#93;&lt;/span&gt;}]&lt;/p&gt;</description>
                <environment></environment>
            <key id="15819">CLJS-416</key>
            <summary>emit-block doesn&apos;t use context argument</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="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Fri, 9 Nov 2012 18:20:54 -0600</created>
                <updated>Fri, 21 Dec 2012 17:30:54 -0600</updated>
                    <resolved>Fri, 21 Dec 2012 17:30:54 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30279" author="bbloom" created="Fri, 21 Dec 2012 17:30:54 -0600"  >&lt;p&gt;Obsoleted by &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-441&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-441&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11670" name="CLJS-316-v1.patch" size="5148" author="bbloom" created="Fri, 9 Nov 2012 18:22:08 -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-440] Replace :is-loop flag in AST with distinct :loop op</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-440</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Discussion here: &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/6CVTsW1EQn4/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/6CVTsW1EQn4/discussion&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15885">CLJS-440</key>
            <summary>Replace :is-loop flag in AST with distinct :loop op</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Wed, 12 Dec 2012 13:07:03 -0600</created>
                <updated>Fri, 21 Dec 2012 17:12:07 -0600</updated>
                    <resolved>Fri, 21 Dec 2012 17:12:07 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30219" author="bbloom" created="Wed, 12 Dec 2012 13:14:35 -0600"  >&lt;p&gt;Whoops. Accidentally made a Clojure issue instead of a ClojureScript issue. Moved the ticket and reuploaded patch with correct ticket #&lt;/p&gt;</comment>
                    <comment id="30278" author="dnolen" created="Fri, 21 Dec 2012 17:12:07 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/26b2541cd66d3139eca354434a56137218b17d09&quot;&gt;http://github.com/clojure/clojurescript/commit/26b2541cd66d3139eca354434a56137218b17d09&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11758" name="CLJS-1126-v001.patch" size="2339" author="bbloom" created="Wed, 12 Dec 2012 13:08:21 -0600" />
                    <attachment id="11759" name="CLJS-440-v001.patch" size="2339" author="bbloom" created="Wed, 12 Dec 2012 13:14:35 -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-442] Lazy seqs fails to close over local vars</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-442</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When executing following 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;(loop [i 10
       v [0]
       v2 [0]]
  (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (pos? i)
    (let [j i
          x (map #(+ j %) v)]
      (recur (dec i) x (map #(+ j %) v2)))
    (concat v v2)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Clojure produces &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;(55 55)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; while Clojurescript produces &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;(10 55)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Forcing realization of lazy seqs produces correct output &lt;tt&gt;(55 55)&lt;/tt&gt; on both environments.&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;(loop [i 10
       v [0]
       v2 [0]]
  (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (pos? i)
    (let [j i
          x (doall (map #(+ j %) v))]
      (recur (dec i) x (doall (map #(+ j %) v2))))
    (concat v v2)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment>master clojurescript, commit 9abeb143f6</environment>
            <key id="15891">CLJS-442</key>
            <summary>Lazy seqs fails to close over local vars</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="2" iconUrl="http://dev.clojure.org/jira/images/icons/priority_critical.gif">Critical</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="wagjo">Jozef Wagner</reporter>
                        <labels>
                    </labels>
                <created>Fri, 14 Dec 2012 13:08:56 -0600</created>
                <updated>Wed, 19 Dec 2012 07:46:00 -0600</updated>
                    <resolved>Tue, 18 Dec 2012 15:08:25 -0600</resolved>
                                                                    <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30231" author="michalmarczyk" created="Fri, 14 Dec 2012 23:28:14 -0600"  >&lt;p&gt;This is actually due to a bug in analyze-let whereby functions involved in init-exprs would not close over earlier bindings. The attached patch fixes this.&lt;/p&gt;</comment>
                    <comment id="30232" author="michalmarczyk" created="Fri, 14 Dec 2012 23:30:26 -0600"  >&lt;p&gt;Incidentally, I wonder whether &amp;#42;loop-lets&amp;#42; is still an appropriate name for this Var...&lt;/p&gt;</comment>
                    <comment id="30257" author="dnolen" created="Tue, 18 Dec 2012 15:04:36 -0600"  >&lt;p&gt;Do you have a better name in mind?&lt;/p&gt;</comment>
                    <comment id="30258" author="dnolen" created="Tue, 18 Dec 2012 15:08:25 -0600"  >&lt;p&gt;fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/84e9488f49bcfea4b4037a562f8f797c7ddd79f0&quot;&gt;http://github.com/clojure/clojurescript/commit/84e9488f49bcfea4b4037a562f8f797c7ddd79f0&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30264" author="wagjo" created="Wed, 19 Dec 2012 07:46:00 -0600"  >&lt;p&gt;Thank you, you guys are great!&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11765" name="0001-CLJS-442-fix-a-bug-whereby-fns-might-not-close-over-.patch" size="1351" author="michalmarczyk" created="Fri, 14 Dec 2012 23:28:14 -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-446] Rhino REPL emits warnings twice</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-446</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This only affects functions - functions get a second pass from the compiler in order to leverage arity information for self call optimization.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15906">CLJS-446</key>
            <summary>Rhino REPL emits warnings twice</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Tue, 18 Dec 2012 14:41:02 -0600</created>
                <updated>Tue, 18 Dec 2012 15:38:04 -0600</updated>
                    <resolved>Tue, 18 Dec 2012 15:38:04 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30260" author="dnolen" created="Tue, 18 Dec 2012 15:38:04 -0600"  >&lt;p&gt;fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/cd89461082c74c9b7d3429dfa34ee9344531690d&quot;&gt;http://github.com/clojure/clojurescript/commit/cd89461082c74c9b7d3429dfa34ee9344531690d&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-419] Exclude cljs source file from compilation</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-419</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Scenario:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;you have a :dev build and a :prod build&lt;/li&gt;
	&lt;li&gt;In the :dev build you want to have a brepl connected with the browser and you coded that connection in a isolated cljs source file.&lt;/li&gt;
	&lt;li&gt;In the :prod build you do not want that connection active, meaning you don&apos;t want source cljs file enabling the connection to be included in the compilation.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Given this scenario, you need to &lt;b&gt;duplicate&lt;/b&gt; all the cljs source files but the one that enable the connection. This mean you have to &lt;b&gt;manually maintain&lt;/b&gt; two code bases.&lt;/p&gt;

&lt;p&gt;It could be useful to have a way to :exclude some files from :source-path.&lt;/p&gt;</description>
                <environment>every environment</environment>
            <key id="15828">CLJS-419</key>
            <summary>Exclude cljs source file from compilation</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="magomimmo">Mimmo Cosenza</reporter>
                        <labels>
                        <label>enhancement</label>
                    </labels>
                <created>Sat, 17 Nov 2012 09:35:38 -0600</created>
                <updated>Tue, 18 Dec 2012 15:09:20 -0600</updated>
                    <resolved>Tue, 18 Dec 2012 15:09:20 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29963" author="dnolen" created="Sun, 18 Nov 2012 15:16:05 -0600"  >&lt;p&gt;This could easily be done by adding support for this in closure.clj - patch welcome!&lt;/p&gt;</comment>
                    <comment id="29982" author="magomimmo" created="Tue, 20 Nov 2012 06:11:35 -0600"  >&lt;p&gt;I propose to add a new keyword/value in the optimization option map, namely :exclude-path. the value of this option should be a subdir of the source-dir. &lt;/p&gt;

&lt;p&gt;Top level scenario:&lt;/p&gt;

&lt;p&gt;1. you use lein-cljsbuild to define your cljs project&lt;br/&gt;
2. you define more builds, e.g. a :dev build and a :prod build.&lt;br/&gt;
(defproject ...&lt;br/&gt;
  :cljsbuild {:builds &lt;br/&gt;
              {:dev {:source-path &quot;src/cljs&quot; {:compiler {:output-to &quot;resources/public/js/main_dbg.js&quot;&lt;br/&gt;
                                                         :optimizations :whitespace &lt;br/&gt;
                                                         :pretty-print true}}}&lt;br/&gt;
               :prod {:source-path &quot;src/cljs&quot; {:compiler {:output-to &quot;resources/public/js/main_dbg.js&quot;&lt;br/&gt;
                                                         :optimizations :advanced&lt;br/&gt;
                                                         :exclude-path &quot;some-path&quot;}}}})&lt;/p&gt;

&lt;p&gt;3. lein-cljsbuild plugin will instruct CLJ compiler by passing it the soruce-dir (e.g. &quot;src/cljs&quot;) and the options map which now can contain also an optional :exclude-path keyword.&lt;/p&gt;

&lt;p&gt;4. During compilation the compiler will exclude from source-dir any cljs source which is contained in the named excluded directory.&lt;/p&gt;

&lt;p&gt;I&apos;ll start bottom-up from 4. then I&apos;ll try to patch lein-cljsbuild too.&lt;/p&gt;

&lt;p&gt;Mimmo&lt;/p&gt;




</comment>
                    <comment id="30184" author="magomimmo" created="Fri, 7 Dec 2012 10:30:34 -0600"  >&lt;p&gt;Hi David, here is the flattened patch relative. The two guys which worked on the patch under my direction are interns in my own company. Next monday we&apos;ll send their signed CA.&lt;/p&gt;

&lt;p&gt;My best&lt;br/&gt;
Mimmo&lt;/p&gt;
</comment>
                    <comment id="30185" author="brentonashworth" created="Fri, 7 Dec 2012 11:13:50 -0600"  >&lt;p&gt;In general, we should not complicate the compiler with additional options when functionality can be provided by external tools.&lt;/p&gt;

&lt;p&gt;I think this feature can be provided by external tools. The compiler will only automatically pull in things that are actually dependencies of the sources that we provide to the compiler. External tools should provide ways to limit what is handed to the compiler.&lt;/p&gt;

&lt;p&gt;I would first attempt to modify lein-cljsbuild to do what you want.&lt;/p&gt;

&lt;p&gt;When using the compiler directly, you can provide your own implementation of Compilable which, when given a directory, will filter out sources based on some criteria you provide. In my projects I have custom implementations of Compilable that do just this. You should be able to do the same thing in lein-cljsbuild.&lt;/p&gt;

&lt;p&gt;-Brenton&lt;/p&gt;
</comment>
                    <comment id="30186" author="magomimmo" created="Fri, 7 Dec 2012 12:30:35 -0600"  >&lt;p&gt;Thanks for the advice Brenton. I&apos;ll try to understand from the maintainer of `lein-cljsbuild` where to start from. I agree with you about keeping the compiler clean from options that can be implemented by the tools. But I&apos;m no so sure that patching lein-cljsbuild we&apos;ll be as easy as adding `:exclude` option to the compiler. &lt;/p&gt;

&lt;p&gt;Mimmo&lt;/p&gt;</comment>
                    <comment id="30187" author="brentonashworth" created="Fri, 7 Dec 2012 13:04:14 -0600"  >&lt;p&gt;It doesn&apos;t matter which one is easier to do. Every new option and special case that we add to the compiler makes it more difficult to understand how changes will impact users.&lt;/p&gt;</comment>
                    <comment id="30188" author="dnolen" created="Fri, 7 Dec 2012 17:40:50 -0600"  >&lt;p&gt;I agree that anything that can be solved at higher level tools is better - it wasn&apos;t clear to me from the implementation that Compilable could be used to control this - but I see now.&lt;/p&gt;

&lt;p&gt;Mimmo, cljs.closure/build takes a Compilable and a map of options. So lein-cljsbuild could construct the custom Compilable that understands :excludes and pass it along.&lt;/p&gt;</comment>
                    <comment id="30198" author="emezeske" created="Sun, 9 Dec 2012 21:48:32 -0600"  >&lt;p&gt;FWIW, I agree with Brenton that this should be in lein-cljsbuild.&lt;/p&gt;

&lt;p&gt;I didn&apos;t know that cljs.closure/build was flexible enough to do this already.  I always thought that it needed to be extended so that a vector of files could be passed in, or something, but it sounds like the Compilable approach should work just fine.&lt;/p&gt;

&lt;p&gt;I will happily accept a patch for this.  One thing to keep in mind, though, is that the :exclude entry should not be in the :compiler map if lein-cljsbuild is handling it.  The :compiler map is passed straight through as options to cljs.closure/build.  So, the :exclude entry should be a neighbor of the :compiler entry.&lt;/p&gt;</comment>
                    <comment id="30201" author="magomimmo" created="Mon, 10 Dec 2012 04:20:15 -0600"  >&lt;p&gt;Hi all,&lt;br/&gt;
we all agree with Brenton and yes, the :exclude option has to be at the same hierarchical level of :source-path. I&apos;ll verify if we can also extend :source-path from taking a String to taking a vector of String, in such a way that the user could ask to compile more cljs src-dir.&lt;/p&gt;

&lt;p&gt;Mimmo&lt;/p&gt;
</comment>
                    <comment id="30202" author="magomimmo" created="Mon, 10 Dec 2012 04:37:30 -0600"  >&lt;p&gt;Hi all,&lt;br/&gt;
just a small add on to the previous comment. I don&apos;t think we&apos;re going to update cljsc/cljsc.clj, which I consider a kind of tool, much more fragile and limited than cljsbuild plugin, to interoperate with CLJS compiler. &lt;/p&gt;

&lt;p&gt;My best&lt;/p&gt;

&lt;p&gt;Mimmo&lt;/p&gt;</comment>
                    <comment id="30259" author="dnolen" created="Tue, 18 Dec 2012 15:09:20 -0600"  >&lt;p&gt;Should be resolved by tools that use the compiler.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11752" name="0001-CLJS-419-exclude-file-or-dir-from-compilation.patch" size="19588" author="magomimmo" created="Fri, 7 Dec 2012 10:30:34 -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-444] def issues in REPL</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-444</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;(def x) now fails in the REPL, this is very likely a result of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-397&quot; title=&quot;Omit var reads in statement context&quot;&gt;&lt;del&gt;CLJS-397&lt;/del&gt;&lt;/a&gt; and &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-403&quot; title=&quot;Printed JS code on REPL stack trace inconsistent with what got evaluated&quot;&gt;&lt;del&gt;CLJS-403&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15903">CLJS-444</key>
            <summary>def issues in 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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Tue, 18 Dec 2012 12:31:54 -0600</created>
                <updated>Tue, 18 Dec 2012 14:49:56 -0600</updated>
                    <resolved>Tue, 18 Dec 2012 14:49:56 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30254" author="dnolen" created="Tue, 18 Dec 2012 13:06:16 -0600"  >&lt;p&gt;This may be related to dead code elimination optimizations introduced in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-397&quot; title=&quot;Omit var reads in statement context&quot;&gt;&lt;del&gt;CLJS-397&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30256" author="dnolen" created="Tue, 18 Dec 2012 14:49:56 -0600"  >&lt;p&gt;&lt;a href=&quot;http://github.com/clojure/clojurescript/commit/ab868f2121b64e31c7206e3d17f209f63e8e6a51&quot;&gt;http://github.com/clojure/clojurescript/commit/ab868f2121b64e31c7206e3d17f209f63e8e6a51&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Issue was not related to other mentioned tickets. No code was emitted if init not provided was 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-445] declare stopped working in the REPL</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-445</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Typing a declare statement in the REPL gives an error&lt;/p&gt;</description>
                <environment></environment>
            <key id="15904">CLJS-445</key>
            <summary>declare stopped working in the 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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Tue, 18 Dec 2012 12:36:24 -0600</created>
                <updated>Tue, 18 Dec 2012 12:36:37 -0600</updated>
                    <resolved>Tue, 18 Dec 2012 12:36:37 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30253" author="dnolen" created="Tue, 18 Dec 2012 12:36:37 -0600"  >&lt;p&gt;duplicate&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-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-437] Missing &quot;Too few arguments to if&quot; check</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-437</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;(if) and (if 1) both return nil. JVM clojure throws &quot;Too few arguments to if&quot;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15874">CLJS-437</key>
            <summary>Missing &quot;Too few arguments to if&quot; check</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Thu, 6 Dec 2012 15:10:10 -0600</created>
                <updated>Fri, 7 Dec 2012 00:03:55 -0600</updated>
                    <resolved>Fri, 7 Dec 2012 00:03:55 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30182" author="dnolen" created="Fri, 7 Dec 2012 00:03:55 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/9abeb143f66ad6d92756c2dd702966f63ae76c27&quot;&gt;https://github.com/clojure/clojurescript/commit/9abeb143f66ad6d92756c2dd702966f63ae76c27&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11750" name="CLJS-437-v001.patch" size="759" author="bbloom" created="Thu, 6 Dec 2012 15:11: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-429] Data Conveying Exception: ex-data and ex-info</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-429</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;equivalent of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-733&quot;&gt;http://dev.clojure.org/jira/browse/CLJ-733&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;as per &lt;a href=&quot;https://groups.google.com/d/topic/clojure/vlTR_161WNc/discussion&quot;&gt;https://groups.google.com/d/topic/clojure/vlTR_161WNc/discussion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;see also:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/clojure/clojure/blob/d0c380d9809fd242bec688c7134e900f0bbedcac/src/clj/clojure/core.clj#L4227&quot;&gt;https://github.com/clojure/clojure/blob/d0c380d9809fd242bec688c7134e900f0bbedcac/src/clj/clojure/core.clj#L4227&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/display/design/Error+Handling&quot;&gt;http://dev.clojure.org/display/design/Error+Handling&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15859">CLJS-429</key>
            <summary>Data Conveying Exception: ex-data and ex-info</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="davesann">Dave Sann</reporter>
                        <labels>
                    </labels>
                <created>Mon, 26 Nov 2012 05:24:41 -0600</created>
                <updated>Thu, 6 Dec 2012 10:18:43 -0600</updated>
                    <resolved>Thu, 6 Dec 2012 10:18:43 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30174" author="michalmarczyk" created="Wed, 5 Dec 2012 17:47:56 -0600"  >&lt;p&gt;The attached patch introduces ex-info, ex-data and ExceptionInfo to cljs.core. ExceptionInfo has its prototype set to Error.prototype (apparently necessary for good behaviour across browsers; this is marked as a special case in a comment).&lt;/p&gt;

&lt;p&gt;The version of ex-info introduced by the patch does support a cause argument, but I have to say that it&apos;s not clear to me how user code should go about extracting it. Direct property access feels icky; a new fn would be possible, but should perhaps be shared with Clojure; Clojure code would say (.getCause ex), but hanging a method on ExceptionInfo somehow feels icky to me too. My first cut at the patch actually did not include the cause field in ExceptionInfo and the ternary variant of ex-info; that could actually be a reasonable approach for now, especially if introducing a new fn might be a possibility (since that would presumably require coordination with Clojure).&lt;/p&gt;</comment>
                    <comment id="30176" author="michalmarczyk" created="Thu, 6 Dec 2012 06:17:35 -0600"  >&lt;p&gt;An improved patch. Firstly, it correctly makes ExceptionInfo into a custom error type (the original patch was broken on this point). Secondly, it introduces ex-message and ex-cause for dealing with ExceptionInfo in a platform-agnostic manner (got the go-ahead from Rich @ ClojureX; I&apos;ll be submitting a patch for this to Clojure).&lt;/p&gt;</comment>
                    <comment id="30178" author="michalmarczyk" created="Thu, 6 Dec 2012 06:23:50 -0600"  >&lt;p&gt;Clojure patch @ &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1120&quot; title=&quot;Introduce ex-message and ex-cause to abstract away the platform in dealing with ExceptionInfo&quot;&gt;CLJ-1120&lt;/a&gt;.&lt;/p&gt;</comment>
                    <comment id="30180" author="dnolen" created="Thu, 6 Dec 2012 10:18:43 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/7ccb67e040d32b2c0112d2c73dd2e28d5e13c50a&quot;&gt;http://github.com/clojure/clojurescript/commit/7ccb67e040d32b2c0112d2c73dd2e28d5e13c50a&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11748" name="0001-CLJS-429-Data-Conveying-Exception-ex-data-and-ex-inf.patch" size="2812" author="michalmarczyk" created="Thu, 6 Dec 2012 06:17:35 -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-430] cljsc hangs for ~ 1 minute after code is generated</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-430</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Running the Clojurescript compiler via command line hangs for ~1 minute after the compile is done.  (By done I mean that complete code has been sent to stdout.)  &lt;/p&gt;

&lt;p&gt;I&apos;ve observed this for a number of different options so I don&apos;t think it&apos;s related to options: optimization simple/advanced, pretty-print on/off, output-as used/not used.&lt;/p&gt;

&lt;p&gt;I&apos;ve tried using bin/cljsc and doing the command manually, a la:&lt;/p&gt;

&lt;p&gt;$ cd bin&lt;br/&gt;
$ time java -cp &quot;./../lib/*:./../src/clj:./../src/cljs:./../test/cljs&quot; clojure.main &quot;cljsc.clj&quot; hello-world.cljs &apos;{:optimizations :simple}&apos;&lt;/p&gt;

&lt;p&gt;I&apos;ve only tested against one version of Clojurescript: today&apos;s master branch (0bfa1eac3599b55f3).&lt;/p&gt;
</description>
                <environment>Mac OS X 10.8.2</environment>
            <key id="15860">CLJS-430</key>
            <summary>cljsc hangs for ~ 1 minute after code is generated</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="sandover">Brandon Harvey</reporter>
                        <labels>
                    </labels>
                <created>Mon, 26 Nov 2012 13:45:19 -0600</created>
                <updated>Sun, 2 Dec 2012 11:25:12 -0600</updated>
                    <resolved>Sun, 2 Dec 2012 11:25:12 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30038" author="sandover" created="Mon, 26 Nov 2012 13:52:04 -0600"  >&lt;p&gt;Tried a slightly older commit, e83204a9ad4002b1e from Oct 20.  Saw issue there as well.&lt;/p&gt;</comment>
                    <comment id="30039" author="sandover" created="Mon, 26 Nov 2012 14:08:34 -0600"  >&lt;p&gt;Calling (build) in a REPL does not show the issue.  &lt;/p&gt;

&lt;p&gt;$ ./script/repl&lt;br/&gt;
Clojure 1.4.0&lt;br/&gt;
user=&amp;gt; (require &apos;&lt;span class=&quot;error&quot;&gt;&amp;#91;cljs.closure :as cljsc&amp;#93;&lt;/span&gt;)&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; (time (cljsc/build &quot;&lt;span class=&quot;error&quot;&gt;&amp;#91;path...&amp;#93;&lt;/span&gt;/hello-clojurescript.cljs&quot; {:optimizations :simple :output-to &quot;hello.js&quot;}))&lt;br/&gt;
&quot;Elapsed time: &lt;span class=&quot;error&quot;&gt;&amp;#91;3000-17000&amp;#93;&lt;/span&gt; msecs&quot;&lt;/p&gt;
</comment>
                    <comment id="30042" author="dnolen" created="Mon, 26 Nov 2012 15:02:54 -0600"  >&lt;p&gt;Thanks for the details, will look into it.&lt;/p&gt;</comment>
                    <comment id="30126" author="dnolen" created="Fri, 30 Nov 2012 16:28:18 -0600"  >&lt;p&gt;It looks like the problem occurs when passing in any optimization level besides :none to cljsc.&lt;/p&gt;</comment>
                    <comment id="30127" author="dnolen" created="Fri, 30 Nov 2012 18:45:10 -0600"  >&lt;p&gt;As far as I can tell this issue has affected ClojureScript for quite some time and has gone unnoticed because most users rely on lein-cljsbuild or they call into the compiler directly. And by quite some time I believe this may actually have something to do w/ the environment (JDK version, OS, etc). So lowering the priority on this.&lt;/p&gt;

&lt;p&gt;Brandon, can you give more details on your Java environment?&lt;/p&gt;</comment>
                    <comment id="30129" author="sandover" created="Sat, 1 Dec 2012 15:28:49 -0600"  >&lt;p&gt;$ java -version&lt;br/&gt;
java version &quot;1.6.0_37&quot;&lt;br/&gt;
Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)&lt;br/&gt;
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)&lt;/p&gt;

&lt;p&gt;Does that help?&lt;/p&gt;</comment>
                    <comment id="30135" author="bendlas" created="Sun, 2 Dec 2012 04:13:34 -0600"  >&lt;p&gt;Please have a look at &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-415&quot; title=&quot;Speed up cljsc by exiting when work is done.&quot;&gt;&lt;del&gt;CLJS-415&lt;/del&gt;&lt;/a&gt;&lt;br/&gt;
A patch for this issue is provided there.&lt;/p&gt;</comment>
                    <comment id="30139" author="dnolen" created="Sun, 2 Dec 2012 11:25:12 -0600"  >&lt;p&gt;duplicate &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-415&quot; title=&quot;Speed up cljsc by exiting when work is done.&quot;&gt;&lt;del&gt;CLJS-415&lt;/del&gt;&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-415] Speed up cljsc by exiting when work is done.</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-415</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When following cljsc output with &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;tail -f test.js&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;you can see that even after the ouput is printed, the compiler waits a long time before exiting.&lt;br/&gt;
Attached patch flushes &lt;b&gt;out&lt;/b&gt;, shuts down agents and exits at the end of the compilation thread. This reduces the apparent compilation time of test/ from 1m 13s to 13s on my machine.  &lt;/p&gt;</description>
                <environment></environment>
            <key id="15811">CLJS-415</key>
            <summary>Speed up cljsc by exiting when work is done.</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                    </labels>
                <created>Fri, 2 Nov 2012 21:46:31 -0500</created>
                <updated>Sun, 2 Dec 2012 11:24:54 -0600</updated>
                    <resolved>Sun, 2 Dec 2012 11:24:54 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30138" author="dnolen" created="Sun, 2 Dec 2012 11:24:54 -0600"  >&lt;p&gt;fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3842d3f9e0d68853077117a9192222e93e169079&quot;&gt;http://github.com/clojure/clojurescript/commit/3842d3f9e0d68853077117a9192222e93e169079&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11658" name="0001-CLJS-415-Speed-up-cljsc-by-exiting-after-output-has-.patch" size="754" author="bendlas" created="Fri, 2 Nov 2012 21:47:25 -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-431] namespace and name fail on &apos;/</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-431</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Both the &apos;namespace and the &apos;name functions use .lastIndexOf to search for &quot;/&quot;. This fails on the division symbol if you don&apos;t provide a starting index to search from.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15861">CLJS-431</key>
            <summary>namespace and name fail on &apos;/</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Tue, 27 Nov 2012 04:17:27 -0600</created>
                <updated>Fri, 30 Nov 2012 11:56:54 -0600</updated>
                    <resolved>Fri, 30 Nov 2012 11:56:54 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30111" author="dnolen" created="Fri, 30 Nov 2012 11:56:54 -0600"  >&lt;p&gt;fixed in commit 5ac15039c685af19810dc5b35f06a496be1f3369&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11713" name="CLJS-431-v001.patch" size="1800" author="bbloom" created="Tue, 27 Nov 2012 04:18:37 -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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-432] Include line and file information in error messages</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-432</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Just as the ana/warning function did, now errors and assertions include line and file source information. I needed this sorely.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15862">CLJS-432</key>
            <summary>Include line and file information in error messages</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Wed, 28 Nov 2012 17:47:55 -0600</created>
                <updated>Fri, 30 Nov 2012 11:25:39 -0600</updated>
                    <resolved>Fri, 30 Nov 2012 11:25:39 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30081" author="bbloom" created="Wed, 28 Nov 2012 18:13:04 -0600"  >&lt;p&gt;Added v2 of patch that will handle any exception during parsing. Similar could be done during code generation. This approach seems much more robust and less invasive.&lt;/p&gt;</comment>
                    <comment id="30082" author="bbloom" created="Wed, 28 Nov 2012 23:15:18 -0600"  >&lt;p&gt;That v2 was made hastily. Upon further thought, it seems broken in the face of recursive analysis. I think the right thing, if we prefer the exception catching approach, is to rethrow as a custom exception type, which would be allowed through un-re-wrapped.&lt;/p&gt;

&lt;p&gt;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;(&lt;span class=&quot;code-keyword&quot;&gt;try&lt;/span&gt;
  (parse-form ...)
  (&lt;span class=&quot;code-keyword&quot;&gt;catch&lt;/span&gt; AnalysisError e
    &lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; e)
  (&lt;span class=&quot;code-keyword&quot;&gt;catch&lt;/span&gt; Throwable e
    (&lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; (AnalysisError. env e))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="30089" author="dnolen" created="Thu, 29 Nov 2012 11:32:25 -0600"  >&lt;p&gt;I don&apos;t have a problem with the approach in the first patch. I don&apos;t really see how a less invasive patch is even possible - you still need to pass the environment to some assertion check if you are going to throw a custom exception as well.&lt;/p&gt;</comment>
                    <comment id="30092" author="bbloom" created="Thu, 29 Nov 2012 14:28:12 -0600"  >&lt;p&gt;v3 of patch fixes issue with v2&lt;/p&gt;</comment>
                    <comment id="30093" author="bbloom" created="Thu, 29 Nov 2012 14:50:44 -0600"  >&lt;p&gt;v4 of patch as discussed in irc&lt;/p&gt;</comment>
                    <comment id="30096" author="bbloom" created="Thu, 29 Nov 2012 14:57:54 -0600"  >&lt;p&gt;v5 also catches error from parse-invoke&lt;/p&gt;</comment>
                    <comment id="30102" author="bbloom" created="Thu, 29 Nov 2012 17:05:46 -0600"  >&lt;p&gt;v6 improves errors in repl as discussed in IRC&lt;/p&gt;</comment>
                    <comment id="30109" author="dnolen" created="Fri, 30 Nov 2012 11:25:39 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/af4ab91754d30f082b117b40c07ea94d0063c0d6&quot;&gt;http://github.com/clojure/clojurescript/commit/af4ab91754d30f082b117b40c07ea94d0063c0d6&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11721" name="CLJS-432-v001.patch" size="14888" author="bbloom" created="Wed, 28 Nov 2012 17:48:43 -0600" />
                    <attachment id="11722" name="CLJS-432-v002.patch" size="6487" author="bbloom" created="Wed, 28 Nov 2012 18:13:04 -0600" />
                    <attachment id="11727" name="CLJS-432-v003.patch" size="6637" author="bbloom" created="Thu, 29 Nov 2012 14:28:12 -0600" />
                    <attachment id="11728" name="CLJS-432-v004.patch" size="2228" author="bbloom" created="Thu, 29 Nov 2012 14:50:44 -0600" />
                    <attachment id="11730" name="CLJS-432-v005.patch" size="2380" author="bbloom" created="Thu, 29 Nov 2012 14:57:54 -0600" />
                    <attachment id="11732" name="CLJS-432-v006.patch" size="3934" author="bbloom" created="Thu, 29 Nov 2012 17:05:46 -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-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-245] Property and method access on js/window</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-245</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I noticed the following behaviour:&lt;/p&gt;

&lt;p&gt;(.encodeURIComponent js/window &quot;some text&quot;)&lt;/p&gt;

&lt;p&gt;will fail under advanced compilation because the method name is optimised&lt;br/&gt;
This applies to any property or method of js/window. &lt;br/&gt;
The same does not appear to be true of js/document.&lt;/p&gt;

&lt;p&gt;workaround as follows:&lt;/p&gt;

&lt;p&gt;(def encode (aget js/window &quot;encodeURIComponent&quot;))&lt;br/&gt;
(encode &quot;some txt&quot;)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15420">CLJS-245</key>
            <summary>Property and method access on js/window</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="davesann">Dave Sann</reporter>
                        <labels>
                    </labels>
                <created>Tue, 8 May 2012 17:17:23 -0500</created>
                <updated>Wed, 28 Nov 2012 12:06:59 -0600</updated>
                    <resolved>Wed, 28 Nov 2012 12:06:59 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29327" author="dnolen" created="Fri, 31 Aug 2012 09:33:02 -0500"  >&lt;p&gt;Is this still a problem?&lt;/p&gt;</comment>
                    <comment id="30037" author="wagjo" created="Mon, 26 Nov 2012 13:37:21 -0600"  >&lt;p&gt;This is not a bug. You should use &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;(js/encodeURIComponent s)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;By standard, encodeURIComponent is a global object, not property of a window object. If you use such nonstandard call instead, google closure compiler will in advanced mode mangle its name, because it won&apos;t find it in default externs.&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;http://code.google.com/p/closure-compiler/source/browse/trunk/externs&quot;&gt;default google closure externs&lt;/a&gt;, (see &lt;a href=&quot;http://code.google.com/p/closure-compiler/source/browse/trunk/externs/es3.js#110&quot;&gt;es3&lt;/a&gt; for encodeURIComponent)&lt;/p&gt;

&lt;p&gt;For nonstandard objects and those defined outside your clojurescript program, you should use &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;:externs [&lt;span class=&quot;code-quote&quot;&gt;&quot;src/externs.js&quot;&lt;/span&gt;]&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; option when building.&lt;/p&gt;

&lt;p&gt;Add you names into src/externs.js and you should be fine, e.g.:&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;window.prototype.encodeURIComponent = function() {};&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="30043" author="davesann" created="Mon, 26 Nov 2012 17:08:16 -0600"  >&lt;p&gt;In chrome it seems to be both.&lt;/p&gt;

&lt;p&gt;However, your point is valid.&lt;/p&gt;

&lt;p&gt;I also use&lt;/p&gt;

&lt;p&gt;window.x = function(){};&lt;/p&gt;

&lt;p&gt;in externs. Which also seems to work.&lt;/p&gt;</comment>
                    <comment id="30075" author="dnolen" created="Wed, 28 Nov 2012 12:06:59 -0600"  >&lt;p&gt;Not a bug.&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-426] subvec function not behaving consitently with invalid subranges</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-426</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When using the subvec function with a as a parameter vector and a range that is not in the original vector, the function returns a value: &lt;/p&gt;

&lt;p&gt;(subvec &lt;span class=&quot;error&quot;&gt;&amp;#91;1 2 3&amp;#93;&lt;/span&gt; 0 4) =&amp;gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;1 2 3 nil&amp;#93;&lt;/span&gt; &lt;/p&gt;

&lt;p&gt;However, when using with seqs, it works as it supposed to: &lt;/p&gt;

&lt;p&gt;(subvec (range 3) 0 4) =&amp;gt; ERROR: Index out of bounds &lt;/p&gt;

&lt;p&gt;This is because the validation of ranges is not happening at build time of the subvec type, this bug contains a patch that adds a new private `build-subvec` function into cljs.core. &lt;/p&gt;</description>
                <environment>Ubuntu precise 64 bits, Mac OS X Lion</environment>
            <key id="15846">CLJS-426</key>
            <summary>subvec function not behaving consitently with invalid subranges</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="roman">Roman Gonzalez</reporter>
                        <labels>
                        <label>bug</label>
                        <label>patch</label>
                    </labels>
                <created>Thu, 22 Nov 2012 17:00:13 -0600</created>
                <updated>Fri, 23 Nov 2012 15:25:10 -0600</updated>
                    <resolved>Fri, 23 Nov 2012 15:25:10 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30007" author="roman" created="Thu, 22 Nov 2012 17:05:56 -0600"  >&lt;p&gt;Patch for bug&lt;/p&gt;</comment>
                    <comment id="30017" author="dnolen" created="Fri, 23 Nov 2012 14:51:38 -0600"  >&lt;p&gt;This mostly looks good but there is a typo in the patch:&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;(build-subvec. meta (-assoc v v-pos val) ...&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="30018" author="roman" created="Fri, 23 Nov 2012 15:09:20 -0600"  >&lt;p&gt;Revised patch, removing small typo&lt;/p&gt;</comment>
                    <comment id="30019" author="roman" created="Fri, 23 Nov 2012 15:18:16 -0600"  >&lt;p&gt;Removing useless ^:mutable meta on function parameter&lt;/p&gt;</comment>
                    <comment id="30020" author="dnolen" created="Fri, 23 Nov 2012 15:25:10 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/ee25599abb214074cbeefe37b399038d70c6ab89&quot;&gt;http://github.com/clojure/clojurescript/commit/ee25599abb214074cbeefe37b399038d70c6ab89&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11698" name="cljs_subvec.patch" size="3840" author="roman" created="Thu, 22 Nov 2012 17:05:56 -0600" />
                    <attachment id="11705" name="cljs_subvec_revised1.patch" size="3829" author="roman" created="Fri, 23 Nov 2012 15:18:16 -0600" />
                    <attachment id="11704" name="cljs_subvec_revised.patch" size="3839" author="roman" created="Fri, 23 Nov 2012 15:09:20 -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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-359] `with-meta` does not work on function objects</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-359</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;`with-meta` does not working on function objects in CLJS. Compilation fails with the following error:&lt;/p&gt;

&lt;p&gt;Error: No protocol method IWithMeta.-with-meta defined for type function: function &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/error.gif&quot; height=&quot;16&quot; width=&quot;16&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt; {
      return x;
    }&lt;/p&gt;

&lt;p&gt;I tried it out on the REPL and found the following:&lt;/p&gt;

&lt;p&gt;---------- BEGIN: repl-rhino ----------&lt;br/&gt;
ClojureScript:cljs.user&amp;gt; (with-meta #(do :foo) {:foo :bar})&lt;br/&gt;
&quot;Error evaluating:&quot; (with-meta (fn* [] (do :foo)) {:foo :bar}) :as &quot;cljs.core.with_meta.call(null,(function (){\nreturn \&quot;\\uFDD0&apos;foo\&quot;;\n}),cljs.core.ObjMap.fromObject(&lt;span class=&quot;error&quot;&gt;&amp;#91;\&amp;quot;\\uFDD0&amp;#39;foo\&amp;quot;&amp;#93;&lt;/span&gt;,{\&quot;\\uFDD0&apos;foo\&quot;:\&quot;\\uFDD0&apos;bar\&quot;}));\n&quot;&lt;br/&gt;
org.mozilla.javascript.JavaScriptException: Error: No protocol method IWithMeta.-with-meta defined for type function: &lt;br/&gt;
function () {
    return &quot;\ufdd0&apos;foo&quot;;
}&lt;br/&gt;
 (cljs/core.cljs#222)&lt;br/&gt;
	at cljs/core.cljs:222 (anonymous)&lt;br/&gt;
	at cljs/core.cljs:214 (_with_meta)&lt;br/&gt;
	at cljs/core.cljs:806 (with_meta)&lt;br/&gt;
	at &amp;lt;cljs repl&amp;gt;:2 (anonymous)&lt;br/&gt;
	at &amp;lt;cljs repl&amp;gt;:2&lt;/p&gt;

&lt;p&gt;nil&lt;br/&gt;
---------- END: repl-rhino ----------&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href=&quot;https://groups.google.com/forum/?fromgroups=#!topic/clojure/pRO-5IlilNM&quot;&gt;https://groups.google.com/forum/?fromgroups=#!topic/clojure/pRO-5IlilNM&lt;/a&gt;&lt;/p&gt;</description>
                <environment>CLJS Rhino-REPL and during Compilation</environment>
            <key id="15644">CLJS-359</key>
            <summary>`with-meta` does not work on function objects</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="kumarshantanu">Shantanu Kumar</reporter>
                        <labels>
                        <label>bug</label>
                    </labels>
                <created>Sat, 25 Aug 2012 16:39:55 -0500</created>
                <updated>Wed, 21 Nov 2012 16:21:13 -0600</updated>
                    <resolved>Wed, 21 Nov 2012 16:21:13 -0600</resolved>
                                                                    <due></due>
                    <votes>1</votes>
                        <watches>4</watches>
                        <comments>
                    <comment id="29285" author="dnolen" created="Wed, 29 Aug 2012 09:52:35 -0500"  >&lt;p&gt;We could create a fn wrapper type of some kind that implements all the supported arities of IFn (this means the compiler needs to guarantee that args past 20 are collected into an array-seq) that include the extra meta fields. Seems doable.&lt;/p&gt;</comment>
                    <comment id="29554" author="ohpauleez" created="Fri, 28 Sep 2012 15:21:14 -0500"  >&lt;p&gt;I have created that exact function wrapper - it&apos;s in Shoreleave.  We can move it into CLJS proper if you like.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/shoreleave/shoreleave-core/blob/master/src/shoreleave/efunction.cljs&quot;&gt;https://github.com/shoreleave/shoreleave-core/blob/master/src/shoreleave/efunction.cljs&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29555" author="dnolen" created="Fri, 28 Sep 2012 15:24:55 -0500"  >&lt;p&gt;That&apos;s nice but would prefer to have as little overhead as possible.&lt;/p&gt;</comment>
                    <comment id="29556" author="ohpauleez" created="Fri, 28 Sep 2012 15:27:30 -0500"  >&lt;p&gt;ala unrolling the invoke call?&lt;/p&gt;

&lt;p&gt;More than happy to start pulling together a patch.&lt;/p&gt;</comment>
                    <comment id="29557" author="dnolen" created="Fri, 28 Sep 2012 15:34:33 -0500"  >&lt;p&gt;Yes there&apos;s actually an existing ticket for that. Thanks. We also need compiler support for function invocations when there&apos;s more then 20 arguments - though that&apos;s a different existing ticket.&lt;/p&gt;</comment>
                    <comment id="29749" author="ohpauleez" created="Mon, 22 Oct 2012 07:50:55 -0500"  >&lt;p&gt;I was just waiting on &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-365&quot; title=&quot;apply needs to put all args after the 20th into an array seq&quot;&gt;CLJS-365&lt;/a&gt; to be completed.  Did you think of a better approach than the deftype-wrapper?  More than happy to push on this.&lt;/p&gt;</comment>
                    <comment id="29780" author="dnolen" created="Tue, 23 Oct 2012 18:36:25 -0500"  >&lt;p&gt;I thought about this some more - this patch is really about adding metadata to functions at runtime - static metadata on defs are stored in cljs.analyzer/namespaces. Given that it&apos;s runtime I think your simple patch is actually OK, we can&apos;t generally optimize functions like that anyway since we won&apos;t have that kind of information available.&lt;/p&gt;</comment>
                    <comment id="30003" author="bbloom" created="Wed, 21 Nov 2012 15:29:45 -0600"  >&lt;p&gt;Patch adds a Function type and extends js/function to support metadata. There is now an Fn marker protocol.&lt;/p&gt;

&lt;p&gt;Patch also includes an additional commit to fix the behavior of the this variable for IFn definitions.&lt;/p&gt;

&lt;p&gt;Not tested on JavaScriptCore.&lt;/p&gt;</comment>
                    <comment id="30004" author="bbloom" created="Wed, 21 Nov 2012 16:16:33 -0600"  >&lt;p&gt;v2 of patch improves speed of fn? and utilizes reify to avoid creating an explicit Function type&lt;/p&gt;</comment>
                    <comment id="30005" author="dnolen" created="Wed, 21 Nov 2012 16:21:13 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/6ce3b1cef3824fd36e75402f5a8ed5053252b15e&quot;&gt;http://github.com/clojure/clojurescript/commit/6ce3b1cef3824fd36e75402f5a8ed5053252b15e&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11695" name="CLJS-359-v1.patch" size="3984" author="bbloom" created="Wed, 21 Nov 2012 15:29:45 -0600" />
                    <attachment id="11696" name="CLJS-359-v2.patch" size="3908" author="bbloom" created="Wed, 21 Nov 2012 16:16:33 -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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-406] reduce-kv doesn&apos;t work for all data structures</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-406</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Right now reduce-kv is not implemented for ObjMap and broken for ArrayMap.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15773">CLJS-406</key>
            <summary>reduce-kv doesn&apos;t work for all data structures</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                    </labels>
                <created>Wed, 24 Oct 2012 02:45:38 -0500</created>
                <updated>Wed, 21 Nov 2012 10:37:41 -0600</updated>
                    <resolved>Wed, 21 Nov 2012 10:37:41 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29785" author="bendlas" created="Wed, 24 Oct 2012 02:48:52 -0500"  >&lt;p&gt;Patch contains fixes and tests&lt;/p&gt;</comment>
                    <comment id="29787" author="bendlas" created="Wed, 24 Oct 2012 03:33:01 -0500"  >&lt;p&gt;Please note, that this patch was based on my local version for &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-401&quot; title=&quot;top level let emits vars without namespace&quot;&gt;&lt;del&gt;CLJS-401&lt;/del&gt;&lt;/a&gt;&lt;br/&gt;
I hope this won&apos;t produce any merge errors in the test code, since the two test cases are next to each other. I&apos;ll produce a new patch, if nessecary.&lt;/p&gt;</comment>
                    <comment id="29823" author="dnolen" created="Fri, 26 Oct 2012 19:33:38 -0500"  >&lt;p&gt;Patch no longer applies can you make a new one? Thanks!&lt;/p&gt;</comment>
                    <comment id="29843" author="bendlas" created="Sun, 28 Oct 2012 18:13:32 -0500"  >&lt;p&gt;Patch 0002 replaces 0001&lt;br/&gt;
np&lt;/p&gt;</comment>
                    <comment id="29996" author="dnolen" created="Wed, 21 Nov 2012 09:13:28 -0600"  >&lt;p&gt;Looks like the second patch doesn&apos;t apply either.&lt;/p&gt;</comment>
                    <comment id="29998" author="bendlas" created="Wed, 21 Nov 2012 09:52:36 -0600"  >&lt;p&gt;Patch 0003 applies to current master&lt;/p&gt;</comment>
                    <comment id="30000" author="dnolen" created="Wed, 21 Nov 2012 10:37:41 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/bac7bdb65f255baca167ac10479e279397a979cb&quot;&gt;http://github.com/clojure/clojurescript/commit/bac7bdb65f255baca167ac10479e279397a979cb&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11607" name="0001-CLJS-406-Implement-IKVReduce-of-ObjMap-fix-for-Persi.patch" size="2272" author="bendlas" created="Wed, 24 Oct 2012 02:48:52 -0500" />
                    <attachment id="11629" name="0002-CLJS-406-IKVReduce-Implementation-for-ObjMap-Fix-for.patch" size="2287" author="bendlas" created="Sun, 28 Oct 2012 18:13:32 -0500" />
                    <attachment id="11694" name="0003-CLJS-406-IKVReduce-Implementation-for-ObjMap-Fix-for.patch" size="2321" author="bendlas" created="Wed, 21 Nov 2012 09:52:36 -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-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-417] cljs.core/mod incorrect for negative numbers</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-417</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;JavaScript&apos;s % (modulo) operator gives incorrect answers for negative numbers, e.g.&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;-2 % 5 =&amp;gt; -2&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;which carries over to cljs.core/mod&lt;/p&gt;

&lt;p&gt;This blog: &lt;a href=&quot;http://javascript.about.com/od/problemsolving/a/modulobug.htm&quot;&gt;http://javascript.about.com/od/problemsolving/a/modulobug.htm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;suggests defining modulo as:&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-object&quot;&gt;Number&lt;/span&gt;.prototype.mod = function(n) {
  &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; ((&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;%n)+n)%n;
}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;ClojureScript&apos;s mod should use this workaround&lt;/p&gt;</description>
                <environment></environment>
            <key id="15822">CLJS-417</key>
            <summary>cljs.core/mod incorrect for negative numbers</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                    </labels>
                <created>Mon, 12 Nov 2012 04:08:20 -0600</created>
                <updated>Wed, 21 Nov 2012 09:11:54 -0600</updated>
                    <resolved>Wed, 21 Nov 2012 09:11:54 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29931" author="bendlas" created="Mon, 12 Nov 2012 04:41:52 -0600"  >&lt;p&gt;Attached patch renames cljs.core/mod to cljs.core/js-mod, along with occurrences in cljs.core.&lt;/p&gt;

&lt;p&gt;cljs.core/mod is redefined with fix for negative numbers.&lt;/p&gt;</comment>
                    <comment id="29995" author="dnolen" created="Wed, 21 Nov 2012 09:11:54 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/14bd16ef5894458a3709ebfee3e78a876938bfa6&quot;&gt;http://github.com/clojure/clojurescript/commit/14bd16ef5894458a3709ebfee3e78a876938bfa6&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11671" name="0001-CLJS-417-Fix-cljs.core-mod-for-negative-numbers.-Ori.patch" size="2612" author="bendlas" created="Mon, 12 Nov 2012 04:41: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-423] ClojureScript REPL should take analyze-path as an option</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-423</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This way the REPL can be started with warnings enabled. This is for REPLs where evaluation environment is persistent and remote (Browser, Node.js, etc)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15834">CLJS-423</key>
            <summary>ClojureScript REPL should take analyze-path as an option</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 18 Nov 2012 17:02:09 -0600</created>
                <updated>Wed, 21 Nov 2012 09:07:39 -0600</updated>
                    <resolved>Wed, 21 Nov 2012 09:07:39 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29994" author="dnolen" created="Wed, 21 Nov 2012 09:07:39 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/51ed707ca6956b7442427a26fcc3955f98615791&quot;&gt;http://github.com/clojure/clojurescript/commit/51ed707ca6956b7442427a26fcc3955f98615791&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-422] circular dependencies triggers infinite loop</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-422</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I believe this is because analysis follows dependencies naively.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15833">CLJS-422</key>
            <summary>circular dependencies triggers infinite loop</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 18 Nov 2012 17:00:30 -0600</created>
                <updated>Wed, 21 Nov 2012 09:05:43 -0600</updated>
                    <resolved>Wed, 21 Nov 2012 09:05:43 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29993" author="dnolen" created="Wed, 21 Nov 2012 09:05:43 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/698123fb25abf9c55ebf1c9bfddc87580a46ecb9&quot;&gt;http://github.com/clojure/clojurescript/commit/698123fb25abf9c55ebf1c9bfddc87580a46ecb9&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-421] add clj-&gt;js</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-421</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;For complex keys in maps pr-str should be sufficient and sets could just become JS arrays.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15831">CLJS-421</key>
            <summary>add clj-&gt;js</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 18 Nov 2012 15:29:54 -0600</created>
                <updated>Tue, 20 Nov 2012 08:26:05 -0600</updated>
                    <resolved>Mon, 19 Nov 2012 12:10:20 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29967" author="mpenet" created="Sun, 18 Nov 2012 19:30:20 -0600"  >&lt;p&gt;Here is a first version.&lt;br/&gt;
The tests could be improved, let met know if that is necessary (almost 3am for me, I could work on that tomorrow evening). &lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/mpenet/clojurescript/commit/d10b08fa147374118e98e98fdffd9c61f95f9747.patch&quot;&gt;https://github.com/mpenet/clojurescript/commit/d10b08fa147374118e98e98fdffd9c61f95f9747.patch&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;It would also be helpful if someone could run the tests against JSCore for me. Thanks!&lt;/p&gt;

&lt;p&gt;edit: I changed the patch to do whitelisting instead of blacklisting of types in &lt;del&gt;key&lt;/del&gt;&amp;gt;js, it should be safer and provide sane default for unknown js objects.&lt;/p&gt;</comment>
                    <comment id="29969" author="dnolen" created="Sun, 18 Nov 2012 19:44:33 -0600"  >&lt;p&gt;Thanks much. I will check it out tomorrow morning.&lt;/p&gt;</comment>
                    <comment id="29972" author="dnolen" created="Mon, 19 Nov 2012 09:46:22 -0600"  >&lt;p&gt;This patch looks good, can we get a proper patch attached to this ticket? Thanks!&lt;/p&gt;</comment>
                    <comment id="29973" author="bronsa" created="Mon, 19 Nov 2012 10:31:14 -0600"  >&lt;p&gt;what&apos;s the point of doing eg&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;(extend-protocol proto
  default
  (proto-fn [x]
    (cond x
      (string? x) do-a
      (vector? x) do-b
      :else do-c)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;rather than using extend-protocol on the specific types&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;(extend-protocol proto
  string
  (proto-fn [x] do-a)
  IPersistentVector
  (proto-fn [x] do-b)
  default
  (proto-fn [x] do-c)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29974" author="dnolen" created="Mon, 19 Nov 2012 11:11:43 -0600"  >&lt;p&gt;The second approach will require considerably more code as extend-type to IPersistentVector doesn&apos;t work in ClojureScript, you have to enumerate all IPersistentVector types. Also enumerating all those types explicitly closes the door for people to override the default behavior if that&apos;s desired. I think the patch is sufficient to cover common usage - I&apos;m inclined to let more sophisticated solutions get sorted out in a contrib if people don&apos;t find this implementation sufficiently customizable.&lt;/p&gt;</comment>
                    <comment id="29976" author="mpenet" created="Mon, 19 Nov 2012 12:03:02 -0600"  >&lt;p&gt;I just added the patch file. &lt;/p&gt;</comment>
                    <comment id="29977" author="dnolen" created="Mon, 19 Nov 2012 12:10:20 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/cd66e6b9e63ad5ef1896a9c7a117148beb04301d&quot;&gt;http://github.com/clojure/clojurescript/commit/cd66e6b9e63ad5ef1896a9c7a117148beb04301d&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29978" author="wilkes" created="Mon, 19 Nov 2012 12:43:03 -0600"  >&lt;p&gt;Do we want symbols and keywords to drop their unicode prefixes?&lt;/p&gt;</comment>
                    <comment id="29979" author="dnolen" created="Mon, 19 Nov 2012 12:51:52 -0600"  >&lt;p&gt;I don&apos;t see why they should retain them, I&apos;m leaning towards Keyword &amp;amp; Symbols being proper datatypes - necessary for bootstrapping CLJS.&lt;/p&gt;</comment>
                    <comment id="29983" author="wilkes" created="Tue, 20 Nov 2012 08:16:12 -0600"  >&lt;p&gt;It triggered my information loss button.  Since keywords and symbols are compiled to special strings, would retaining the indicators allow for easier mapping back from a js library into our cljs code?&lt;/p&gt;</comment>
                    <comment id="29984" author="mpenet" created="Tue, 20 Nov 2012 08:26:05 -0600"  >&lt;p&gt;Wilkes, I am not sure it would be a good idea, JSON libraries (cheshire, data.json etc) are a good example of this, you just fallback to the closest format that makes sense with the host/format.  Nothing prevents your to create new Types and extend these protocols if you want to retain more information though.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11687" name="feature-codecs-CLJS-421.txt" size="4816" author="mpenet" created="Mon, 19 Nov 2012 12:02:08 -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-282] When compiling incrementally, goog dependencies can get out of order (breaks builds)</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-282</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;In lein-cljsbuild version 0.2.0, I changed it to allow incremental compilation again.  Previous versions would always clean out the :output-dir before each call to closure/build, because I had seen weird issues before but never tracked them down.&lt;/p&gt;

&lt;p&gt;Finally, I have pinpointed the problem with incremental compilation (although not the solution).  The problem is that sometimes, when the compiler notices that a ClojureScript file has already been compiled to JavaScript, its JavaScript output will be inserted into the :whitespace (or higher) optimized output in the wrong order.  By &quot;wrong order&quot;, I mean its goog.provide() comes &lt;b&gt;after&lt;/b&gt; a goog.require() for that same namespace.&lt;/p&gt;

&lt;p&gt;I&apos;ve attached a snippet from my :whitespace compiled output for a closed source project.  I removed a bunch of code from the attachment, but I did &lt;b&gt;not&lt;/b&gt; change the order of anything.  As you can see, ss_charts.crossover.url is provided after it is required.&lt;/p&gt;

&lt;p&gt;My guess is that the problem originates in compiler/compile-file.  It calls requires-compilation?, and returns a hash containing only {:file ...} if it does not require compilation.  I assume that the problem has to do with the fact that this hash lacks the :provides and :requires keys, and thus down the road doesn&apos;t get considered in the dependency graph correctly.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15488">CLJS-282</key>
            <summary>When compiling incrementally, goog dependencies can get out of order (breaks builds)</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="emezeske">Evan Mezeske</reporter>
                        <labels>
                        <label>bug,</label>
                        <label>namespace</label>
                    </labels>
                <created>Tue, 29 May 2012 00:00:53 -0500</created>
                <updated>Mon, 19 Nov 2012 13:37:01 -0600</updated>
                    <resolved>Mon, 19 Nov 2012 13:37:01 -0600</resolved>
                                                                    <due></due>
                    <votes>4</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="28639" author="dnolen" created="Tue, 29 May 2012 11:50:25 -0500"  >&lt;p&gt;Seems like a reasonable guess. Patch welcome.&lt;/p&gt;</comment>
                    <comment id="29903" author="arlen" created="Mon, 5 Nov 2012 23:29:49 -0600"  >&lt;p&gt;There&apos;s a minimalish reproducible example of this here: &lt;a href=&quot;https://github.com/unnali/cljs-sscce&quot;&gt;https://github.com/unnali/cljs-sscce&lt;/a&gt;.&lt;/p&gt;</comment>
                    <comment id="29965" author="dnolen" created="Sun, 18 Nov 2012 18:41:17 -0600"  >&lt;p&gt;I&apos;m unable to recreate the issue myself when using the example project. I&apos;ve created a patch that may fix the issue for others. Can someone please confirm? You can test the patch by making a checkouts directory, clone ClojureScript into it, apply the patch there and then add the following to your project.clj:&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;:extra-classpath-dirs [&lt;span class=&quot;code-quote&quot;&gt;&quot;checkouts/clojurescript/src/clj&quot;&lt;/span&gt;
                       &lt;span class=&quot;code-quote&quot;&gt;&quot;checkouts/clojurescript/src/cljs&quot;&lt;/span&gt;]&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29966" author="arlen" created="Sun, 18 Nov 2012 19:14:45 -0600"  >&lt;p&gt;Unfortunately, this didn&apos;t fix the issue for me. I&apos;ve just realised the cljs-sscce as linked had &quot;:incremental false&quot; set in project.clj, which stops the issue from being reproduced. If you didn&apos;t notice that (I didn&apos;t until I came to try and found it &quot;working&quot; pre-patch!), it might be worth trying again with that.&lt;/p&gt;

&lt;p&gt;If you still can&apos;t reproduce it, let me know&#8212;I can try preparing a VM image or similar?&lt;/p&gt;</comment>
                    <comment id="29968" author="dnolen" created="Sun, 18 Nov 2012 19:36:40 -0600"  >&lt;p&gt;OK, I was able to reproduce the original issue. I can also confirm that the issue is fixed for me per the instructions on the cljs-sscce repo. I note that it&apos;s not really possible to confirm w/ my instructions in the comment above with Lein 2.&lt;/p&gt;</comment>
                    <comment id="29970" author="arlen" created="Sun, 18 Nov 2012 21:10:59 -0600"  >&lt;p&gt;My testing&apos;s with Lein 2, so as David noted the fact that it didn&apos;t work for me is no indication that the patch doesn&apos;t work!&lt;/p&gt;</comment>
                    <comment id="29971" author="dnolen" created="Mon, 19 Nov 2012 09:44:17 -0600"  >&lt;p&gt;I believe you may be able to confirm the patch by skipping the checkouts bit, just clone clojurescript to some directory in your project and set :extra-classpath-dirs.&lt;/p&gt;</comment>
                    <comment id="29975" author="dnolen" created="Mon, 19 Nov 2012 12:00:39 -0600"  >&lt;p&gt;I checked with Phil Hagelberg, in Lein 2 instead of using :extra-classpath-dirs you need to use :resource-paths and no need to create the checkouts directory.&lt;/p&gt;</comment>
                    <comment id="29980" author="dnolen" created="Mon, 19 Nov 2012 13:37:01 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/a27f811f046cd1ace9e4b9461181e5a5fb23b682&quot;&gt;http://github.com/clojure/clojurescript/commit/a27f811f046cd1ace9e4b9461181e5a5fb23b682&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11686" name="cljs_282.patch" size="1917" author="dnolen" created="Sun, 18 Nov 2012 18:41:17 -0600" />
                    <attachment id="11266" name="dependencies-out-of-order.txt" size="852" author="emezeske" created="Tue, 29 May 2012 00:00:53 -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-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-401] top level let emits vars without namespace</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-401</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15762">CLJS-401</key>
            <summary>top level let emits vars without namespace</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sat, 20 Oct 2012 09:51:08 -0500</created>
                <updated>Fri, 2 Nov 2012 13:51:52 -0500</updated>
                    <resolved>Fri, 2 Nov 2012 13:51:52 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29784" author="bendlas" created="Wed, 24 Oct 2012 02:00:51 -0500"  >&lt;p&gt;I&apos;ve created test cases for lexical scoping, which include this issue.&lt;/p&gt;

&lt;p&gt;The fix is a rather ugly hotfix in the emitter, which uses a dynamic var to keep track of renamed locals.&lt;/p&gt;

&lt;p&gt;I&apos;m also working on a solution with an AST walker, but that&apos;s not ready yet.&lt;/p&gt;</comment>
                    <comment id="29792" author="dnolen" created="Wed, 24 Oct 2012 11:04:30 -0500"  >&lt;p&gt;I&apos;d rather see a proper patch. BTW, did you try just making `let` always wrap its body in a function regardless of :statement or :expr context? GClosure may optimize these away for us if there are no name clashes. We should run the benchmarks to make sure this approach doesn&apos;t cause a global performance regression.&lt;/p&gt;</comment>
                    <comment id="29830" author="bbloom" created="Sat, 27 Oct 2012 15:58:47 -0500"  >&lt;p&gt;I uploaded the 0003 patch with an alternative approach. This one wraps each top-level form (except &apos;ns) in a function scope.&lt;/p&gt;</comment>
                    <comment id="29831" author="dnolen" created="Sat, 27 Oct 2012 16:50:11 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/aea65a69384b05b0b79b94fdd9daee936ab68d5e&quot;&gt;http://github.com/clojure/clojurescript/commit/aea65a69384b05b0b79b94fdd9daee936ab68d5e&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29834" author="bendlas" created="Sun, 28 Oct 2012 16:51:06 -0500"  >&lt;p&gt;Are we going to fix the issue for non-toplevel lets too, like demonstrated in the 0001 test case?&lt;/p&gt;</comment>
                    <comment id="29836" author="dnolen" created="Sun, 28 Oct 2012 16:57:31 -0500"  >&lt;p&gt;I&apos;m surprised the letfn case is not covered by the shadowing patch. The overwriting in the expression case does seem problematic.&lt;/p&gt;</comment>
                    <comment id="29837" author="dnolen" created="Sun, 28 Oct 2012 17:00:49 -0500"  >&lt;p&gt;I&apos;ve created a separate ticket for the other let cases - &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-411&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-411&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29845" author="bendlas" created="Sun, 28 Oct 2012 18:37:22 -0500"  >&lt;p&gt;Actually, the letfn case and the expression case are covered by the shadowing patch, so no fault there. &lt;br/&gt;
The failing test is the first one (we are not at top in the test file), I had left the other ones in for completeness sake. Continuing in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-411&quot; title=&quot;broken let cases&quot;&gt;&lt;del&gt;CLJS-411&lt;/del&gt;&lt;/a&gt; &lt;/p&gt;</comment>
                    <comment id="29872" author="dnolen" created="Tue, 30 Oct 2012 13:23:57 -0500"  >&lt;p&gt;Reopening. Will review Herwig&apos;s patch and likely revert Brandon&apos;s and apply Herwig&apos;s.&lt;/p&gt;</comment>
                    <comment id="29889" author="dnolen" created="Fri, 2 Nov 2012 08:50:38 -0500"  >&lt;p&gt;Can we get a new version of your patch Herwig that applies to master. I&apos;ve reverted Brandon&apos;s patch &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3acacf73dce7b3961b2ea38f593df5df66eec3ff&quot;&gt;http://github.com/clojure/clojurescript/commit/3acacf73dce7b3961b2ea38f593df5df66eec3ff&lt;/a&gt;. It would be nice to cut a new ClojureScript release today. Thanks!&lt;/p&gt;</comment>
                    <comment id="29893" author="bendlas" created="Fri, 2 Nov 2012 13:32:24 -0500"  >&lt;p&gt;Attached 0101 Patch, which supersedes 0001 and 0002&lt;/p&gt;</comment>
                    <comment id="29894" author="dnolen" created="Fri, 2 Nov 2012 13:51:52 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/234bd3a85213d98595090b3a6625f0aeae7ea6ed&quot;&gt;http://github.com/clojure/clojurescript/commit/234bd3a85213d98595090b3a6625f0aeae7ea6ed&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11605" name="0001-CLJS-401-Test-for-proper-lexical-scoping-in-let-and-.patch" size="1210" author="bendlas" created="Wed, 24 Oct 2012 02:00:51 -0500" />
                    <attachment id="11606" name="0002-CLJS-401-gensym-let-names-in-statement-context.patch" size="2627" author="bendlas" created="Wed, 24 Oct 2012 02:00:51 -0500" />
                    <attachment id="11624" name="0003-CLJS-401-function-scopes.patch" size="2660" author="bbloom" created="Sat, 27 Oct 2012 15:58:47 -0500" />
                    <attachment id="11657" name="0101-CLJS-401-gensym-let-names-in-statement-context-in-th.patch" size="3209" author="bendlas" created="Fri, 2 Nov 2012 13:32:24 -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-411] broken let cases</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-411</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;(&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt; (= &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt; (let [x &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt;
                            oce (fn [] x)
                            x &lt;span class=&quot;code-quote&quot;&gt;&quot;overwritten&quot;&lt;/span&gt;]
                        (oce))))


(letfn [(x [] &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt;)
        (y [] (x))]
  (let [x (fn [] &lt;span class=&quot;code-quote&quot;&gt;&quot;overwritten&quot;&lt;/span&gt;)]
    (&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt; (= &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt; (y)))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15789">CLJS-411</key>
            <summary>broken let cases</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 28 Oct 2012 16:59:07 -0500</created>
                <updated>Fri, 2 Nov 2012 09:21:42 -0500</updated>
                    <resolved>Fri, 2 Nov 2012 09:21:42 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29838" author="bbloom" created="Sun, 28 Oct 2012 17:13:52 -0500"  >&lt;p&gt;What&apos;s the problem? This output seems fine to me:&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;$ rlwrap ./script/repljs
&lt;span class=&quot;code-quote&quot;&gt;&quot;Type: &quot;&lt;/span&gt; :cljs/quit &lt;span class=&quot;code-quote&quot;&gt;&quot; to quit&quot;&lt;/span&gt;
#(&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt; (= &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt; (let [x &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt; 
                            oce (fn [] x) 
                            x &lt;span class=&quot;code-quote&quot;&gt;&quot;overwritten&quot;&lt;/span&gt;] 
                        (oce))))
#&amp;lt;
function () {
    &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (cljs.core._EQ_.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;, &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt;, (function () {
        &lt;span class=&quot;code-keyword&quot;&gt;var&lt;/span&gt; x = &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt;;
        &lt;span class=&quot;code-keyword&quot;&gt;var&lt;/span&gt; oce = (function () {
            &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; x;
        });
        &lt;span class=&quot;code-keyword&quot;&gt;var&lt;/span&gt; x__$1 = &lt;span class=&quot;code-quote&quot;&gt;&quot;overwritten&quot;&lt;/span&gt;;
        &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; oce.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;);
    })())) {
        &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;;
    } &lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt; {
        &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([cljs.core.str(&lt;span class=&quot;code-quote&quot;&gt;&quot;Assert failed: &quot;&lt;/span&gt;), cljs.core.str(cljs.core.pr_str.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;, cljs.core.with_meta(cljs.core.list(&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd1&apos;=&quot;&lt;/span&gt;, &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt;, cljs.core.with_meta(cljs.core.list(&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd1&apos;let&quot;&lt;/span&gt;, cljs.core.vec([&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd1&apos;x&quot;&lt;/span&gt;, &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt;, &lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd1&apos;oce&quot;&lt;/span&gt;, cljs.core.with_meta(cljs.core.list(&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd1&apos;fn&quot;&lt;/span&gt;, cljs.core.vec([]), &lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd1&apos;x&quot;&lt;/span&gt;), cljs.core.hash_map(&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd0&apos;line&quot;&lt;/span&gt;, 14)), &lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd1&apos;x&quot;&lt;/span&gt;, &lt;span class=&quot;code-quote&quot;&gt;&quot;overwritten&quot;&lt;/span&gt;]), cljs.core.with_meta(cljs.core.list(&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd1&apos;oce&quot;&lt;/span&gt;), cljs.core.hash_map(&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd0&apos;line&quot;&lt;/span&gt;, 16))), cljs.core.hash_map(&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd0&apos;line&quot;&lt;/span&gt;, 13))), cljs.core.hash_map(&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd0&apos;line&quot;&lt;/span&gt;, 13))))].join(&quot;&quot;)));
    }
}
&amp;gt;
#(letfn [(x [] &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt;) 
        (y [] (x))] 
  (let [x (fn [] &lt;span class=&quot;code-quote&quot;&gt;&quot;overwritten&quot;&lt;/span&gt;)] 
    (&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt; (= &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt; (y)))))
#&amp;lt;
function () {
    &lt;span class=&quot;code-keyword&quot;&gt;var&lt;/span&gt; x = (function x() {
        &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt;;
    });
    &lt;span class=&quot;code-keyword&quot;&gt;var&lt;/span&gt; y = (function y() {
        &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; x.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;);
    });
    &lt;span class=&quot;code-keyword&quot;&gt;var&lt;/span&gt; x__$1 = (function () {
        &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;code-quote&quot;&gt;&quot;overwritten&quot;&lt;/span&gt;;
    });
    &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (cljs.core._EQ_.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;, &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt;, y.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;))) {
        &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;;
    } &lt;span class=&quot;code-keyword&quot;&gt;else&lt;/span&gt; {
        &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([cljs.core.str(&lt;span class=&quot;code-quote&quot;&gt;&quot;Assert failed: &quot;&lt;/span&gt;), cljs.core.str(cljs.core.pr_str.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;, cljs.core.with_meta(cljs.core.list(&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd1&apos;=&quot;&lt;/span&gt;, &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt;, cljs.core.with_meta(cljs.core.list(&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd1&apos;y&quot;&lt;/span&gt;), cljs.core.hash_map(&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd0&apos;line&quot;&lt;/span&gt;, 12))), cljs.core.hash_map(&lt;span class=&quot;code-quote&quot;&gt;&quot;\ufdd0&apos;line&quot;&lt;/span&gt;, 12))))].join(&quot;&quot;)));
    }
}
&amp;gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As an aside. The less-mangled names in the output are much more pleasant to look at &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="29841" author="dnolen" created="Sun, 28 Oct 2012 17:40:07 -0500"  >&lt;p&gt;nothing is broken, added test cases, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/a3d2270480d5d4774ba20b587cdb7544546f4200&quot;&gt;http://github.com/clojure/clojurescript/commit/a3d2270480d5d4774ba20b587cdb7544546f4200&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29846" author="bendlas" created="Sun, 28 Oct 2012 18:41:28 -0500"  >&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-keyword&quot;&gt;do&lt;/span&gt;
  (let [x &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt;]
    (defn original-closure-stmt [] x))

  (let [x &lt;span class=&quot;code-quote&quot;&gt;&quot;overwritten&quot;&lt;/span&gt;]
    (&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt; (= &lt;span class=&quot;code-quote&quot;&gt;&quot;original&quot;&lt;/span&gt; (original-closure-stmt))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;is still broken, patch forthcoming&lt;/p&gt;</comment>
                    <comment id="29847" author="bendlas" created="Sun, 28 Oct 2012 18:41:46 -0500"  >&lt;p&gt;should i make a new ticket?&lt;/p&gt;</comment>
                    <comment id="29848" author="bendlas" created="Sun, 28 Oct 2012 19:05:29 -0500"  >&lt;p&gt;OK, I tried to patch the issue by wrapping every statement let in a function. &lt;br/&gt;
Unfortunately, because of continue; et al, that approach yields problems with lets inside a loop.&lt;br/&gt;
Maybe the original patches for &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-401&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-401&lt;/a&gt; should be reconsidered?&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;
	&lt;ol&gt;
		&lt;li&gt;EDIT: failing test case applying to current trunk is appended as of two comments before&lt;/li&gt;
	&lt;/ol&gt;
	&lt;/li&gt;
&lt;/ol&gt;
</comment>
                    <comment id="29851" author="dnolen" created="Sun, 28 Oct 2012 19:37:05 -0500"  >&lt;p&gt;I think we can probably make the current approach work with some more thought.&lt;/p&gt;
</comment>
                    <comment id="29852" author="dnolen" created="Sun, 28 Oct 2012 19:40:33 -0500"  >&lt;p&gt;Reopening&lt;/p&gt;</comment>
                    <comment id="29854" author="bendlas" created="Sun, 28 Oct 2012 19:57:21 -0500"  >&lt;p&gt;The problem are recurs across a nested let, so wrapping with fns isn&apos;t an option, unless we want to special case lets containing a recur form.&lt;br/&gt;
Still thinking ...&lt;/p&gt;</comment>
                    <comment id="29857" author="bendlas" created="Sun, 28 Oct 2012 20:13:20 -0500"  >&lt;p&gt;Tracking let vars in the lexical scope won&apos;t solve it, the shadowing patch already does that. IMO that leaves globally tracking or gensyming let vars.&lt;/p&gt;

&lt;p&gt;A design for compilation units would encompass global transformations like that. For now we can implement el-cheapo gensyming in the emitter, which I have done in previous ticket.&lt;/p&gt;

&lt;p&gt;For reference, my considerations on compilation units here: &lt;a href=&quot;http://dev.clojure.org/display/~bendlas/Design+for+compilation+units+in+ClojureScript&quot;&gt;http://dev.clojure.org/display/~bendlas/Design+for+compilation+units+in+ClojureScript&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29890" author="dnolen" created="Fri, 2 Nov 2012 09:21:42 -0500"  >&lt;p&gt;subsumed by &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-401&quot; title=&quot;top level let emits vars without namespace&quot;&gt;&lt;del&gt;CLJS-401&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11631" name="0001-CLJS-411-Test-for-lexical-scoping-in-subsequent-lets.patch" size="903" author="bendlas" created="Sun, 28 Oct 2012 18:41: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>
                                                                                                            </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-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-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-409] Small code cleanup for emitting goog.provide statements</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-409</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Just abstracts out a duplicated piece of code.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15787">CLJS-409</key>
            <summary>Small code cleanup for emitting goog.provide statements</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Sat, 27 Oct 2012 16:07:40 -0500</created>
                <updated>Sat, 27 Oct 2012 16:52:59 -0500</updated>
                    <resolved>Sat, 27 Oct 2012 16:52:59 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29833" author="dnolen" created="Sat, 27 Oct 2012 16:52:59 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/d8f490e9b958a43e97b34808e76d977f29fee8c9&quot;&gt;http://github.com/clojure/clojurescript/commit/d8f490e9b958a43e97b34808e76d977f29fee8c9&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11625" name="CLJS-409-v1.patch" size="1733" author="bbloom" created="Sat, 27 Oct 2012 16:08: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>
                                            <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-408] Include :form on fn :methods in AST</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-408</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;All core CLJS AST nodes include a :form key. Several quasi-nodes similarly include their originating code forms. Although :fn nodes include their :form, it varies between single and multiple arity functions. I&apos;ve found it easier to assume multiple arities and always analyze :methods directly. Unfortunately, the methods lack :form keys. This simple patch exposes the form of each method, simplifying function transformations.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15779">CLJS-408</key>
            <summary>Include :form on fn :methods in AST</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Wed, 24 Oct 2012 17:01:35 -0500</created>
                <updated>Sat, 27 Oct 2012 16:52:42 -0500</updated>
                    <resolved>Sat, 27 Oct 2012 16:52:42 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29832" author="dnolen" created="Sat, 27 Oct 2012 16:52:42 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3ea4a9309346a2a2d0983dc535b9b00531bfc90f&quot;&gt;http://github.com/clojure/clojurescript/commit/3ea4a9309346a2a2d0983dc535b9b00531bfc90f&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11610" name="CLJS-408-v1.patch" size="1564" author="bbloom" created="Wed, 24 Oct 2012 17: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>
                                            <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-392] Documentation says CLJS can open connections to the REPL server from a &quot;file://&quot; source, and you can&apos;t</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-392</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;At &lt;a href=&quot;https://github.com/clojure/clojurescript/wiki/The-REPL-and-Evaluation-Environments&quot;&gt;https://github.com/clojure/clojurescript/wiki/The-REPL-and-Evaluation-Environments&lt;/a&gt; there is the following paragraph:&lt;/p&gt;

&lt;p&gt;&quot;This is a problem for the browser-connected REPL because FireFox and Chrome both view opening a file from the file system and connecting to localhost:9000 as different domains. &lt;br/&gt;
(...)&lt;br/&gt;
Fortunately, Google has also run into this problem and has created something called a CrossPageChannel. Without going into the details, this allows an iframe served from one domain (the REPL) to communicate with the parent page which was served from another domain (the application server).&quot;&lt;/p&gt;

&lt;p&gt;From what I tested, you CANT connect to the REPL server at &quot;http://localhost:9000/repl&quot; if you initially loaded the page using the &quot;file://&quot; protocol. But you can if you loaded it from the same hostname on another port using &quot;http://&quot;. The documentation is wrong, and also it needs to be clarified on what you really can change from the initial domain, like the port, without broking the REPL connection (or link to a CrossPageChannel documentation page with the details on what same-origin policy checks it can overcome). &lt;/p&gt;</description>
                <environment>ClojureScript 0.0-1450</environment>
            <key id="15741">CLJS-392</key>
            <summary>Documentation says CLJS can open connections to the REPL server from a &quot;file://&quot; source, and you can&apos;t</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="nahuel">Nahuel Greco</reporter>
                        <labels>
                        <label>bug</label>
                        <label>docs</label>
                        <label>documentation</label>
                    </labels>
                <created>Tue, 9 Oct 2012 07:54:04 -0500</created>
                <updated>Wed, 24 Oct 2012 14:48:48 -0500</updated>
                    <resolved>Wed, 24 Oct 2012 14:48:48 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29783" author="dnolen" created="Tue, 23 Oct 2012 19:00:24 -0500"  >&lt;p&gt;Are you unable to edit the wiki?&lt;/p&gt;</comment>
                    <comment id="29788" author="nahuel" created="Wed, 24 Oct 2012 09:27:42 -0500"  >&lt;p&gt;I didn&apos;t know the wiki had public write permissions. Also I don&apos;t know the exact CrossPageChannel limitations. &lt;/p&gt;</comment>
                    <comment id="29789" author="dnolen" created="Wed, 24 Oct 2012 10:37:36 -0500"  >&lt;p&gt;The limitation is that it won&apos;t work with &lt;a href=&quot;file://&quot;&gt;file://&lt;/a&gt;. We now provide a simple webserver that will serve the files present in the directory where you started browser REPL. If you goto &lt;a href=&quot;http://localhost:9000/&quot;&gt;http://localhost:9000/&lt;/a&gt; we will serve index.html if it is present.&lt;/p&gt;</comment>
                    <comment id="29790" author="nahuel" created="Wed, 24 Oct 2012 10:47:25 -0500"  >&lt;p&gt;So CrossPageChannel overcomes the &quot;same origin policy&quot; for different ports, but not for different protocols. Thanks for the clarification.&lt;/p&gt;</comment>
                    <comment id="29794" author="dnolen" created="Wed, 24 Oct 2012 14:48:48 -0500"  >&lt;p&gt;No problem, closing this one.&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-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-403] Printed JS code on REPL stack trace inconsistent with what got evaluated</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-403</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This issue arose from &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-397&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-397&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The REPL uses a statement context to compile the code printed out as part of a stack trace. The code that runs, however, actually gets compiled in an :expr context, in a wrapper form.&lt;/p&gt;

&lt;p&gt;Several ops (fn, constant, var) don&apos;t get emitted in a statement context. Thus a form a form like&lt;/p&gt;

&lt;p&gt;(if (&amp;gt; 0.5 (Math/random))&lt;br/&gt;
  (throw &quot;&quot;)&lt;br/&gt;
  :value)&lt;/p&gt;

&lt;p&gt;gets compiled to&lt;/p&gt;

&lt;p&gt;if (Math.random() &amp;gt; 0.5) {
  throw &quot;&quot;;
}else{&lt;br/&gt;
}&lt;/p&gt;

&lt;p&gt;according to the stack trace, while still returning :value half of the time.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15766">CLJS-403</key>
            <summary>Printed JS code on REPL stack trace inconsistent with what got evaluated</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                    </labels>
                <created>Mon, 22 Oct 2012 14:52:08 -0500</created>
                <updated>Tue, 23 Oct 2012 18:50:51 -0500</updated>
                    <resolved>Tue, 23 Oct 2012 18:50:51 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29756" author="bendlas" created="Mon, 22 Oct 2012 14:55:54 -0500"  >&lt;p&gt;Attached patch updates REPL to analyze in an expression context.&lt;/p&gt;</comment>
                    <comment id="29782" author="dnolen" created="Tue, 23 Oct 2012 18:50:51 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/72e55315c6973caa74af39b66052424f73872033&quot;&gt;http://github.com/clojure/clojurescript/commit/72e55315c6973caa74af39b66052424f73872033&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11597" name="0002-CLJS-403-REPL-is-changed-to-analyze-forms-in-an-expr.patch" size="1396" author="bendlas" created="Mon, 22 Oct 2012 14:55: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-397] Omit var reads in statement context</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-397</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Attached patch updates cljs emitter to not emit var references in statement context.&lt;br/&gt;
That causes toplevel deftypes to not return their generated type, which lets gclosure strip them if unused&lt;/p&gt;

&lt;p&gt;cljs helloworld shrinks from ~90K to ~69K&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="15758">CLJS-397</key>
            <summary>Omit var reads in statement context</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                        <label>size</label>
                    </labels>
                <created>Fri, 19 Oct 2012 00:49:00 -0500</created>
                <updated>Tue, 23 Oct 2012 18:49:53 -0500</updated>
                    <resolved>Tue, 23 Oct 2012 18:49:53 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29703" author="dnolen" created="Fri, 19 Oct 2012 17:15:03 -0500"  >&lt;p&gt;Can we get the ticket # in the commit message? Thanks!&lt;/p&gt;</comment>
                    <comment id="29705" author="bendlas" created="Fri, 19 Oct 2012 17:42:10 -0500"  >&lt;p&gt;Of course, sorry! Here is a new patch, if you please.&lt;/p&gt;</comment>
                    <comment id="29715" author="dnolen" created="Fri, 19 Oct 2012 19:32:44 -0500"  >&lt;p&gt;Thanks. I&apos;m confused about the second aspect of the patch, what do you mean by bogus error messages?&lt;/p&gt;</comment>
                    <comment id="29722" author="bendlas" created="Fri, 19 Oct 2012 23:23:55 -0500"  >&lt;p&gt;Well, the repl uses a :statement context to generate the javascript which gets printed out as part of a stack trace. When setting :expr back to :statement in the repl, you can try the following scenario:&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;enter into the repl (def val :worked) (if (&amp;gt; (Math/rand) 0.5) val (throw &quot;&quot;))&lt;/li&gt;
	&lt;li&gt;half of the time you will get :worked&lt;/li&gt;
	&lt;li&gt;half of the time you will get a stacktrace citing &apos;ns.val = &quot;:worked&quot;; if (Math.rand() &amp;gt; 0.5){}{throw &quot;&quot;}&apos;&lt;/li&gt;
	&lt;li&gt;that makes no sense&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;With the full patch, the printout will be smth like &apos;(function(){ns.val = &quot;:worked&quot;; if (Math.rand() &amp;gt; 0.5){return ns.val}{throw &quot;&quot;}})()&apos;, which is noisier, but more like what actually got evaluated by the repl client.&lt;/p&gt;

&lt;p&gt;##EDIT#APPEND##&lt;/p&gt;

&lt;p&gt;The reason the repl still works, even when analyzing in a statement context with the patch is, that in order to get the return value, the repl statement has to be evaluated in an :expr context anyway. &lt;br/&gt;
This happens by unquoting it into a wrapper form. With the patch the wrapper form also gets analyzed in an :expr context, which doesn&apos;t hurt.&lt;br/&gt;
Only when an exception gets caught, the js of the unwrapped expr is used, which now always matches the its counterpart in the wrapper form.&lt;/p&gt;</comment>
                    <comment id="29724" author="dnolen" created="Sat, 20 Oct 2012 09:33:49 -0500"  >&lt;p&gt;I&apos;m still confused. Does this additional modification have anything to do with the ticket? By that I mean does the patch require the second modification? If it does can you explain a further? Thanks.&lt;/p&gt;</comment>
                    <comment id="29732" author="bendlas" created="Sat, 20 Oct 2012 13:17:50 -0500"  >&lt;p&gt;The patch doesn&apos;t require the second modification in the sense that everything still works if it&apos;s left out.&lt;/p&gt;

&lt;p&gt;The patch requires the modification in the sense that it would break stack traces on the REPL otherwise + the two changes should be reverted together if and when we move such optimizations out of the emitter into an optimization pass.&lt;/p&gt;

&lt;p&gt;So the trade off is in always having the correct code in a REPL stacktrace in exchange for making it more verbose. Again, this doesn&apos;t influence behavior, so it&apos;s a matter of prioritizing requirements.&lt;/p&gt;</comment>
                    <comment id="29742" author="dnolen" created="Sun, 21 Oct 2012 15:48:56 -0500"  >&lt;p&gt;I still don&apos;t understand why/how the part of the patch that addresses the ticket breaks stack traces. Can you explain?&lt;/p&gt;</comment>
                    <comment id="29751" author="bendlas" created="Mon, 22 Oct 2012 10:06:50 -0500"  >&lt;p&gt;1) var read statements get omitted&lt;br/&gt;
2) typing &quot;var&quot; into the repl still works, because it&apos;s analyzed in a wrapper form&lt;br/&gt;
3) if it throws, the printed generated js is the original form in a statement context, you can observe this with above code sample.&lt;/p&gt;</comment>
                    <comment id="29752" author="dnolen" created="Mon, 22 Oct 2012 10:16:03 -0500"  >&lt;p&gt;Ok I understand now, I don&apos;t think the second part of the patch is relevant. The user entered two statements, not one combined in an implicit do which is what the other part of the patch does. Can we get a new patch that only includes the part that addresses the ticket? Thanks!&lt;/p&gt;</comment>
                    <comment id="29757" author="bendlas" created="Mon, 22 Oct 2012 14:58:51 -0500"  >&lt;p&gt;For the record: There was some talk in the chat, where I laid down my rationale for changing the repl specifically: &quot;Technically repl inputs have to be in an expr context, to capture the return val. And they are, by virtue of the wrapping form. The change makes that fact explicit, thereby keeping stack traces sane.&quot;&lt;/p&gt;

&lt;p&gt;I also discovered, that two other ops, beside a var read, don&apos;t emit in a statement context either and therefore have same issue. I created &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-403&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-403&lt;/a&gt; for the REPL change.&lt;/p&gt;

&lt;p&gt;Updated attached patch contains just the optimization.&lt;/p&gt;</comment>
                    <comment id="29781" author="dnolen" created="Tue, 23 Oct 2012 18:49:53 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/97e5fbd1e1597d58be35fd8320c8044ccc9d3a3d&quot;&gt;http://github.com/clojure/clojurescript/commit/97e5fbd1e1597d58be35fd8320c8044ccc9d3a3d&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11598" name="0001-CLJS-397-var-reads-in-a-statement-context-get-omitte.patch" size="858" author="bendlas" created="Mon, 22 Oct 2012 14:58: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-395] nodejs target no longer works</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-395</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;If you target nodejs by adding {:target :nodejs} to the options (and set &lt;b&gt;main-cli-fn&lt;/b&gt;) , you get this error:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://gist.github.com/3892983&quot;&gt;https://gist.github.com/3892983&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This appears to have been introduced with this commit: &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/d6f7d0b193de22378e06298fa543ca57d570c001&quot;&gt;https://github.com/clojure/clojurescript/commit/d6f7d0b193de22378e06298fa543ca57d570c001&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It spits out that error and nothing else. Any versions before that works fine.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-355&quot; title=&quot;Targeting nodejs, compiling multiple files fail&quot;&gt;&lt;del&gt;CLJS-355&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</description>
                <environment>OS X</environment>
            <key id="15755">CLJS-395</key>
            <summary>nodejs target no longer works</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="ohpauleez">Paul deGrandis</assignee>
                                <reporter username="jlongster">James Long</reporter>
                        <labels>
                    </labels>
                <created>Mon, 15 Oct 2012 23:54:43 -0500</created>
                <updated>Tue, 23 Oct 2012 18:33:27 -0500</updated>
                    <resolved>Tue, 23 Oct 2012 18:33:27 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29666" author="tomoj" created="Wed, 17 Oct 2012 00:50:31 -0500"  >&lt;p&gt;A workaround that doesn&apos;t need a patch is to just require &lt;tt&gt;cljs.nodejs&lt;/tt&gt; somewhere in your project.&lt;/p&gt;

&lt;p&gt;Here is a workaround patch :/ (work-around-cljs-395.patch, 16 Oct 2012). The patch just removes the dependency on &lt;tt&gt;cljs.nodejs&lt;/tt&gt; from &lt;tt&gt;cljs.nodejscli&lt;/tt&gt;. Since all it uses is &lt;tt&gt;(js* &quot;process&quot;)&lt;/tt&gt;, it didn&apos;t seem worth the work to figure out how to do the dependency resolution while ensuring nodejscli ends up at the bottom.&lt;/p&gt;</comment>
                    <comment id="29668" author="dnolen" created="Wed, 17 Oct 2012 10:50:56 -0500"  >&lt;p&gt;We&apos;ll have to ask Paul degGrandis (ohpauleez on IRC) about this one.&lt;/p&gt;</comment>
                    <comment id="29673" author="ohpauleez" created="Wed, 17 Oct 2012 13:09:41 -0500"  >&lt;p&gt;I can&apos;t recreate this on master or on my personal branch (where I maintain my own set of patches and changes).&lt;/p&gt;

&lt;p&gt;Could someone link to a git repo that has code that can produce this for me?&lt;br/&gt;
Thanks!&lt;/p&gt;</comment>
                    <comment id="29674" author="jlongster" created="Wed, 17 Oct 2012 13:50:09 -0500"  >&lt;p&gt;That&apos;s surprising. Does Tom&apos;s comment help at all?&lt;/p&gt;

&lt;p&gt;This deterministically reproduces it for me. I forked the clojurescript repo today and added a test file:&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;git clone git@github.com:jlongster/clojurescript.git &amp;amp;&amp;amp; \
 cd clojurescript &amp;amp;&amp;amp; \
 ./script/bootstrap &amp;amp;&amp;amp; \
 ./bin/cljsc hello.cljs &apos;{:optimizations :advanced :target :nodejs}&apos; &amp;gt; hello-output.js&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29675" author="ohpauleez" created="Wed, 17 Oct 2012 13:54:06 -0500"  >&lt;p&gt;James, I&apos;ll take a look at that and start tracing things through.  I&apos;ll have this all patched up ASAP.&lt;/p&gt;

&lt;p&gt;I&apos;m actually in the middle of working on two Node.js CLJS apps.  I&apos;d really like to see CLJS&apos;s system scripting story come alive&lt;/p&gt;</comment>
                    <comment id="29676" author="jlongster" created="Wed, 17 Oct 2012 14:23:24 -0500"  >&lt;p&gt;Awesome, thanks! I agree, I&apos;d love to use CLJS to interact with node stuff.&lt;/p&gt;</comment>
                    <comment id="29689" author="ohpauleez" created="Fri, 19 Oct 2012 11:27:22 -0500"  >&lt;p&gt;That still doesn&apos;t recreate it for me: &lt;a href=&quot;http://www.pauldee.org/StillNoBug.png&quot;&gt;http://www.pauldee.org/StillNoBug.png&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&apos;m running:&lt;br/&gt;
 Java 1.7.0_04 Java HotSpot(TM) 64-Bit Server VM&lt;br/&gt;
On:&lt;br/&gt;
 OSX 10.7.4 (4-core i7)&lt;br/&gt;
With:&lt;br/&gt;
 Node v0.8.8&lt;/p&gt;

&lt;p&gt;=======&lt;/p&gt;

&lt;p&gt;I get the same result with and without CLOJURESCRIPT_HOME set.&lt;/p&gt;</comment>
                    <comment id="29691" author="jlongster" created="Fri, 19 Oct 2012 12:57:46 -0500"  >&lt;p&gt;Wow, that is weird. I guess you can close this bug if nobody else can reproduce it. It&apos;d be great if at least one other person could try on a different computer.&lt;/p&gt;

&lt;p&gt;Otherwise, maybe I have some weird environment var set that&apos;s messing up things. I&apos;ll come back to it at some point and see if I can dig into it more. Until then, feel free to close this bug.&lt;/p&gt;</comment>
                    <comment id="29692" author="ohpauleez" created="Fri, 19 Oct 2012 13:07:18 -0500"  >&lt;p&gt;I&apos;m going to leave it open and reduce it to minor.  I want more environments to try it out - it definitely seems like something buried deep within &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="29709" author="tomoj" created="Fri, 19 Oct 2012 18:20:48 -0500"  >&lt;p&gt;I can&apos;t reproduce with hello.cljs either. But I get &quot;No &lt;b&gt;print-fn&lt;/b&gt; fn set for evaluation environment&quot;. Why don&apos;t you?&lt;/p&gt;

&lt;p&gt;I can, however, reproduce with mori:&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;$ GIT_DIR=$CLOJURESCRIPT_HOME/.git git rev-parse HEAD
e3ed0e7b69f9522e8759d0a6567afabb2a98d949
$ git clone https:&lt;span class=&quot;code-comment&quot;&gt;//github.com/swannodette/mori.git &amp;amp;&amp;amp; cd mori
&lt;/span&gt;...
$ $CLOJURESCRIPT_HOME/bin/cljsc src &apos;{:optimizations :advanced :target :nodejs}&apos; &amp;gt; mori.js
Oct 19, 2012 4:18:13 PM com.google.javascript.jscomp.LoggerErrorManager println
SEVERE: cljs.nodejscli:3: ERROR - required &lt;span class=&quot;code-quote&quot;&gt;&quot;cljs.nodejs&quot;&lt;/span&gt; namespace never provided
goog.require(&apos;cljs.nodejs&apos;);
^

Oct 19, 2012 4:18:13 PM com.google.javascript.jscomp.LoggerErrorManager printSummary
WARNING: 1 error(s), 0 warning(s)
$ cat mori.js
ERROR: JSC_MISSING_PROVIDE_ERROR. required &lt;span class=&quot;code-quote&quot;&gt;&quot;cljs.nodejs&quot;&lt;/span&gt; namespace never provided at cljs.nodejscli line 3 : 0
#!/usr/bin/env node&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;My workaround patch fixes it.&lt;/p&gt;

&lt;p&gt;EDIT: actually, my workaround patch was applied in CLOJURESCRIPT_HOME when I tried hello.cljs. Without the patch, I get the same error.&lt;/p&gt;</comment>
                    <comment id="29710" author="ohpauleez" created="Fri, 19 Oct 2012 18:32:14 -0500"  >&lt;p&gt;Can you provide the environment this is happening in?&lt;/p&gt;

&lt;p&gt;EDIT:&lt;br/&gt;
I&apos;m not a fan of the patch because it isn&apos;t a fix, it&apos;s just a simple workaround.&lt;br/&gt;
Can anyone spot the reason why the nodejs code isn&apos;t being shoved into the end of the file on certain platforms?&lt;/p&gt;

&lt;p&gt;Seems like the commit cited above should always do that?&lt;/p&gt;</comment>
                    <comment id="29711" author="tomoj" created="Fri, 19 Oct 2012 18:38:06 -0500"  >&lt;p&gt;cljs.nodejscli is being shoved into the end, but it is not analyzed for dependencies. So unless you require cljs.nodejs somewhere in your project, it is never pulled in. No clue why it works for you...&lt;/p&gt;

&lt;p&gt;My environment:&lt;br/&gt;
ubuntu 12.04&lt;br/&gt;
java version &quot;1.6.0_30&quot;&lt;br/&gt;
Java(TM) SE Runtime Environment (build 1.6.0_30-b12)&lt;br/&gt;
Java HotSpot(TM) 64-Bit Server VM (build 20.5-b03, mixed mode)&lt;/p&gt;</comment>
                    <comment id="29712" author="ohpauleez" created="Fri, 19 Oct 2012 18:52:28 -0500"  >&lt;p&gt;Ahh I see the problem - I&apos;ll apply an appropriate patch.&lt;/p&gt;

&lt;p&gt;It needs to be added to the end, but before the add-dependencies call.&lt;/p&gt;</comment>
                    <comment id="29713" author="tomoj" created="Fri, 19 Oct 2012 19:03:21 -0500"  >&lt;p&gt;But wasn&apos;t that what we had before, and the problem was that add-dependencies didn&apos;t necessarily keep nodejscli at the bottom?&lt;/p&gt;</comment>
                    <comment id="29725" author="dnolen" created="Sat, 20 Oct 2012 09:34:45 -0500"  >&lt;p&gt;Other people on the mailing list are experiencing this.&lt;/p&gt;</comment>
                    <comment id="29728" author="ohpauleez" created="Sat, 20 Oct 2012 11:12:15 -0500"  >&lt;p&gt;Can someone experiencing the problem screen the patch I attached: cljs-395-nodetarget.diff&lt;/p&gt;

&lt;p&gt;The patch is to hand include the nodejs ns before the nodejscli namespace (essentially what add-dependencies would do).  The reason for hand including at the end is to prevent the stomping of &lt;b&gt;main-cli-fn&lt;/b&gt; - as was fixed in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-355&quot; title=&quot;Targeting nodejs, compiling multiple files fail&quot;&gt;&lt;del&gt;CLJS-355&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Nvm - that won&apos;t work.  On projects that DO require nodejs, you&apos;ll get a &quot;required twice&quot; error.&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;SEVERE: cljs.nodejs:1: ERROR - namespace &quot;cljs.nodejs&quot; cannot be provided twice
goog.provide(&apos;cljs.nodejs&apos;);
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;New patch to try adding nodejs to the add-dependencies call and tacks on the nodejscli at the end, outside of the call to prevent &lt;b&gt;main-cli-fn&lt;/b&gt; from getting stomped.  I&apos;ll refactor the code - just want to see if this fixes the issue for people first.&lt;/p&gt;</comment>
                    <comment id="29733" author="tomoj" created="Sat, 20 Oct 2012 15:22:19 -0500"  >&lt;p&gt;Looks like your patch makes mori build correctly, thanks. But since mori doesn&apos;t set &lt;b&gt;main-cli-fn&lt;/b&gt;, it&apos;s still broken. But that seems like a separate issue.&lt;/p&gt;</comment>
                    <comment id="29738" author="ohpauleez" created="Sun, 21 Oct 2012 13:33:41 -0500"  >&lt;p&gt;David, do you want me to clean up the code or does it look fine to you?  Sort of sucks to see the double concat and double when - but I can&apos;t think of cleaner refactor that doesn&apos;t involve just breaking some of it into the let bindings&lt;/p&gt;</comment>
                    <comment id="29741" author="dnolen" created="Sun, 21 Oct 2012 15:45:48 -0500"  >&lt;p&gt;I&apos;m mostly interested in something that works at this point. We can clean it up later if that&apos;s possible. Would like to get feedback from the original ticket creator as well. &lt;/p&gt;</comment>
                    <comment id="29772" author="jlongster" created="Tue, 23 Oct 2012 08:55:04 -0500"  >&lt;p&gt;The patch does indeed work. Sorry for being distant from this bug, I&apos;ve been consumed with a project at work. I can&apos;t give feedback on the patch because I&apos;m not familiar with the compiler.&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;james:~/projects/clojurescript(master)% ./bin/cljsc hello.cljs &apos;{:optimizations :advanced :target :nodejs}&apos; &amp;gt; hello-output.js
Oct 23, 2012 9:48:59 AM com.google.javascript.jscomp.LoggerErrorManager println
SEVERE: cljs.nodejscli:3: ERROR - required &lt;span class=&quot;code-quote&quot;&gt;&quot;cljs.nodejs&quot;&lt;/span&gt; namespace never provided
goog.require(&apos;cljs.nodejs&apos;);
^

Oct 23, 2012 9:48:59 AM com.google.javascript.jscomp.LoggerErrorManager printSummary
WARNING: 1 error(s), 0 warning(s)
james:~/projects/clojurescript(master)% patch -p1 &amp;lt; ~/tmp/cljs-395-nodetarget-2.diff 
patching file src/clj/cljs/closure.clj
patching file src/clj/cljs/closure.clj
james:~/projects/clojurescript(master)% ./bin/cljsc hello.cljs &apos;{:optimizations :advanced :target :nodejs}&apos; &amp;gt; hello-output.js
james:~/projects/clojurescript(master)% node hello-output.js 
hello world&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29773" author="dnolen" created="Tue, 23 Oct 2012 10:42:01 -0500"  >&lt;p&gt;Great, thanks James - Paul, could we get a patch that is a single commit? Thanks.&lt;/p&gt;</comment>
                    <comment id="29774" author="ohpauleez" created="Tue, 23 Oct 2012 10:43:11 -0500"  >&lt;p&gt;np, I&apos;ll squash it down right now.&lt;/p&gt;</comment>
                    <comment id="29775" author="ohpauleez" created="Tue, 23 Oct 2012 10:51:18 -0500"  >&lt;p&gt;Let me know how that looks.&lt;/p&gt;</comment>
                    <comment id="29778" author="dnolen" created="Tue, 23 Oct 2012 18:31:33 -0500"  >&lt;p&gt;Looks good!&lt;/p&gt;</comment>
                    <comment id="29779" author="dnolen" created="Tue, 23 Oct 2012 18:33:27 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/e83204a9ad4002b1e33532189f826f20a22b9608&quot;&gt;http://github.com/clojure/clojurescript/commit/e83204a9ad4002b1e33532189f826f20a22b9608&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11588" name="cljs-395-nodetarget-2.diff" size="2548" author="ohpauleez" created="Sat, 20 Oct 2012 11:33:29 -0500" />
                    <attachment id="11587" name="cljs-395-nodetarget.diff" size="1090" author="ohpauleez" created="Sat, 20 Oct 2012 11:09:33 -0500" />
                    <attachment id="11604" name="cljs-395-nodetarget-final.diff" size="1271" author="ohpauleez" created="Tue, 23 Oct 2012 10:50:42 -0500" />
                    <attachment id="11567" name="work-around-cljs-395.patch" size="959" author="tomoj" created="Wed, 17 Oct 2012 00:50:31 -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-405] reify regression</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-405</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;(defprotocol IFoo (-foo [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; x]))

(defn bar [f]
  (reify
    IFoo
    (-foo [_ x]
      (f x))))

((bar inc) 1) ;; &lt;span class=&quot;code-keyword&quot;&gt;throws&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This fails because f in the -foo implementation while correctly identified as a field gets renamed via shadow analysis. Looks like it may have been caused by &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-369&quot; title=&quot;gensyms break re-analyze; prevents variable shadowing analysis&quot;&gt;&lt;del&gt;CLJS-369&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15772">CLJS-405</key>
            <summary>reify regression</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Tue, 23 Oct 2012 18:09:35 -0500</created>
                <updated>Tue, 23 Oct 2012 18:28:20 -0500</updated>
                    <resolved>Tue, 23 Oct 2012 18:28:20 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29777" author="dnolen" created="Tue, 23 Oct 2012 18:28:20 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/a6fa901adfb0125e78eadea90bccd6faa5e4124a&quot;&gt;http://github.com/clojure/clojurescript/commit/a6fa901adfb0125e78eadea90bccd6faa5e4124a&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-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-400] Stop using goog.string.quote to escape strings for printing</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-400</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The contract of &lt;tt&gt;goog.string.quote&lt;/tt&gt; is to produce a &quot;valid JavaScript string&quot;, which can end up being quite different from what is expected by e.g. the Clojure reader and other edn-compatible readers.  This has been discussed in a variety of threads/issues:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;https://groups.google.com/forum/#!msg/clojure/Kl3WVtEE3FY/N1VEGHf8C3AJ&quot;&gt;https://groups.google.com/forum/#!msg/clojure/Kl3WVtEE3FY/N1VEGHf8C3AJ&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://groups.google.com/group/clojure-dev/browse_thread/thread/3114566c2f13f520&quot;&gt;http://groups.google.com/group/clojure-dev/browse_thread/thread/3114566c2f13f520&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://groups.google.com/group/clojure/browse_thread/thread/f05a78432e0084db&quot;&gt;http://groups.google.com/group/clojure/browse_thread/thread/f05a78432e0084db&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1025&quot;&gt;http://dev.clojure.org/jira/browse/CLJ-1025&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://github.com/ibdknox/pinot/issues/16&quot;&gt;https://github.com/ibdknox/pinot/issues/16&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The most significant issue is that characters &amp;gt; 127 and &amp;lt; 256 are outputted with an &lt;tt&gt;\x..&lt;/tt&gt; escape sequence, which no other reader supports.  Further, other Unicode characters are &lt;em&gt;always&lt;/em&gt; escaped using the &lt;tt&gt;\u....&lt;/tt&gt; notation; this is not a functional difference, but can be a stumbling block, e.g. when viewing data that had been &lt;tt&gt;pr-str&lt;/tt&gt;&apos;d that contains high codepoint characters.&lt;/p&gt;

&lt;p&gt;The most straightforward fix is to take control of printed string escaping to ensure the results conform first to the expectations of existing readers (primarily Clojure&apos;s and ClojureScript&apos;s), and to the formal &lt;span class=&quot;error&quot;&gt;&amp;#91;edn specification&amp;#93;&lt;/span&gt;(&lt;a href=&quot;https://github.com/edn-format/edn/&quot;&gt;https://github.com/edn-format/edn/&lt;/a&gt;) as that matures.&lt;/p&gt;

&lt;p&gt;This ticket supersedes &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1025&quot;&gt;http://dev.clojure.org/jira/browse/CLJ-1025&lt;/a&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15761">CLJS-400</key>
            <summary>Stop using goog.string.quote to escape strings for printing</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Fri, 19 Oct 2012 19:47:40 -0500</created>
                <updated>Mon, 22 Oct 2012 18:06:32 -0500</updated>
                    <resolved>Mon, 22 Oct 2012 18:06:32 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29717" author="cemerick" created="Fri, 19 Oct 2012 19:50:42 -0500"  >&lt;p&gt;Patch attached&lt;/p&gt;</comment>
                    <comment id="29720" author="dnolen" created="Fri, 19 Oct 2012 20:13:41 -0500"  >&lt;p&gt;Thanks. Performance things - can we avoid instantiating the RegExp everytime, can we switch char-escapes to a JS object and use aget?&lt;/p&gt;</comment>
                    <comment id="29721" author="cemerick" created="Fri, 19 Oct 2012 21:11:27 -0500"  >&lt;p&gt;Patch &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-400&quot; title=&quot;Stop using goog.string.quote to escape strings for printing&quot;&gt;&lt;del&gt;CLJS-400&lt;/del&gt;&lt;/a&gt;-fast.diff added with suggested perf tweaks. Please excuse my (still) absolutely shoddy cljs instincts.&lt;/p&gt;</comment>
                    <comment id="29726" author="dnolen" created="Sat, 20 Oct 2012 09:42:21 -0500"  >&lt;p&gt;Using the let won&apos;t work here. That will be emit top-levels that are &lt;b&gt;not&lt;/b&gt; namespaced. Edge case in the compiler that should be sorted out on another ticket. Just define top levels for these thanks.&lt;/p&gt;</comment>
                    <comment id="29755" author="cemerick" created="Mon, 22 Oct 2012 14:03:09 -0500"  >&lt;p&gt;New patch attached with requested changes, &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-400&quot; title=&quot;Stop using goog.string.quote to escape strings for printing&quot;&gt;&lt;del&gt;CLJS-400&lt;/del&gt;&lt;/a&gt;.diff.&lt;/p&gt;</comment>
                    <comment id="29766" author="dnolen" created="Mon, 22 Oct 2012 18:06:32 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3b32345966a65f66e49563a3a40a2877d0435c5d&quot;&gt;http://github.com/clojure/clojurescript/commit/3b32345966a65f66e49563a3a40a2877d0435c5d&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11596" name="CLJS-400.diff" size="2585" author="cemerick" created="Mon, 22 Oct 2012 14:03: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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-321] Support with-out-str</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-321</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Attached patch implements with-out-str macro in terms of goog.string.StringBuffer and &lt;b&gt;print-fn&lt;/b&gt; via .append&lt;/p&gt;

&lt;p&gt;The attached patch also fixes &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-319&quot; title=&quot;missing spaces when printing the same thing more than once&quot;&gt;&lt;del&gt;CLJS-319&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15544">CLJS-321</key>
            <summary>Support with-out-str</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="ohpauleez">Paul deGrandis</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 18 Jun 2012 03:15:53 -0500</created>
                <updated>Mon, 22 Oct 2012 18:06:13 -0500</updated>
                    <resolved>Mon, 22 Oct 2012 18:06:13 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28857" author="dnolen" created="Mon, 18 Jun 2012 08:44:33 -0500"  >&lt;p&gt;Patch looks mostly OK. Did you do any basic benchmarking? It would be nice to know that this doesn&apos;t slow down printing of Clojure objects.&lt;/p&gt;</comment>
                    <comment id="28869" author="bbloom" created="Mon, 18 Jun 2012 17:03:49 -0500"  >&lt;p&gt;Yes, I ran this:&lt;/p&gt;

&lt;p&gt;(time (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;i 5000&amp;#93;&lt;/span&gt; (prn-str {:foo &lt;span class=&quot;error&quot;&gt;&amp;#91;1 &amp;quot;two&amp;quot; &amp;#39;three&amp;#93;&lt;/span&gt;}))&lt;/p&gt;

&lt;p&gt;before patch: 29988 msecs&lt;br/&gt;
after patch:  28751 msecs&lt;/p&gt;

&lt;p&gt;Effectively identical.&lt;/p&gt;</comment>
                    <comment id="28873" author="dnolen" created="Mon, 18 Jun 2012 20:56:29 -0500"  >&lt;p&gt;on V8? JSC? SM?&lt;/p&gt;</comment>
                    <comment id="28877" author="bbloom" created="Tue, 19 Jun 2012 00:35:25 -0500"  >&lt;p&gt;I had run it in a browser repl, but I forget which. I added a benchmark and re-ran it in all three. It was a tiny bit slower, so I went to investigate and discovered that I haven&apos;t the slightest clue how to predict or interpret Javascript engine performance numbers. Hell, Chrome&apos;s console seems to have completely random performance, where as the Node.js repl seems to be more consistent. I&apos;ll get my shit together and see if I can fix this up. Hopefully will have time to look at it tomorrow.&lt;/p&gt;</comment>
                    <comment id="28878" author="laczoka" created="Tue, 19 Jun 2012 03:54:22 -0500"  >&lt;p&gt;jsperf.com was a great help to me when prototyping PersistentVector&apos;s first CLJS implementation&lt;/p&gt;

&lt;p&gt;it&apos;s very-very handy and easy to use and keep updated if necessary&lt;/p&gt;

&lt;p&gt;e.g.&lt;br/&gt;
&lt;a href=&quot;http://jsperf.com/persistentvector-norecur-js/12&quot;&gt;http://jsperf.com/persistentvector-norecur-js/12&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29296" author="dnolen" created="Wed, 29 Aug 2012 20:42:40 -0500"  >&lt;p&gt;Thanks Brandon, let&apos;s hold off on this one until we can resolve &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-340&quot; title=&quot;improve pr-str performance&quot;&gt;&lt;del&gt;CLJS-340&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29761" author="ohpauleez" created="Mon, 22 Oct 2012 16:57:35 -0500"  >&lt;p&gt;I attached an updated patch (that I&apos;m using internally for a personal project) of just the with-out-str macro code.&lt;/p&gt;</comment>
                    <comment id="29762" author="dnolen" created="Mon, 22 Oct 2012 17:00:27 -0500"  >&lt;p&gt;Thanks Paul. Could we get a patch with tests included?&lt;/p&gt;</comment>
                    <comment id="29763" author="ohpauleez" created="Mon, 22 Oct 2012 17:02:02 -0500"  >&lt;p&gt;No problem - on it right now.&lt;/p&gt;</comment>
                    <comment id="29764" author="ohpauleez" created="Mon, 22 Oct 2012 17:18:44 -0500"  >&lt;p&gt;Updated with one additional piece I needed to bring over from my branch (:dynamic on &lt;b&gt;print-fn&lt;/b&gt;) and two tests: one using print and one using the raw &lt;b&gt;print-fn&lt;/b&gt;.&lt;/p&gt;</comment>
                    <comment id="29765" author="dnolen" created="Mon, 22 Oct 2012 18:06:13 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/eab6032e6ba22571e5c4f821707bf5de8075e757&quot;&gt;http://github.com/clojure/clojurescript/commit/eab6032e6ba22571e5c4f821707bf5de8075e757&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11601" name="cljs-321-with-out-str.diff" size="2571" author="ohpauleez" created="Mon, 22 Oct 2012 17:17:33 -0500" />
                    <attachment id="11600" name="cljs-321-with-out-str.diff" size="942" author="ohpauleez" created="Mon, 22 Oct 2012 16:55:57 -0500" />
                    <attachment id="11333" name="with-out-str.patch" size="5552" author="bbloom" created="Mon, 18 Jun 2012 03:15:53 -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-398] new macro cljs.core/extend-instance</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-398</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Patch introduces an extend-instance macro, similar to extend-type.&lt;br/&gt;
It doesn&apos;t extend the .prototype property, but assigns the prototype impl members to the instance itself.&lt;/p&gt;

&lt;p&gt;This is useful to let existing instances, e.g. parsed JSON directly implement a protocol.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15759">CLJS-398</key>
            <summary>new macro cljs.core/extend-instance</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                    </labels>
                <created>Fri, 19 Oct 2012 01:05:55 -0500</created>
                <updated>Fri, 19 Oct 2012 19:51:02 -0500</updated>
                    <resolved>Fri, 19 Oct 2012 18:10:04 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29702" author="dnolen" created="Fri, 19 Oct 2012 17:13:15 -0500"  >&lt;p&gt;Rich Hickey already had a good name for an operation like this - specify.&lt;/p&gt;</comment>
                    <comment id="29708" author="bendlas" created="Fri, 19 Oct 2012 18:10:04 -0500"  >&lt;p&gt;OK, I&apos;ve declined the ticket, since not only the name but also the patches should be disregarded.&lt;/p&gt;

&lt;p&gt;The problem with above impl is that the generated implementing fns get instantiated, every time extend-instance is evaluated. That is not acceptable on a per-instance basis.&lt;/p&gt;

&lt;p&gt;I will work on a new macro called specify, which allows passing implementing fns.&lt;/p&gt;

&lt;p&gt;Is a syntax similar to clojure.core/extend right for specify?&lt;br/&gt;
Should I create a new ticket?&lt;/p&gt;</comment>
                    <comment id="29718" author="dnolen" created="Fri, 19 Oct 2012 19:51:02 -0500"  >&lt;p&gt;As far as I understand it the interface for specify should be the same as extend-type.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11574" name="0001-new-macro-clojure.core-extend-instance-can-be-used-t.patch" size="1975" author="bendlas" created="Fri, 19 Oct 2012 01:05:55 -0500" />
                    <attachment id="11575" name="0001-Test-for-extend-instance.patch" size="759" author="bendlas" created="Fri, 19 Oct 2012 01:05: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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-393] sebseq and sorted-set-by</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-393</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;ClojureScript:cljs.user&amp;gt;  (subseq (sorted-set-by &amp;lt;= 1 2 3 4 5) &amp;gt;= 2 &amp;lt;= 4)&lt;br/&gt;
&quot;Error evaluating:&quot; (subseq (sorted-set-by &amp;lt;= 1 2 3 4 5) &amp;gt;= 2 &amp;lt;= 4) :as &quot;cljs.core.subseq.call(null,cljs.core.sorted_set_by.call(null,cljs.core.&lt;em&gt;LT&lt;/em&gt;&lt;em&gt;EQ&lt;/em&gt;,1,2,3,4,5),cljs.core.&lt;em&gt;GT&lt;/em&gt;&lt;em&gt;EQ&lt;/em&gt;,2,cljs.core.&lt;em&gt;LT&lt;/em&gt;&lt;em&gt;EQ&lt;/em&gt;,4);\n&quot;&lt;br/&gt;
org.mozilla.javascript.JavaScriptException: Error: No protocol method IMapEntry.-key defined for type null:  (cljs/core.cljs#211)&lt;br/&gt;
        at cljs/core.cljs:211 (anonymous)&lt;br/&gt;
        at cljs/core.cljs:203 (_key)&lt;br/&gt;
        at cljs/core.cljs:5535 (key)&lt;br/&gt;
        at cljs/core.cljs:2479 (anonymous)&lt;br/&gt;
        at cljs/core.cljs:1791 (lazy_seq_value)&lt;br/&gt;
        at cljs/core.cljs:1840 (anonymous)&lt;br/&gt;
        at cljs/core.cljs:238 (_seq)&lt;br/&gt;
        at cljs/core.cljs:343 (seq)&lt;br/&gt;
        at cljs/core.cljs:817 (anonymous)&lt;br/&gt;
        at cljs/core.cljs:854 (anonymous)&lt;br/&gt;
        at cljs/core.cljs:857 (anonymous)&lt;br/&gt;
        at cljs/core.cljs:868 (anonymous)&lt;br/&gt;
        at cljs/core.cljs:5925 (anonymous)&lt;br/&gt;
        at cljs/core.cljs:5937 (anonymous)&lt;br/&gt;
        at &amp;lt;cljs repl&amp;gt;:1 (anonymous)&lt;br/&gt;
        at &amp;lt;cljs repl&amp;gt;:1&lt;/p&gt;</description>
                <environment></environment>
            <key id="15751">CLJS-393</key>
            <summary>sebseq and sorted-set-by</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="ejlo">Erik Ouchterlony</reporter>
                        <labels>
                        <label>bug</label>
                    </labels>
                <created>Sat, 13 Oct 2012 04:41:12 -0500</created>
                <updated>Thu, 18 Oct 2012 17:44:31 -0500</updated>
                    <resolved>Thu, 18 Oct 2012 17:44:31 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29677" author="ejlo" created="Wed, 17 Oct 2012 17:23:36 -0500"  >&lt;p&gt;I&apos;ve done some further analysis on this problem and found three different issues:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;The sorted-set-by in cljs doesn&apos;t support ordinary boolean operators, only comparison functions with values -1,0,1.&lt;/li&gt;
	&lt;li&gt;Bug in PersistentTreeSet lookup. Resolved in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-394&quot;&gt;CLJS-394&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Bug in PersistentTreeMap -sorted-seq-from. I have attached a patch that seems to resolve the issue.&lt;/li&gt;
&lt;/ol&gt;
</comment>
                    <comment id="29678" author="dnolen" created="Wed, 17 Oct 2012 21:25:17 -0500"  >&lt;p&gt;So does the patch address both 1 &amp;amp; 3 or only 3?&lt;/p&gt;</comment>
                    <comment id="29679" author="ejlo" created="Thu, 18 Oct 2012 02:48:41 -0500"  >&lt;p&gt;Only 3.&lt;/p&gt;</comment>
                    <comment id="29680" author="ejlo" created="Thu, 18 Oct 2012 06:04:19 -0500"  >&lt;p&gt;Here is a patch for the third issue. &lt;/p&gt;</comment>
                    <comment id="29681" author="ejlo" created="Thu, 18 Oct 2012 16:21:38 -0500"  >&lt;p&gt;I found a small bug in the last patch, so I attached a new one. This patch handles both the remaining issues.&lt;/p&gt;</comment>
                    <comment id="29682" author="dnolen" created="Thu, 18 Oct 2012 17:44:31 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/e3ed0e7b69f9522e8759d0a6567afabb2a98d949&quot;&gt;http://github.com/clojure/clojurescript/commit/e3ed0e7b69f9522e8759d0a6567afabb2a98d949&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11570" name="bugfix-PersistentTreeMap.diff" size="3612" author="ejlo" created="Thu, 18 Oct 2012 16:21:38 -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-368] faster empty? for nil inputs</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-368</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;empty? always calls seq, which is unnecessary if input is nil. By explicitly checking for nil before calling seq, empty? perform up to 4 times faster (measured on v8) for nil inputs. Patch included.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15662">CLJS-368</key>
            <summary>faster empty? for nil inputs</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="wagjo">Jozef Wagner</reporter>
                        <labels>
                    </labels>
                <created>Sat, 1 Sep 2012 07:30:24 -0500</created>
                <updated>Wed, 17 Oct 2012 10:58:18 -0500</updated>
                    <resolved>Wed, 17 Oct 2012 10:58:18 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29569" author="semperos" created="Fri, 28 Sep 2012 22:48:19 -0500"  >&lt;p&gt;Tiny stylistic note, seen often in Clojure&apos;s libraries. Instead of using &lt;tt&gt;if&lt;/tt&gt; where the &quot;then&quot; is &lt;tt&gt;true&lt;/tt&gt;, you can just use &lt;tt&gt;or&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;(or (nil? coll)
    (not (seq coll))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29572" author="dnolen" created="Sat, 29 Sep 2012 12:36:14 -0500"  >&lt;p&gt;This patch does not apply using &quot;git am&quot;. Can you please adjust the patch to it has proper attribution and please add the ticket # to the commit message. Thanks!&lt;/p&gt;</comment>
                    <comment id="29664" author="edtsech" created="Tue, 16 Oct 2012 03:58:15 -0500"  >&lt;p&gt;Submitting the faster_empty_2.patch with ticket number since Jozef hasn&apos;t yet. Tests pass.&lt;/p&gt;</comment>
                    <comment id="29671" author="dnolen" created="Wed, 17 Oct 2012 10:58:18 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/69897cf1a4e1ee051bf1bde98318d3aab5434602&quot;&gt;http://github.com/clojure/clojurescript/commit/69897cf1a4e1ee051bf1bde98318d3aab5434602&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11564" name="faster_empty_2.patch" size="841" author="edtsech" created="Tue, 16 Oct 2012 03:58:15 -0500" />
                    <attachment id="11466" name="faster-empty.patch" size="528" author="wagjo" created="Sat, 1 Sep 2012 07:30:24 -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-387] Add docstring from def and ns definitions to @namespaces metadata map, and make reflect functions make use of that</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-387</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The docstrings were parsed from the definitions-forms for def and ns, but not added to the @namespaces metadata map.&lt;br/&gt;
There is no :doc entry used in the ns&apos; metadata in the @namespaces.&lt;br/&gt;
No ns&apos;s :doc info is communicated to the browser in the reflect functions with reflect/doc.&lt;br/&gt;
Patch-file is attached with code-changes that add the :doc info for ns and def to the @namespaces, and enhances the reflect functions to communicate that info to the browser in the reflect/doc call.&lt;/p&gt;</description>
                <environment>clojure/clojurescript &amp;quot;0.0-1450&amp;quot;</environment>
            <key id="15734">CLJS-387</key>
            <summary>Add docstring from def and ns definitions to @namespaces metadata map, and make reflect functions make use of that</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="franks">Frank Siebenlist</reporter>
                        <labels>
                        <label>docs</label>
                        <label>enhancement</label>
                        <label>patch,</label>
                        <label>reflection</label>
                    </labels>
                <created>Sun, 7 Oct 2012 16:26:43 -0500</created>
                <updated>Wed, 17 Oct 2012 10:57:56 -0500</updated>
                    <resolved>Wed, 17 Oct 2012 10:57:56 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29659" author="dnolen" created="Mon, 15 Oct 2012 23:06:46 -0500"  >&lt;p&gt;This patch no longer applies, mind updating it?&lt;/p&gt;</comment>
                    <comment id="29661" author="franks" created="Tue, 16 Oct 2012 00:10:17 -0500"  >&lt;p&gt;This patch should apply to master version on Mon, 15 Oct 2012 22:03:19 -0700 (4defcbcf19112b9be6a4a27b5d8855552bf94948)&lt;/p&gt;</comment>
                    <comment id="29670" author="dnolen" created="Wed, 17 Oct 2012 10:57:56 -0500"  >&lt;p&gt;Excellent, fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/bef56a74f2eeecabfe0c0a28d89b455dce576ea3&quot;&gt;http://github.com/clojure/clojurescript/commit/bef56a74f2eeecabfe0c0a28d89b455dce576ea3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please at the ticket # to the commit message though, thanks! &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="11563" name="add-ns-def-doc-patch.diff" size="1934" author="franks" created="Tue, 16 Oct 2012 00:10:17 -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-369] gensyms break re-analyze; prevents variable shadowing analysis</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-369</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;From my email discussion with dnolon before making this patch:&lt;/p&gt;

&lt;p&gt;The current analyzer does some trickery to prepare for emitting to JavaScript. Among this trickery is gensyms for locals (including &quot;this&quot;), the new $ prefix on some namespaces, uniqify on parameters, and more. This must be mildly annoying for people writing alternate compiler backends, but for the most part non-blocking because &lt;b&gt;fewer&lt;/b&gt; symbol collisions should never be an additional problem for a target language with different symbol resolution rules. &lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;snip lots more text&amp;#93;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Consider what an ANF transform would look like for the :let 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;(defmethod anf :let
  [{:keys [env bindings statements ret form] :as ast}]
  (let [bindings (mapcat (fn [{:keys [sym init] :as binding}]
                           [name (anf init)])
                         bindings)
        body-env (-&amp;gt; bindings last :env)]
    (ana/analyze env `(~(first form) [~@(map :form bindings)]
                          ~@(anf-block (assoc ast :env body-env))))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Simple enough, right? This walks each binding, ANF transforms the init expression, gets the environment in which to analyze the body, and then analyzes a new let (or loop) statement with the modified bindings.&lt;/p&gt;

&lt;p&gt;Unfortunately, this doesn&apos;t work. When the ana/analyze call happens, body-env contains gensymed locals. The result is that body-env is invalidated by the outer analyze call, which is re-generating the symbols for the local variables. If you take the gensyms out of analyze-let, then analyze becomes pure (modulo def forms) and this code magically becomes correct. I&apos;ve run into this same problem anywhere gensyms are used in analyze.&lt;/p&gt;



&lt;p&gt;Commit message on the patch:&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;AST Changes
    
    * Anywhere a binding was introduced &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; a local used to be a symbol,
      now it is a map with a :name key and potentially a :shadow key.
    
    * Bindings vectors are no longer alternating symbols, then init maps.
      Instead, the are a vector of maps of the shape described &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; locals
      plus an :init key.
    
    * The :gthis key &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; functions has been replaced with :type, which
      is the symbol describing the type name of the enclosing deftype form.
    
    * recur frames now expose :params as binding maps, instead of :names
    
    Benefits:
    
    * Shadowed variables are now visible to downstream AST transforms.
    
    * :tag, :mutable, and other metadata are now uniform across ops
    
    * Eliminates usages of gensym inside the analyzer, which was a source
      of state that made the analyzer impossible to use &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; some
      transformations of let, letfn, etc which require re-analyzing forms.
    
    * Removes JavaScript shadowing semantics from the analyze phase.&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15664">CLJS-369</key>
            <summary>gensyms break re-analyze; prevents variable shadowing analysis</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Sat, 1 Sep 2012 19:14:31 -0500</created>
                <updated>Wed, 17 Oct 2012 10:53:50 -0500</updated>
                    <resolved>Mon, 15 Oct 2012 23:02:04 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29339" author="dnolen" created="Mon, 3 Sep 2012 13:13:19 -0500"  >&lt;p&gt;Can we please get the ticket number in the first line of the patch? If you look at the ClojureScript commit history you can see the convention that&apos;s been adopted. Thanks!&lt;/p&gt;</comment>
                    <comment id="29340" author="bbloom" created="Mon, 3 Sep 2012 14:02:11 -0500"  >&lt;p&gt;Reworded commit message to meet new convention.&lt;/p&gt;</comment>
                    <comment id="29563" author="dnolen" created="Fri, 28 Sep 2012 17:55:25 -0500"  >&lt;p&gt;Can we put the shadow patch in another ticket with the patch referencing the new ticket #. Thanks!&lt;/p&gt;</comment>
                    <comment id="29564" author="bbloom" created="Fri, 28 Sep 2012 18:11:14 -0500"  >&lt;p&gt;Not sure what good a separate ticket would do. How about this new title?&lt;/p&gt;</comment>
                    <comment id="29573" author="dnolen" created="Sat, 29 Sep 2012 12:39:59 -0500"  >&lt;p&gt;They are separate patches. One is a enhancement to the compiler. The other one is an enhancement to my simplistic shadowing solution using the improvements to the compiler in the other enhancement. Thanks!&lt;/p&gt;</comment>
                    <comment id="29582" author="bbloom" created="Sun, 30 Sep 2012 12:34:53 -0500"  >&lt;p&gt;Are you talking about the namespace shadowing? This patch affects &lt;b&gt;all variable shadowing&lt;/b&gt;. For example, (fn &lt;span class=&quot;error&quot;&gt;&amp;#91;x x&amp;#93;&lt;/span&gt; x) will produce `function (x x__$1) { return x__$1; }` instead of `function (x_&lt;em&gt;G12 x&lt;/em&gt;_G13) { return x__G13; }` or something like that.&lt;/p&gt;

&lt;p&gt;I&apos;m not sure how I can break this patch down into smaller pieces. All of the gensyms were there before to eliminate potential shadowing; the two issues are tightly related. If you eliminated all the gensyms, the compiler would work fine... unless you shadowed a variable (which several tests cover).&lt;/p&gt;

&lt;p&gt;Have you studied the patch? Can you suggest a concrete way to break it up into smaller patches? I&apos;m not sure it&apos;s worth the trouble.&lt;/p&gt;</comment>
                    <comment id="29589" author="dnolen" created="Wed, 3 Oct 2012 10:59:38 -0500"  >&lt;p&gt;Right sorry, makes sense now. I will review both patches more closely. Thanks again.&lt;/p&gt;</comment>
                    <comment id="29654" author="dnolen" created="Mon, 15 Oct 2012 22:43:24 -0500"  >&lt;p&gt;I&apos;ve finally found some time go through this patch. It&apos;s great but it no longer applies to master. If I get an updated patch I&apos;;; apply promptly. Thank you very much and sorry for the delay.&lt;/p&gt;</comment>
                    <comment id="29656" author="dnolen" created="Mon, 15 Oct 2012 23:01:50 -0500"  >&lt;p&gt;Went ahead and applied it, only needed a minor change. &lt;/p&gt;</comment>
                    <comment id="29657" author="dnolen" created="Mon, 15 Oct 2012 23:02:04 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/19afb31a52504293ba2182c584b1867917316662&quot;&gt;http://github.com/clojure/clojurescript/commit/19afb31a52504293ba2182c584b1867917316662&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29660" author="bbloom" created="Mon, 15 Oct 2012 23:45:14 -0500"  >&lt;p&gt;Awesome. Glad to see this applied.&lt;/p&gt;

&lt;p&gt;Off topic: I like to keep tabs on my open source contributions semi-automatically using the author information stored in git. Sadly, your minor change switched the author to you. If it&apos;s not too much to ask, could you please preserve the author info in the future? Either via a separate fixup commit, or by using the --author flag when editing commits. Thanks!&lt;/p&gt;</comment>
                    <comment id="29669" author="dnolen" created="Wed, 17 Oct 2012 10:53:50 -0500"  >&lt;p&gt;Brandon, yep of course! I didn&apos;t know about the --author flag otherwise I would have used it. Thanks again.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11471" name="CLJS-369-v2.patch" size="19887" author="bbloom" created="Mon, 3 Sep 2012 14:02:11 -0500" />
                    <attachment id="11469" name="shadowing.patch" size="19861" author="bbloom" created="Sat, 1 Sep 2012 19:40: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-383] Empty variadic argument initialised with (nil)  when using arity overloading</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-383</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Empty variadic argument (&amp;amp; rest) is incorrectly initialised with (nil), when variadic arguments are used together with overloading.&lt;br/&gt;
See following example:&lt;/p&gt;

&lt;p&gt;	(defn foo&lt;br/&gt;
	  &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;amp; TEST&amp;#93;&lt;/span&gt;&lt;br/&gt;
	  TEST)&lt;/p&gt;

&lt;p&gt;	(foo)&lt;br/&gt;
	=&amp;gt; nil          ;; correct&lt;/p&gt;

&lt;p&gt;	(foo 1 2)&lt;br/&gt;
	=&amp;gt; (1 2)        ;; correct&lt;/p&gt;

&lt;p&gt;	(defn bar&lt;br/&gt;
	  ([]&lt;br/&gt;
	     :empty)&lt;br/&gt;
	  (&lt;span class=&quot;error&quot;&gt;&amp;#91;A &amp;amp; B&amp;#93;&lt;/span&gt;&lt;br/&gt;
	     B))&lt;/p&gt;

&lt;p&gt;	(bar)&lt;br/&gt;
	=&amp;gt; :empty       ;; correct&lt;/p&gt;

&lt;p&gt;	(bar 1 2)&lt;br/&gt;
	=&amp;gt; (2)          ;; correct&lt;/p&gt;

&lt;p&gt;	(bar 1)&lt;br/&gt;
	=&amp;gt; (nil)        ;; error - should be nil&lt;/p&gt;
</description>
                <environment>Fresh CLJS checkout from github</environment>
            <key id="15716">CLJS-383</key>
            <summary>Empty variadic argument initialised with (nil)  when using arity overloading</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="skardan">Daniel Skarda</reporter>
                        <labels>
                    </labels>
                <created>Sun, 23 Sep 2012 08:34:00 -0500</created>
                <updated>Wed, 17 Oct 2012 10:48:12 -0500</updated>
                    <resolved>Mon, 15 Oct 2012 22:51:22 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29570" author="skardan" created="Sat, 29 Sep 2012 08:32:52 -0500"  >&lt;p&gt;I prepared a patch for this issue. &lt;/p&gt;

&lt;p&gt;See fix and tests in &lt;a href=&quot;https://github.com/orfelyus/clojurescript/commit/16373968e8d0a5069dc4b43827d2d4b37e14d152&quot;&gt;https://github.com/orfelyus/clojurescript/commit/16373968e8d0a5069dc4b43827d2d4b37e14d152&lt;/a&gt;&lt;/p&gt;
</comment>
                    <comment id="29571" author="dnolen" created="Sat, 29 Sep 2012 12:25:33 -0500"  >&lt;p&gt;Excellent can you attach the patch here? Thanks!&lt;/p&gt;</comment>
                    <comment id="29579" author="skardan" created="Sun, 30 Sep 2012 03:12:58 -0500"  >&lt;p&gt;See &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-383&quot; title=&quot;Empty variadic argument initialised with (nil)  when using arity overloading&quot;&gt;&lt;del&gt;CLJS-383&lt;/del&gt;&lt;/a&gt;.patch&lt;/p&gt;</comment>
                    <comment id="29585" author="gfredericks" created="Tue, 2 Oct 2012 22:55:59 -0500"  >&lt;p&gt;I stumbled on this independently and noticed the related fact that (array-seq (array 1) 1) returns a non-nil IndexedSeq (which will return itself if passed to cljs.core/seq, and will present itself as length 0 or length 1 depending on how exactly you ask). I wasn&apos;t sure if this was a bug or not. If array-seq is not considered a public method then it&apos;s probably fine, but otherwise it&apos;s obviously bad.&lt;/p&gt;

&lt;p&gt;Incidentally, this bug manifested itself to me not as a non-nil return value but as the wrong arity of another function being called.&lt;/p&gt;</comment>
                    <comment id="29586" author="skardan" created="Wed, 3 Oct 2012 06:56:33 -0500"  >&lt;p&gt;Thanks! You are right! &lt;/p&gt;

&lt;p&gt;    (defn bar&lt;br/&gt;
      ([] :empty)&lt;br/&gt;
      (&lt;span class=&quot;error&quot;&gt;&amp;#91;A &amp;amp; B&amp;#93;&lt;/span&gt; B))&lt;/p&gt;

&lt;p&gt;Compiled into&lt;/p&gt;

&lt;p&gt;    function (A, var_args) {&lt;br/&gt;
        var B = var_args;&lt;br/&gt;
        switch (arguments.length) {
          case 0:
            return bar__0.call(this);
          default:
            return bar__2.cljs$lang$arity$variadic(A, cljs.core.array_seq(arguments, 1));
        }&lt;br/&gt;
        throw (&quot;Invalid arity: &quot; + arguments.length);&lt;br/&gt;
    }&lt;/p&gt;

&lt;p&gt;Compared to variant without arity overloading, there was missing isDef and call to slice.&lt;br/&gt;
But I missed original problem, which was:&lt;/p&gt;

&lt;p&gt;   (array-seq (js* &quot;&lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt;&quot;) 1)&lt;/p&gt;

&lt;p&gt;evaluates to (nil). Call to array-seq translates to prim-seq translates to IndexedSeq. I digged deeper and found two potential issues:&lt;/p&gt;

&lt;p&gt;1) Call to first without check for i and length&lt;/p&gt;

&lt;p&gt;    (deftype IndexedSeq &lt;span class=&quot;error&quot;&gt;&amp;#91;a i&amp;#93;&lt;/span&gt;&lt;br/&gt;
       ....&lt;br/&gt;
      ISeq&lt;br/&gt;
      (-first &lt;span class=&quot;error&quot;&gt;&amp;#91;_&amp;#93;&lt;/span&gt; (aget a i))&lt;/p&gt;

&lt;p&gt;ie. if i == a.length () then first on such sequence returns undefined (instead of nil). Which might cause other issues.&lt;/p&gt;

&lt;p&gt;2) seq:&lt;/p&gt;

&lt;p&gt;    (defn ^seq seq&lt;br/&gt;
      &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;
        (if (satisfies? ASeq coll)&lt;br/&gt;
          coll&lt;br/&gt;
          (-seq coll))))&lt;/p&gt;

&lt;p&gt;IndexedSeq is not nil and (-seq IndexedSeq) returns itself.&lt;br/&gt;
So we have a sequence, which is empty, but it is not nil. I think it can cause zillions of issues.&lt;/p&gt;

&lt;p&gt;@svannodette: I think we can forget my original patch &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; The correct solution is to fix prim-seq directly, not its effects on other parts of clojurescript (variadic functions)&lt;/p&gt;

&lt;p&gt;prim-seq is &lt;/p&gt;

&lt;p&gt;    (defn prim-seq&lt;br/&gt;
      (&lt;span class=&quot;error&quot;&gt;&amp;#91;prim&amp;#93;&lt;/span&gt;&lt;br/&gt;
         (prim-seq prim 0))&lt;br/&gt;
      (&lt;span class=&quot;error&quot;&gt;&amp;#91;prim i&amp;#93;&lt;/span&gt;&lt;br/&gt;
         (when-not (zero? (alength prim))&lt;br/&gt;
           (IndexedSeq. prim i))))&lt;/p&gt;

&lt;p&gt;while it should be&lt;/p&gt;

&lt;p&gt;    (defn prim-seq&lt;br/&gt;
      (&lt;span class=&quot;error&quot;&gt;&amp;#91;prim&amp;#93;&lt;/span&gt;&lt;br/&gt;
         (prim-seq prim 0))&lt;br/&gt;
      (&lt;span class=&quot;error&quot;&gt;&amp;#91;prim i&amp;#93;&lt;/span&gt;&lt;br/&gt;
         (when (&amp;lt; i (alength prim))&lt;br/&gt;
           (IndexedSeq. prim i))))&lt;/p&gt;


&lt;p&gt;In addition, we could avoid call to slice and have variadic functions calls a little little bit faster &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;br/&gt;
What do you think? I will prepare a patch tomorrow. &lt;/p&gt;</comment>
                    <comment id="29588" author="dnolen" created="Wed, 3 Oct 2012 10:57:35 -0500"  >&lt;p&gt;One first glance yes this sounds good.&lt;/p&gt;</comment>
                    <comment id="29610" author="gfredericks" created="Fri, 5 Oct 2012 19:07:23 -0500"  >&lt;p&gt;Submitting a patch since Skarda hasn&apos;t yet. The fix is the same as his second suggestion, and three tests are provided.&lt;/p&gt;

&lt;p&gt;I&apos;ve only tested this with V8 since that&apos;s all I could get installed. Disturbingly, the tests crash in advanced mode only as provided, but if I take the second of the three tests and repeat it after them (ABCB), then everything passes. I&apos;m hoping it&apos;s some crazy quirk of my installation.&lt;/p&gt;</comment>
                    <comment id="29655" author="dnolen" created="Mon, 15 Oct 2012 22:51:22 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/62aca8f7a03c0d3cfad4e48665832b2b0e520680&quot;&gt;http://github.com/clojure/clojurescript/commit/62aca8f7a03c0d3cfad4e48665832b2b0e520680&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29662" author="tomoj" created="Tue, 16 Oct 2012 01:32:09 -0500"  >&lt;p&gt;Was the mysterious test failure solved?&lt;/p&gt;</comment>
                    <comment id="29667" author="dnolen" created="Wed, 17 Oct 2012 10:48:12 -0500"  >&lt;p&gt;I never encountered it.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11541" name="CLJS-383-gfredericks.patch" size="1577" author="gfredericks" created="Fri, 5 Oct 2012 19:07:23 -0500" />
                    <attachment id="11533" name="CLJS-383.patch" size="1639" author="skardan" created="Sun, 30 Sep 2012 03:12:26 -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-390] analyzer tries to descend on macro files</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-390</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Macro deps are added to the set of deps to be analyzed. Normally this would be harmless, since if a corresponding cljs file isn&apos;t found, analyze-deps just skips it. But consider the following case:&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
  (:require-macros [foo.bar :as b]))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In this case the analyzer overflows the stack, recursively trying to analyze foo/bar.cljs over and over. The attached patch (exclude-macro-files-from-analysis.patch, 8 Oct 2012) seems to fix this. I am not sure whether it causes any new problems.&lt;/p&gt;</description>
                <environment>master (6da149d8)</environment>
            <key id="15738">CLJS-390</key>
            <summary>analyzer tries to descend on macro files</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tomoj">Tom Jack</reporter>
                        <labels>
                    </labels>
                <created>Mon, 8 Oct 2012 14:15:18 -0500</created>
                <updated>Mon, 15 Oct 2012 23:05:25 -0500</updated>
                    <resolved>Mon, 15 Oct 2012 23:05:25 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29658" author="dnolen" created="Mon, 15 Oct 2012 23:05:25 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/4defcbcf19112b9be6a4a27b5d8855552bf94948&quot;&gt;http://github.com/clojure/clojurescript/commit/4defcbcf19112b9be6a4a27b5d8855552bf94948&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11544" name="exclude-macro-files-from-analysis.patch" size="1214" author="tomoj" created="Mon, 8 Oct 2012 14:15:18 -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="10009">Fixed</customfieldvalue>

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

<item>
            <title>[CLJS-388] expose :output-wrapper compile option</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-388</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15735">CLJS-388</key>
            <summary>expose :output-wrapper compile option</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 7 Oct 2012 17:55:21 -0500</created>
                <updated>Mon, 15 Oct 2012 22:26:57 -0500</updated>
                    <resolved>Mon, 15 Oct 2012 22:26:57 -0500</resolved>
                                                                    <due></due>
                    <votes>2</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29613" author="daniel@rimspace.net" created="Sun, 7 Oct 2012 19:15:19 -0500"  >&lt;p&gt;I went looking for exactly this feature two days ago, as part of investigating ClojureScript as part of the &quot;component model&quot; for our single page application.  It uses the &quot;Asynchronous Module Definition&quot; pattern to isolate code, as defined here: &lt;a href=&quot;https://github.com/amdjs/amdjs-api/wiki/AMD&quot;&gt;https://github.com/amdjs/amdjs-api/wiki/AMD&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While it probably isn&apos;t the only headache, being able to easily produce an appropriate function definition around the ClojureScript code would make it much easier to get started here.&lt;/p&gt;</comment>
                    <comment id="29653" author="dnolen" created="Mon, 15 Oct 2012 22:26:57 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/e83cf518ef4d3d6aa9a1cca18dc889efb0eae57f&quot;&gt;http://github.com/clojure/clojurescript/commit/e83cf518ef4d3d6aa9a1cca18dc889efb0eae57f&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-394] PersistentTreeSet lookup bug</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-394</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The lookup function in PersistentTreeSet behaves differently in clojurescript than in clojure when a custom comparison function is used. If two elements are evaluated as equal, one of then is in the set and we do a lookup on the other, clojure returns the element in the set, whereas clojurescript returns the lookup element.  &lt;/p&gt;

&lt;p&gt;(let [compare-quot-2 #(compare (quot %1 2) (quot %2 2))&lt;br/&gt;
      s (sorted-set-by compare-quot-2 1)]&lt;br/&gt;
  (get s 0))&lt;/p&gt;

&lt;p&gt;Should return: 1&lt;br/&gt;
Returns: 0&lt;/p&gt;</description>
                <environment></environment>
            <key id="15754">CLJS-394</key>
            <summary>PersistentTreeSet lookup bug</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="ejlo">Erik Ouchterlony</reporter>
                        <labels>
                        <label>bug</label>
                        <label>patch</label>
                    </labels>
                <created>Mon, 15 Oct 2012 07:29:52 -0500</created>
                <updated>Mon, 15 Oct 2012 22:02:51 -0500</updated>
                    <resolved>Mon, 15 Oct 2012 22:02:51 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29652" author="dnolen" created="Mon, 15 Oct 2012 22:02:51 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/409fcc9a824668207953b2bc47d40aaab85191d3&quot;&gt;http://github.com/clojure/clojurescript/commit/409fcc9a824668207953b2bc47d40aaab85191d3&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11561" name="bugfix-PersistentTreeSet-lookup.diff" size="2119" author="ejlo" created="Mon, 15 Oct 2012 07:29: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>
                                            <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-389] Compiler emits throw string</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-389</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;&lt;a href=&quot;http://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L468&quot;&gt;http://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L468&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15736">CLJS-389</key>
            <summary>Compiler emits throw string</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 7 Oct 2012 18:10:39 -0500</created>
                <updated>Mon, 15 Oct 2012 21:59:57 -0500</updated>
                    <resolved>Mon, 15 Oct 2012 21:59:57 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29651" author="dnolen" created="Mon, 15 Oct 2012 21:59:57 -0500"  >&lt;p&gt;fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/ddcb192be4c34a548cf669625fd6d1a5bf81aa9f&quot;&gt;http://github.com/clojure/clojurescript/commit/ddcb192be4c34a548cf669625fd6d1a5bf81aa9f&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-371] deprecation warning for IPrintable</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-371</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Now that &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-340&quot; title=&quot;improve pr-str performance&quot;&gt;&lt;del&gt;CLJS-340&lt;/del&gt;&lt;/a&gt; has landed, we need a deprecation warning for IPrintable / -pr-seq&lt;/p&gt;</description>
                <environment></environment>
            <key id="15675">CLJS-371</key>
            <summary>deprecation warning for IPrintable</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Tue, 4 Sep 2012 21:40:40 -0500</created>
                <updated>Fri, 12 Oct 2012 11:58:37 -0500</updated>
                    <resolved>Fri, 12 Oct 2012 11:58:37 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29636" author="netguy204" created="Thu, 11 Oct 2012 19:12:02 -0500"  >&lt;p&gt;I&apos;m starting work on this.&lt;/p&gt;</comment>
                    <comment id="29637" author="netguy204" created="Thu, 11 Oct 2012 20:46:06 -0500"  >&lt;p&gt;Introduces deprecation warnings.&lt;/p&gt;

&lt;p&gt;Functions tagged with ^:deprecated metadata will cause the compiler to print a warning when they are invoked.&lt;/p&gt;

&lt;p&gt;Protocols tagged with ^:deprecated will cause the compiler to print a warning when they are extended.&lt;/p&gt;

&lt;p&gt;Either of these warnings can be suppressed by binding &lt;b&gt;cljs-warn-fn-deprecated&lt;/b&gt; and/or &lt;b&gt;cljs-warn-protocol-deprecated&lt;/b&gt; to false or by attaching ^:deprecation-nowarn metadata to the form/protocol in question at the use site.&lt;/p&gt;</comment>
                    <comment id="29640" author="dnolen" created="Fri, 12 Oct 2012 11:58:37 -0500"  >&lt;p&gt;fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3ea593825f60c228f6a384be52bcf2fc4e417567&quot;&gt;http://github.com/clojure/clojurescript/commit/3ea593825f60c228f6a384be52bcf2fc4e417567&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11552" name="0001-compiler-warns-on-deprecated-function-and-protocol-u.patch" size="17224" author="netguy204" created="Thu, 11 Oct 2012 20:46: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-391] IndexedSeq, RSeq, ChunkedCons, and PersistentTreeMapSeq do not satisfy IEmptyableCollection</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-391</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Attached patch (add-some-missing-IEmptyableCollection-impls.patch, 8 Oct 2012) fixes this. I checked that each of the corresponding types in Clojure is emptyable.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15739">CLJS-391</key>
            <summary>IndexedSeq, RSeq, ChunkedCons, and PersistentTreeMapSeq do not satisfy IEmptyableCollection</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tomoj">Tom Jack</reporter>
                        <labels>
                    </labels>
                <created>Mon, 8 Oct 2012 15:53:26 -0500</created>
                <updated>Tue, 9 Oct 2012 17:49:17 -0500</updated>
                    <resolved>Tue, 9 Oct 2012 17:49:17 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29616" author="tomoj" created="Mon, 8 Oct 2012 16:02:15 -0500"  >&lt;p&gt;Slight problem with the original patch &#8212; with-meta isn&apos;t defined when RSeq is defined, so it generated a warning. In this patch I use -with-meta instead for RSeq.&lt;/p&gt;</comment>
                    <comment id="29621" author="dnolen" created="Mon, 8 Oct 2012 21:31:00 -0500"  >&lt;p&gt;just declare with-meta. Thanks!&lt;/p&gt;</comment>
                    <comment id="29622" author="tomoj" created="Mon, 8 Oct 2012 21:41:43 -0500"  >&lt;p&gt;Ah, of course. New patch does that.&lt;/p&gt;</comment>
                    <comment id="29626" author="dnolen" created="Tue, 9 Oct 2012 17:49:17 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/b0a397f65c7e4faf1c6816d2b188c7b367029294&quot;&gt;http://github.com/clojure/clojurescript/commit/b0a397f65c7e4faf1c6816d2b188c7b367029294&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11547" name="add-some-missing-IEmptyableCollection-impls.patch" size="1695" author="tomoj" created="Mon, 8 Oct 2012 21:41:43 -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="10009">Fixed</customfieldvalue>

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

<item>
            <title>[CLJS-385] ClojureScript&apos;s hashbang for Node.js output is not universal</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-385</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Currently on `src/clj/cljs/closure.clj:859` - the shebang/hashbang for node-targeted compilation is `/usr/bin/nodejs`.&lt;/p&gt;

&lt;p&gt;This limits the potential reach.  Instead we could rely upon `env` which is more universal.&lt;br/&gt;
Additionally, the node binary is most commonly called `node`&lt;/p&gt;

&lt;p&gt;A patch is attached.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15726">CLJS-385</key>
            <summary>ClojureScript&apos;s hashbang for Node.js output is not universal</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="ohpauleez">Paul deGrandis</assignee>
                                <reporter username="ohpauleez">Paul deGrandis</reporter>
                        <labels>
                    </labels>
                <created>Fri, 28 Sep 2012 15:04:23 -0500</created>
                <updated>Tue, 9 Oct 2012 17:48:52 -0500</updated>
                    <resolved>Tue, 9 Oct 2012 17:48:52 -0500</resolved>
                                                                    <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29625" author="dnolen" created="Tue, 9 Oct 2012 17:48:52 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/9ff4de297eba2c6af3f319f302c2c9382312e6fc&quot;&gt;http://github.com/clojure/clojurescript/commit/9ff4de297eba2c6af3f319f302c2c9382312e6fc&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11529" name="hashbang-update.diff" size="715" author="ohpauleez" created="Fri, 28 Sep 2012 15:11:08 -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-148] No way to initialize Closure class without a namespace prefix</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-148</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;As far as I can tell, there is no way to initialize a Closure class without using a namespace prefix.&lt;br/&gt;
That&apos;s very confusing to me: I know &quot;MyClass&quot; is an object, and I expect ClojureScript to translate &quot;(MyClass. 0)&quot; to &quot;new MyClass(0);&quot;.&lt;/p&gt;

&lt;p&gt;This issue also raises the question of how to import constructors with the :use syntax.&lt;br/&gt;
I can import static methods from MyClass in the usual fashion, but there&apos;s no way to get the constructor.&lt;br/&gt;
Do we need to write :import for ClojureScript namespaces?&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-javascript&quot;&gt;goog.provide(&apos;MyClass&apos;);
/**
* @constructor
*/
MyClass = &lt;span class=&quot;code-keyword&quot;&gt;function&lt;/span&gt;(x){&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;.x = x;};
MyClass.static_method = &lt;span class=&quot;code-keyword&quot;&gt;function&lt;/span&gt;(){&lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; &quot;I&apos;m &lt;span class=&quot;code-keyword&quot;&gt;static&lt;/span&gt;!&quot;;};&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;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(ns custom
  (:require [MyClass :as X]
            [a.AnotherClass :as Y]))

(MyClass. 0) ;;Nope
(X. 0) ;;Nope
(X/&lt;span class=&quot;code-keyword&quot;&gt;static&lt;/span&gt;-method 1 2 3) ;;Okay

(a/AnotherClass. 0) ;;Okay
(Y. 0) ;;Nope&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15219">CLJS-148</key>
            <summary>No way to initialize Closure class without a namespace prefix</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="lynaghk">Kevin Lynagh</reporter>
                        <labels>
                    </labels>
                <created>Sat, 11 Feb 2012 11:05:19 -0600</created>
                <updated>Tue, 9 Oct 2012 16:38:43 -0500</updated>
                    <resolved>Tue, 9 Oct 2012 16:38:43 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27722" author="dnolen" created="Wed, 15 Feb 2012 11:03:34 -0600"  >&lt;p&gt;I&apos;m curious as to what the benefit is? Is this a problem because you working with an existing JavaScript library? Is this not handled by :foreign-libs?&lt;/p&gt;</comment>
                    <comment id="28255" author="lynaghk" created="Tue, 24 Apr 2012 13:08:52 -0500"  >&lt;p&gt;Sorry for the terribly late reply---I somehow missed notification of your comment.&lt;/p&gt;

&lt;p&gt;My understanding is that the :foreign-libs option is for libraries that don&apos;t use Google Closure&apos;s facilities.&lt;br/&gt;
This issue comes up for things even in the Closure library itself.&lt;br/&gt;
For instance:&lt;/p&gt;

&lt;p&gt;(ns test&lt;br/&gt;
  (:require &lt;span class=&quot;error&quot;&gt;&amp;#91;goog.History :as history&amp;#93;&lt;/span&gt;))&lt;/p&gt;

&lt;p&gt;(goog.History.) ;;=&amp;gt; goog.History object created&lt;br/&gt;
(history.) ;;=&amp;gt; TypeError: undefined is not a function&lt;/p&gt;

&lt;p&gt;The benefit is consistency: when I rename something in a require clause it&apos;s because I want to, well, rename it.&lt;br/&gt;
Right now you can rename namespaces, but not constructors, which is a nasty surprise.&lt;/p&gt;</comment>
                    <comment id="28256" author="dnolen" created="Tue, 24 Apr 2012 13:51:23 -0500"  >&lt;p&gt;:require isn&apos;t for renaming things in libraries. All you can do is alias the namespace. Am I missing something here?&lt;/p&gt;</comment>
                    <comment id="28260" author="lynaghk" created="Tue, 24 Apr 2012 14:08:21 -0500"  >&lt;p&gt;The real problem is that the namespace is conflated with the constructor.&lt;br/&gt;
It sounds like there&apos;s no way to rename the latter, so in the example above I always have to require the goog.History namespace and write &lt;/p&gt;

&lt;p&gt;(goog.History.)&lt;/p&gt;

&lt;p&gt;to construct the object.&lt;br/&gt;
It&apos;d be less surprising (to me) if the constructor had the same alias as the namespace, but that would come at the expense of muddying the cljs semantics to match JS.&lt;br/&gt;
Has anyone else tripped over this?&lt;/p&gt;
</comment>
                    <comment id="28271" author="dnolen" created="Wed, 25 Apr 2012 09:00:56 -0500"  >&lt;p&gt;It&apos;s somewhat unintuitive but I&apos;m not clear on how to improve the situation in a simple way.&lt;/p&gt;</comment>
                    <comment id="28827" author="tomoj" created="Sat, 16 Jun 2012 02:20:32 -0500"  >&lt;p&gt;Whoops, duplicated by &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;&lt;/p&gt;</comment>
                    <comment id="29624" author="dnolen" created="Tue, 9 Oct 2012 16:38:43 -0500"  >&lt;p&gt;was fixed with &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;&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-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-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-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-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-355] Targeting nodejs, compiling multiple files fail</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-355</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I talked about this one with Brandon Bloom in #clojure and he figured out the issue. He asked me to open this issue, but I am utterly unclear on what the actual problem is, so I&apos;m just going to provide the info he told me to provide along with what he said and hope for the best.&lt;/p&gt;

&lt;p&gt;The problem began when I added a second file to a little project I was doing, targeting nodejs. I started getting this:&lt;/p&gt;

&lt;p&gt;/Users/anthony/code/refh/refh.js:5478&lt;br/&gt;
    var c = a.cljs$lang$maxFixedArity;&lt;br/&gt;
             ^&lt;br/&gt;
TypeError: Cannot read property &apos;cljs$lang$maxFixedArity&apos; of null&lt;br/&gt;
    at cljs.core.apply.b (/Users/anthony/code/refh/refh.js:5478:14)&lt;br/&gt;
    at cljs.core.apply.a (/Users/anthony/code/refh/refh.js:5520:18)&lt;br/&gt;
    at Object.&amp;lt;anonymous&amp;gt; (/Users/anthony/code/refh/refh.js:12328: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;Brandon had me open up the output file and look at the line.&lt;/p&gt;

&lt;p&gt;cljs.core.apply.call(null, cljs.core.&lt;em&gt;STAR_main_cli_fn_STAR&lt;/em&gt;, cljs.core.drop.call(null, 2, cljs.nodejs.process.argv));&lt;/p&gt;

&lt;p&gt;The problem is that this code comes before the code that actually sets the &lt;b&gt;main-cli-fn&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;From IRC:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;17:28:59&amp;#93;&lt;/span&gt; &amp;lt;bbloom&amp;gt; oh DUH. i know the issue!&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;17:29:31&amp;#93;&lt;/span&gt; &amp;lt;bbloom&amp;gt; your file is being compiled&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;17:29:32&amp;#93;&lt;/span&gt; &amp;lt;bbloom&amp;gt; not run&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;17:29:45&amp;#93;&lt;/span&gt; &amp;lt;bbloom&amp;gt; then that&apos;s going into a big bag of namespaces&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;17:30:00&amp;#93;&lt;/span&gt; &amp;lt;bbloom&amp;gt; which are being compiled, not run&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;17:30:32&amp;#93;&lt;/span&gt; &amp;lt;bbloom&amp;gt; so it&apos;s not compile order, it&apos;s execution order&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;17:30:43&amp;#93;&lt;/span&gt; &amp;lt;bbloom&amp;gt; nodejscli is being executed before the code that sets the main fn&lt;/p&gt;

&lt;p&gt;I have a small branch on Github that should provide a reproducible case. It uses lein-cljsbuild with simple optimizations. Give &apos;lein cljsbuild once&apos; a shot. &lt;a href=&quot;https://github.com/Raynes/refh/tree/cljs&quot;&gt;https://github.com/Raynes/refh/tree/cljs&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15628">CLJS-355</key>
            <summary>Targeting nodejs, compiling multiple files fail</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="anthonygrimes">Anthony Grimes</reporter>
                        <labels>
                    </labels>
                <created>Sun, 12 Aug 2012 17:53:01 -0500</created>
                <updated>Sat, 29 Sep 2012 12:40:51 -0500</updated>
                    <resolved>Sat, 29 Sep 2012 12:40:51 -0500</resolved>
                                                                    <due></due>
                    <votes>1</votes>
                        <watches>4</watches>
                        <comments>
                    <comment id="29118" author="anthonygrimes" created="Sun, 12 Aug 2012 17:54:10 -0500"  >&lt;p&gt;I apologize for the atrocious formatting. It didn&apos;t occur to me to format anything until after I had posted the issue and I don&apos;t seen to be able to edit it.&lt;/p&gt;</comment>
                    <comment id="29120" author="anthonygrimes" created="Sun, 12 Aug 2012 20:18:30 -0500"  >&lt;p&gt;&lt;tt&gt;(cljs.closure/build &quot;src&quot; {:target :nodejs :output-to &quot;refh.js&quot; :optimizations :simple})&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;This also reproduces, in case you&apos;re wondering if lein-cljsbuild is the actual issue.&lt;/p&gt;</comment>
                    <comment id="29202" author="semperos" created="Thu, 16 Aug 2012 22:53:41 -0500"  >&lt;p&gt;I&apos;m not intimately familiar with the ClojureScript compiler, but here&apos;s what some experimentation shows:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Single namespace with Node.js target works fine&lt;/li&gt;
	&lt;li&gt;If multiple namespaces are present, only the *&lt;b&gt;first&lt;/b&gt;* is compiled and emitted, at first&lt;/li&gt;
	&lt;li&gt;After the first namespace is thus processed, the &lt;tt&gt;nodejscli&lt;/tt&gt; namespace is added which pulls in the &lt;tt&gt;nodejs&lt;/tt&gt; namespace and attempts to set &lt;tt&gt;&lt;b&gt;main-cli-fn&lt;/b&gt;&lt;/tt&gt;&lt;/li&gt;
	&lt;li&gt;Only after this are the rest of the project &lt;tt&gt;*.cljs&lt;/tt&gt; files compiled and emitted&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;This means that, if the first namespace that gets compiled is not the one that contains the &lt;tt&gt;&lt;b&gt;main-cli-fn&lt;/b&gt;&lt;/tt&gt; function, at run-time you get the error reported above. &lt;/p&gt;

&lt;p&gt;Moving the emitted code for &lt;tt&gt;nodejscli&lt;/tt&gt; to the end of the output file avoids this run-time error.&lt;/p&gt;

&lt;p&gt;Here&apos;s an example of the very bottom of a broken output file, with three namespaces &lt;tt&gt;platform.core&lt;/tt&gt;, &lt;tt&gt;platform.util&lt;/tt&gt; and &lt;tt&gt;platform.bar&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;cljs.core.UUID;
&lt;span class=&quot;code-keyword&quot;&gt;var&lt;/span&gt; platform = {util:{}};
platform.util.fooooz = function() {
  &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; 42
};
cljs.nodejs = {};
cljs.nodejs.require = require;
cljs.nodejs.process = process;
cljs.core.string_print = cljs.nodejs.require.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;, &lt;span class=&quot;code-quote&quot;&gt;&quot;util&quot;&lt;/span&gt;).print;
cljs.nodejscli = {};
cljs.core.apply.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;, cljs.core._STAR_main_cli_fn_STAR_, cljs.core.drop.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;, 2, cljs.nodejs.process.argv));
platform.bar = {};
platform.bar.booooz = function() {
  &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; 24
};
platform.core = {};
platform.core.start = function() {
  &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; cljs.core.println.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;, &lt;span class=&quot;code-quote&quot;&gt;&quot;Hello, world!&quot;&lt;/span&gt;)
};
cljs.core._STAR_main_cli_fn_STAR_ = platform.core.start;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29203" author="semperos" created="Thu, 16 Aug 2012 23:28:41 -0500"  >&lt;p&gt;Further exploration reveals that the &lt;tt&gt;cljs.closure/dependency-order&lt;/tt&gt; function appears to be the cause of the incorrect ordering for this situation. In the &lt;tt&gt;build&lt;/tt&gt; function in that ns, everything is in order until the &lt;tt&gt;add-dependencies&lt;/tt&gt; function is called, which itself calls &lt;tt&gt;dependency-order&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;By simply removing the call to &lt;tt&gt;dependency-order&lt;/tt&gt; in &lt;tt&gt;add-dependencies&lt;/tt&gt;, the above error is avoided. That&apos;s obviously not a solution, so I&apos;ll keep digging.&lt;/p&gt;</comment>
                    <comment id="29204" author="semperos" created="Fri, 17 Aug 2012 00:29:03 -0500"  >&lt;p&gt;Sorry to spam this thread, wanted to provide some code that gets things working.&lt;/p&gt;

&lt;p&gt;Beyond walking transitive dependencies, I&apos;m not certain what &lt;tt&gt;dependency-order&lt;/tt&gt; accomplishes that results in an improper order for &lt;tt&gt;nodejscli&lt;/tt&gt;. One non-permanent workaround is to delay appending this namespace until after dependencies have been processed. Since &lt;tt&gt;nodejscli&lt;/tt&gt; only requires &lt;tt&gt;nodejs&lt;/tt&gt;, which will be included anyway, this works (scroll inside the code window below, JIRA cuts it off vertically):&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;workaround.diff&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;From 47310bab84c53db7185cbaf98883d1e5aa929555 Mon Sep 17 00:00:00 2001
From: Daniel Gregoire
Date: Fri, 17 Aug 2012 01:18:05 -0400
Subject: [PATCH] Delay appending nodejscli to fix dependency ordering issue

---
 src/clj/cljs/closure.clj |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/clj/cljs/closure.clj b/src/clj/cljs/closure.clj
index 62352f1..1e0484b 100644
--- a/src/clj/cljs/closure.clj
+++ b/src/clj/cljs/closure.clj
@@ -875,14 +875,13 @@
               ana/*cljs-warn-on-undeclared*
               (&lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;? (opts :warnings))]
       (let [compiled (-compile source all-opts)
-            compiled (concat
-                      (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (coll? compiled) compiled [compiled])
-                      (when (= :nodejs (:target all-opts))
-                        [(-compile (io/resource &lt;span class=&quot;code-quote&quot;&gt;&quot;cljs/nodejscli.cljs&quot;&lt;/span&gt;) all-opts)]))
             js-sources (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (coll? compiled)
                          (binding []
                            (apply add-dependencies all-opts compiled))
                          (add-dependencies all-opts compiled))
+            js-sources (concat js-sources
+                               (when (= :nodejs (:target all-opts))
+                                 [(-compile (io/resource &lt;span class=&quot;code-quote&quot;&gt;&quot;cljs/nodejscli.cljs&quot;&lt;/span&gt;) all-opts)]))
             optim (:optimizations all-opts)]
         (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (and optim (not= optim :none))
           (-&amp;gt;&amp;gt; js-sources
-- 
1.7.7.5 (Apple Git-26)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With this patch applied, you can compile a ClojureScript code base targeting Node.js with multiple namespaces.&lt;/p&gt;</comment>
                    <comment id="29238" author="anthonygrimes" created="Tue, 21 Aug 2012 04:22:26 -0500"  >&lt;p&gt;Thanks for digging around! Hopefully someone will take a look at this soon. &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/biggrin.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="29240" author="tomoj" created="Tue, 21 Aug 2012 17:03:24 -0500"  >&lt;p&gt;Can&apos;t reproduce here:&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;tom@braskami:~/code/refh$ git rev-parse HEAD
01828e1b7e0d6746d7b025a97d835e4e2ba0d3bd
tom@braskami:~/code/refh$ git clean -fdx
tom@braskami:~/code/refh$ lein2 cljsbuild once
Compiling ClojureScript.
Compiling &lt;span class=&quot;code-quote&quot;&gt;&quot;refh.js&quot;&lt;/span&gt; from &lt;span class=&quot;code-quote&quot;&gt;&quot;src&quot;&lt;/span&gt;...
Successfully compiled &lt;span class=&quot;code-quote&quot;&gt;&quot;refh.js&quot;&lt;/span&gt; in 13.37828824 seconds.
WARNING: using numeric exit values in plugins is deprecated.
Plugins should use leiningen.core.main/abort instead.
Support &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; will be removed before the stable 2.0.0 release.
cljsbuild failed.
tom@braskami:~/code/refh$ npm install request
npm http GET https:&lt;span class=&quot;code-comment&quot;&gt;//registry.npmjs.org/request
&lt;/span&gt;npm http 200 https:&lt;span class=&quot;code-comment&quot;&gt;//registry.npmjs.org/request
&lt;/span&gt;request@2.10.0 ./node_modules/request
tom@braskami:~/code/refh$ node refh.js 
The &lt;span class=&quot;code-quote&quot;&gt;&quot;sys&quot;&lt;/span&gt; module is now called &lt;span class=&quot;code-quote&quot;&gt;&quot;util&quot;&lt;/span&gt;. It should have a similar &lt;span class=&quot;code-keyword&quot;&gt;interface&lt;/span&gt;.
&lt;span class=&quot;code-quote&quot;&gt;&quot;{\&quot;&lt;/span&gt;lines\&lt;span class=&quot;code-quote&quot;&gt;&quot;:1,\&quot;&lt;/span&gt;date\&lt;span class=&quot;code-quote&quot;&gt;&quot;:\&quot;&lt;/span&gt;2012-01-04T01:44:22.964Z\&lt;span class=&quot;code-quote&quot;&gt;&quot;,\&quot;&lt;/span&gt;paste-id\&lt;span class=&quot;code-quote&quot;&gt;&quot;:\&quot;&lt;/span&gt;1\&lt;span class=&quot;code-quote&quot;&gt;&quot;,\&quot;&lt;/span&gt;language\&lt;span class=&quot;code-quote&quot;&gt;&quot;:\&quot;&lt;/span&gt;Clojure\&lt;span class=&quot;code-quote&quot;&gt;&quot;,\&quot;&lt;/span&gt;&lt;span class=&quot;code-keyword&quot;&gt;private&lt;/span&gt;\&lt;span class=&quot;code-quote&quot;&gt;&quot;:&lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;,\&quot;&lt;/span&gt;url\&lt;span class=&quot;code-quote&quot;&gt;&quot;:\&quot;&lt;/span&gt;https:&lt;span class=&quot;code-comment&quot;&gt;//www.refheap.com/paste/1\&lt;span class=&quot;code-quote&quot;&gt;&quot;,\&quot;&lt;/span&gt;user\&lt;span class=&quot;code-quote&quot;&gt;&quot;:\&quot;&lt;/span&gt;raynes\&lt;span class=&quot;code-quote&quot;&gt;&quot;,\&quot;&lt;/span&gt;contents\&lt;span class=&quot;code-quote&quot;&gt;&quot;:\&quot;&lt;/span&gt;(begin)\&lt;span class=&quot;code-quote&quot;&gt;&quot;}&quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29242" author="anthonygrimes" created="Tue, 21 Aug 2012 17:07:37 -0500"  >&lt;p&gt;It&apos;s weird. He is the only one who can&apos;t reproduce this issue. He couldn&apos;t reproduce it on Ubuntu, so I tried the same thing on my Ubuntu VPS and had the same failures I do on my OS X laptop. AFAIK, Daniel also runs OS X Lion. So that means it has been reproduced on at least 3 boxes on two operating systems, one of which being Ubuntu which Tom can&apos;t reproduce on locally.&lt;/p&gt;</comment>
                    <comment id="29243" author="semperos" created="Tue, 21 Aug 2012 17:28:35 -0500"  >&lt;p&gt;Anthony/Tom, on Ubuntu, what version of the JDK did you use?&lt;/p&gt;</comment>
                    <comment id="29244" author="anthonygrimes" created="Tue, 21 Aug 2012 17:31:02 -0500"  >&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;$ java -version
java version &lt;span class=&quot;code-quote&quot;&gt;&quot;1.6.0_33&quot;&lt;/span&gt;
Java(TM) SE &lt;span class=&quot;code-object&quot;&gt;Runtime&lt;/span&gt; Environment (build 1.6.0_33-b03-424-11M3720)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29246" author="tomoj" created="Tue, 21 Aug 2012 18:17:45 -0500"  >&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;java version &lt;span class=&quot;code-quote&quot;&gt;&quot;1.6.0_30&quot;&lt;/span&gt;
Java(TM) SE &lt;span class=&quot;code-object&quot;&gt;Runtime&lt;/span&gt; Environment (build 1.6.0_30-b12)
Java HotSpot(TM) 64-Bit Server VM (build 20.5-b03, mixed mode)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I&apos;d guess I have some weird difference in my setup, but can&apos;t think of anything. I moved .m2 away and tried again &#8212; same results.&lt;/p&gt;</comment>
                    <comment id="29247" author="anthonygrimes" created="Tue, 21 Aug 2012 18:51:43 -0500"  >&lt;p&gt;Oh, forgot Ubuntu:&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;raynes@li231-96:~$ java -version
java version &lt;span class=&quot;code-quote&quot;&gt;&quot;1.6.0_20&quot;&lt;/span&gt;
OpenJDK &lt;span class=&quot;code-object&quot;&gt;Runtime&lt;/span&gt; Environment (IcedTea6 1.9.10) (6b20-1.9.10-0ubuntu1~10.04.2)
OpenJDK Client VM (build 19.0-b09, mixed mode, sharing)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is what I used on Ubuntu. The above is what I used on OS X.&lt;/p&gt;</comment>
                    <comment id="29284" author="dnolen" created="Wed, 29 Aug 2012 09:39:45 -0500"  >&lt;p&gt;Can we get a proper patch and can someone please apply that patch, test, and report back? Thanks!&lt;/p&gt;</comment>
                    <comment id="29415" author="tomoj" created="Sun, 9 Sep 2012 06:09:44 -0500"  >&lt;p&gt;FYI, I&apos;m seeing this problem now in a different project. Still no clue why the refheap example works for me..&lt;/p&gt;</comment>
                    <comment id="29568" author="ohpauleez" created="Fri, 28 Sep 2012 22:08:25 -0500"  >&lt;p&gt;The above patch works and make sense.  No one should be relying on nodejscli - which has a single environment-wide impact.&lt;/p&gt;

&lt;p&gt;I have needed to use the patch for a project and can confirm it works.&lt;/p&gt;</comment>
                    <comment id="29574" author="dnolen" created="Sat, 29 Sep 2012 12:40:51 -0500"  >&lt;p&gt;fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/d6f7d0b193de22378e06298fa543ca57d570c001&quot;&gt;http://github.com/clojure/clojurescript/commit/d6f7d0b193de22378e06298fa543ca57d570c001&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11530" name="node-multifile-355.diff" size="1432" author="ohpauleez" created="Fri, 28 Sep 2012 22:23:50 -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-379] optimize tail call in linear-traversal-nth</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-379</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;linear-traversal-nth is tail-recursive but doesn&apos;t call recur, so e.g. `(nth (iterate inc 0) 1e5)` can overflow the stack.&lt;/p&gt;

&lt;p&gt;Attached patch cljs-379.patch (17 Sep 2012) fixes this.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15706">CLJS-379</key>
            <summary>optimize tail call in linear-traversal-nth</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tomoj">Tom Jack</reporter>
                        <labels>
                    </labels>
                <created>Wed, 19 Sep 2012 02:36:34 -0500</created>
                <updated>Fri, 28 Sep 2012 17:49:54 -0500</updated>
                    <resolved>Fri, 28 Sep 2012 17:49:54 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29562" author="dnolen" created="Fri, 28 Sep 2012 17:49:54 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/0023c7a7b3a6c00826c9972e4417ee98163bada8&quot;&gt;http://github.com/clojure/clojurescript/commit/0023c7a7b3a6c00826c9972e4417ee98163bada8&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11511" name="cljs-379.patch" size="1290" author="tomoj" created="Wed, 19 Sep 2012 02:36:34 -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="10009">Fixed</customfieldvalue>

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

<item>
            <title>[CLJS-380] fix &quot;contains? not supported on LazySeq&quot; bug in cljs.closure/js-dependencies</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-380</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;js-dependencies apparently assumes that its requires arg is a set (despite the docstring). This breaks the browser repl for me. Stack trace: &lt;a href=&quot;https://gist.github.com/96a7e93ac48d8430700e&quot;&gt;https://gist.github.com/96a7e93ac48d8430700e&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Attached patch cljs-380.patch (19 Sep 2012) fixes it.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15707">CLJS-380</key>
            <summary>fix &quot;contains? not supported on LazySeq&quot; bug in cljs.closure/js-dependencies</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tomoj">Tom Jack</reporter>
                        <labels>
                    </labels>
                <created>Wed, 19 Sep 2012 18:22:58 -0500</created>
                <updated>Fri, 28 Sep 2012 17:49:14 -0500</updated>
                    <resolved>Fri, 28 Sep 2012 17:49:14 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29524" author="tomoj" created="Sat, 22 Sep 2012 13:06:11 -0500"  >&lt;p&gt;duplicated by &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-382&quot; title=&quot;Compiling with dependencies breaks under Clojure 1.5.0 alphas&quot;&gt;&lt;del&gt;CLJS-382&lt;/del&gt;&lt;/a&gt; which has more information.&lt;/p&gt;</comment>
                    <comment id="29537" author="dnolen" created="Thu, 27 Sep 2012 09:32:41 -0500"  >&lt;p&gt;So is this resolved?&lt;/p&gt;</comment>
                    <comment id="29549" author="tomoj" created="Fri, 28 Sep 2012 02:56:42 -0500"  >&lt;p&gt;Yes.&lt;/p&gt;</comment>
                    <comment id="29561" author="dnolen" created="Fri, 28 Sep 2012 17:49:14 -0500"  >&lt;p&gt;fixed in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-382&quot; title=&quot;Compiling with dependencies breaks under Clojure 1.5.0 alphas&quot;&gt;&lt;del&gt;CLJS-382&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11512" name="cljs-380.patch" size="1040" author="tomoj" created="Wed, 19 Sep 2012 18:22:58 -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="10009">Fixed</customfieldvalue>

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

<item>
            <title>[CLJS-151] clojure.string/blank? improvement</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-151</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The current implementation of clojure.string/blank? is verbose and redundant. GClosure provides a direct equivalent in goog.string.isEmptySafe.  We should just wrap that function.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15230">CLJS-151</key>
            <summary>clojure.string/blank? improvement</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="bobby">Bobby Calderwood</assignee>
                                <reporter username="bobby">Bobby Calderwood</reporter>
                        <labels>
                    </labels>
                <created>Sat, 18 Feb 2012 14:09:02 -0600</created>
                <updated>Fri, 28 Sep 2012 17:48:33 -0500</updated>
                    <resolved>Fri, 28 Sep 2012 17:48:33 -0500</resolved>
                                                                    <due>Fri, 24 Feb 2012 00:00:00 -0600</due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27773" author="dnolen" created="Sun, 19 Feb 2012 21:41:02 -0600"  >&lt;p&gt;It looks like you&apos;re calling a method on the string itself instead of calling goog.string.isEmptySafe&lt;/p&gt;</comment>
                    <comment id="29550" author="edtsech" created="Fri, 28 Sep 2012 07:05:21 -0500"  >&lt;p&gt;Seems it hasn&apos;t been fixed yet. Tests pass.&lt;/p&gt;</comment>
                    <comment id="29552" author="bobby" created="Fri, 28 Sep 2012 10:39:25 -0500"  >&lt;p&gt;Yes Edward, yours is the correct implementation, as pointed out by David (a long time ago!).  Sorry, it&apos;s been forever since I looked at this patch.  Should we merge it in?&lt;/p&gt;</comment>
                    <comment id="29560" author="dnolen" created="Fri, 28 Sep 2012 17:48:33 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/ae466b23f42f4e4bcd7d0010c54e103f4b3ef0f8&quot;&gt;http://github.com/clojure/clojurescript/commit/ae466b23f42f4e4bcd7d0010c54e103f4b3ef0f8&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10924" name="0001-Improve-implementation-of-clojure.string-blank.patch" size="950" author="bobby" created="Sat, 18 Feb 2012 14:09:02 -0600" />
                    <attachment id="11528" name="0002-Improve-implementation-of-clojure.string-blank.patch" size="837" author="edtsech" created="Fri, 28 Sep 2012 07:05: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>
                                            <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-384] Rhino and browser REPL namespaces both extend IJavaScriptEnv to IPersistentMap</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-384</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This means that:&lt;/p&gt;

&lt;p&gt;1. Whichever REPL environment namespace is loaded last determines which IJavaScriptEnv impl is used for an &quot;active&quot; REPL environment map.&lt;br/&gt;
2. One cannot use both Rhino and browser REPLs at the same time.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15717">CLJS-384</key>
            <summary>Rhino and browser REPL namespaces both extend IJavaScriptEnv to IPersistentMap</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="brentonashworth">Brenton Ashworth</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Sun, 23 Sep 2012 11:27:58 -0500</created>
                <updated>Fri, 28 Sep 2012 15:55:56 -0500</updated>
                    <resolved>Fri, 28 Sep 2012 11:09:13 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29544" author="dnolen" created="Thu, 27 Sep 2012 21:45:54 -0500"  >&lt;p&gt;Do you have a solution in mind?&lt;/p&gt;</comment>
                    <comment id="29547" author="cemerick" created="Thu, 27 Sep 2012 22:02:27 -0500"  >&lt;p&gt;The respective REPL environment namespaces just need to define record types that extend to IJavaScriptEnv as they do already.  That should maintain dependencies on the map interface but enable same-runtime usage.&lt;/p&gt;

&lt;p&gt;This was on my TODO list before strangeloop, but Brenton told me that he did exactly the above in the multi-browser-repl branch (&lt;a href=&quot;https://github.com/clojure/clojurescript/blob/multi-browser-repl/src/clj/cljs/repl/browser.clj#L294&quot;&gt;for example&lt;/a&gt;).  My plan is to now pester him incessantly until either that&apos;s merged, or he splits the record-ization of the protocol extensions out into a patch ready for master... &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>
                    <comment id="29553" author="brentonashworth" created="Fri, 28 Sep 2012 11:08:05 -0500"  >&lt;p&gt;This issue has been fixed with commit 66d43dd1.&lt;/p&gt;

&lt;p&gt;We now use records to implement IJavaScriptEnv for both the browser and rhino evaluation environments.&lt;/p&gt;</comment>
                    <comment id="29558" author="cemerick" created="Fri, 28 Sep 2012 15:55:56 -0500"  >&lt;p&gt;Thank you very, very much Brenton! &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>
                </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-382] Compiling with dependencies breaks under Clojure 1.5.0 alphas</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-382</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;&lt;a href=&quot;https://github.com/clojure/clojure/commit/3acb6ee7&quot;&gt;This Clojure commit&lt;/a&gt; changed &lt;tt&gt;contains?&lt;/tt&gt; to throw an exception when called with a non-associative collection.  Unfortunately, &lt;tt&gt;cljs.closure/js-dependencies&lt;/tt&gt; does exactly that, so many compilation scenarios will cause this error:&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;IllegalArgumentException contains? not supported on type: clojure.lang.LazySeq&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This should also make compilation more efficient, insofar as the &lt;tt&gt;contains?&lt;/tt&gt; call has always been failing (checking for a string or symbol key in a sequence).&lt;/p&gt;</description>
                <environment></environment>
            <key id="15715">CLJS-382</key>
            <summary>Compiling with dependencies breaks under Clojure 1.5.0 alphas</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="stuart.sierra">Stuart Sierra</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Sat, 22 Sep 2012 09:00:04 -0500</created>
                <updated>Wed, 26 Sep 2012 14:32:30 -0500</updated>
                    <resolved>Wed, 26 Sep 2012 14:32:30 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29534" author="stuart.sierra" created="Wed, 26 Sep 2012 14:32:30 -0500"  >&lt;p&gt;Pushed.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11521" name="CLJ-382.diff" size="787" author="cemerick" created="Sat, 22 Sep 2012 09:00:04 -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-276] Uploaded closure-library-third-party JAR not working as expected</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-276</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;After adding a dependency on closure-library-third-party jar to my project (as announced via &lt;a href=&quot;http://osdir.com/ml/clojure/2012-05/msg00568.html&quot;&gt;http://osdir.com/ml/clojure/2012-05/msg00568.html&lt;/a&gt;) I was unable to use either goog.dom.query or the non third party resources.&lt;/p&gt;

&lt;p&gt;Example error messages:&lt;br/&gt;
  ERROR - required &quot;goog.ui.TabBar&quot; namespace never provided&lt;br/&gt;
  ERROR - required &quot;goog.dom.query&quot; namespace never provided&lt;/p&gt;

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

&lt;p&gt;I have locally fudged the uploaded jar&apos;s such that they work as expected for my project, namely.&lt;br/&gt;
  1) deps.js in closure-library at the very end refers to ../third-party, this path does not / could not appear in the jar provided, instead it should look like for example:&lt;br/&gt;
    goog.addDependency(&apos;dojo/dom/query.js&apos;, &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;#39;goog.dom.query&amp;#39;&amp;#93;&lt;/span&gt;, &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;#39;goog.array&amp;#39;, &amp;#39;goog.dom&amp;#39;, &amp;#39;goog.functions&amp;#39;, &amp;#39;goog.string&amp;#39;, &amp;#39;goog.userAgent&amp;#39;&amp;#93;&lt;/span&gt;);&lt;br/&gt;
    (that it to say, remove the relative path and make it look like the other dep lines)&lt;br/&gt;
  2) removed deps.js and base.js from the -third-party jar entirely.&lt;/p&gt;

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

&lt;p&gt;Possibly nicer than my solution would be to have a deps.js skipping the third party deps present in google-closure-library.jar but for google-closure-library-third-party.jar to have the full set of both, however I had no time to try this option.&lt;/p&gt;</description>
                <environment>ClojureScript release 0.0-1236&lt;br/&gt;
noir-cljs</environment>
            <key id="15479">CLJS-276</key>
            <summary>Uploaded closure-library-third-party JAR not working as expected</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="stuart.sierra">Stuart Sierra</assignee>
                                <reporter username="lypanov">Alexander Kellett (lypanov)</reporter>
                        <labels>
                    </labels>
                <created>Sat, 26 May 2012 03:23:43 -0500</created>
                <updated>Fri, 21 Sep 2012 07:41:58 -0500</updated>
                    <resolved>Fri, 21 Sep 2012 07:41:58 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28840" author="dnolen" created="Sun, 17 Jun 2012 12:07:53 -0500"  >&lt;p&gt;Would be nice if someone else could confirm this is a problem. Have you checked on the mailing list?&lt;/p&gt;</comment>
                    <comment id="28844" author="lypanov" created="Sun, 17 Jun 2012 12:17:43 -0500"  >&lt;p&gt;Nope but I have experience already with use of closure compiler and have seen the same mistake made by others. As soon as I find the time (alas OSS commits are lower priority than keeping the company I work for afloat) I&apos;ll come up with a patch.&lt;/p&gt;</comment>
                    <comment id="29073" author="lobstu" created="Thu, 2 Aug 2012 02:25:35 -0500"  >&lt;p&gt;I can confirm this behaviour.&lt;/p&gt;

&lt;p&gt;With ClojureScript 1443, if I include &lt;span class=&quot;error&quot;&gt;&amp;#91;org.clojure/google-closure-library-third-party &amp;quot;0.0-1376&amp;quot;&amp;#93;&lt;/span&gt; in my project.clj, then none of the goog.* namespaces are added to the js produced by :whitespace mode. If I exclude this dependency, then goog.* namespaces appear in the js produced by :whitespace mode.&lt;/p&gt;

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

&lt;p&gt;Is it possible to have these two jars updated such that they can work together?&lt;/p&gt;

&lt;p&gt;I can provide a sample leiningen project to reproduce this, if you need it.&lt;/p&gt;</comment>
                    <comment id="29074" author="lypanov" created="Thu, 2 Aug 2012 04:39:18 -0500"  >&lt;p&gt;Robert I use:&lt;/p&gt;

&lt;p&gt;   &lt;span class=&quot;error&quot;&gt;&amp;#91;org.clojars.lypanov/google-closure-library-repackaged &amp;quot;0.0-1376&amp;quot;&amp;#93;&lt;/span&gt;&lt;br/&gt;
   &lt;span class=&quot;error&quot;&gt;&amp;#91;org.clojars.lypanov/google-closure-library-third-party-repackaged &amp;quot;0.0-1376&amp;quot;&amp;#93;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Both are available on clojars.&lt;/p&gt;

&lt;p&gt;And then peppered :exclusions &lt;span class=&quot;error&quot;&gt;&amp;#91;org.clojure/google-closure-library&amp;#93;&lt;/span&gt;&apos;s around my project.clj where ever needed.&lt;/p&gt;</comment>
                    <comment id="29075" author="lypanov" created="Thu, 2 Aug 2012 08:52:11 -0500"  >&lt;p&gt;Pinged Stuart Sierra on Twitter hoping for some information.&lt;/p&gt;

&lt;p&gt;My last post on the topic (a while back) to the mailing list wasn&apos;t allowed through.&lt;/p&gt;

&lt;p&gt;Just sent in my CA.&lt;/p&gt;</comment>
                    <comment id="29080" author="stuart.sierra" created="Fri, 3 Aug 2012 07:29:57 -0500"  >&lt;p&gt;I&apos;m looking at this now. It would be helpful if someone could explain what is different about &lt;a href=&quot;https://clojars.org/org.clojars.lypanov/google-closure-library-repackaged&quot;&gt;https://clojars.org/org.clojars.lypanov/google-closure-library-repackaged&lt;/a&gt; that makes it work.&lt;/p&gt;</comment>
                    <comment id="29081" author="lypanov" created="Fri, 3 Aug 2012 07:47:18 -0500"  >&lt;p&gt;Hey Stuart. The issue&apos;s description explains how to fix issue (section starting with &quot;I have locally fudged the uploaded jar&apos;s such that they work as expected for my project, namely.&quot;).&lt;/p&gt;

&lt;p&gt;Thanks for looking into it!&lt;/p&gt;</comment>
                    <comment id="29082" author="stuart.sierra" created="Fri, 3 Aug 2012 07:54:20 -0500"  >&lt;p&gt;Uploaded two patch files for the contents of google-closure-library-0.0-1376.jar and google-closure-library-third-party-0.0-1376.jar&lt;/p&gt;

&lt;p&gt;These patches are based on the repackaged versions by &lt;a href=&quot;https://clojars.org/users/lypanov&quot;&gt;https://clojars.org/users/lypanov&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Can someone confirm that JARs based on these patches will work?&lt;/p&gt;</comment>
                    <comment id="29083" author="lypanov" created="Fri, 3 Aug 2012 08:01:53 -0500"  >&lt;p&gt;Yup, looks good!&lt;/p&gt;</comment>
                    <comment id="29084" author="stuart.sierra" created="Fri, 3 Aug 2012 09:28:16 -0500"  >&lt;p&gt;Pushed some new release scripts into the ClojureScript GitHub repo:&lt;br/&gt;
&lt;a href=&quot;https://github.com/clojure/clojurescript/commit/cb95d651f6671fca534ade864408e8f1d04524ea&quot;&gt;https://github.com/clojure/clojurescript/commit/cb95d651f6671fca534ade864408e8f1d04524ea&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please verify that they produce main and third-party Google Closure Library JARs which work correctly.&lt;/p&gt;</comment>
                    <comment id="29087" author="stuart.sierra" created="Sun, 5 Aug 2012 20:50:53 -0500"  >&lt;p&gt;I have staged some JARs based on these scripts in the Sonatype OSS repository. You can try them out with a project.clj file like this:&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;(defproject tryme &lt;span class=&quot;code-quote&quot;&gt;&quot;0.1.0-SNAPSHOT&quot;&lt;/span&gt;
  :dependencies [[org.clojure/clojure &lt;span class=&quot;code-quote&quot;&gt;&quot;1.4.0&quot;&lt;/span&gt;]
                 [org.clojure/clojurescript &lt;span class=&quot;code-quote&quot;&gt;&quot;0.0-1450&quot;&lt;/span&gt;]
                 [domina &lt;span class=&quot;code-quote&quot;&gt;&quot;1.0.0&quot;&lt;/span&gt;]
                 [org.clojure/google-closure-library &lt;span class=&quot;code-quote&quot;&gt;&quot;0.0-1376-2&quot;&lt;/span&gt;]
                 [org.clojure/google-closure-library-third-party &lt;span class=&quot;code-quote&quot;&gt;&quot;0.0-1376-2&quot;&lt;/span&gt;]]
  :exclusions [org.clojure/google-closure-library
               org.clojure/google-closure-library-third-party
               goog-jar]
  :repositories {&lt;span class=&quot;code-quote&quot;&gt;&quot;sonatype-staging&quot;&lt;/span&gt;
                 &lt;span class=&quot;code-quote&quot;&gt;&quot;https:&lt;span class=&quot;code-comment&quot;&gt;//oss.sonatype.org/content/groups/staging/&quot;&lt;/span&gt;})&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Please try this out and report the third-party Google Closure Library extensions work correctly.&lt;/p&gt;</comment>
                    <comment id="29097" author="stuart.sierra" created="Fri, 10 Aug 2012 10:37:05 -0500"  >&lt;p&gt;These JARs have now been released to Maven Central, so you can use them without the special &lt;tt&gt;:repositories&lt;/tt&gt; in your project.clj&lt;/p&gt;</comment>
                    <comment id="29510" author="stuart.sierra" created="Fri, 21 Sep 2012 07:41:58 -0500"  >&lt;p&gt;POM template in ClojureScript has been updated.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11410" name="0001-closure-library-0.0-1376.patch" size="3991" author="stuart.sierra" created="Fri, 3 Aug 2012 07:54:20 -0500" />
                    <attachment id="11411" name="0001-closure-library-third-party-0.0-1376.patch" size="3378" author="stuart.sierra" created="Fri, 3 Aug 2012 07:54: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>
                                            <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-378] port clojure.data</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-378</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;clojure.data ports somewhat nicely to ClojureScript. The only wrinkle is that clojure.data extends its protocols to the java.util.Map/Set/List interfaces, which doesn&apos;t work in ClojureScript. The naive solution is to extend the protocols to every relevant type. I&apos;ve done this in the attached patch 0001-&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-378&quot; title=&quot;port clojure.data&quot;&gt;&lt;del&gt;CLJS-378&lt;/del&gt;&lt;/a&gt;-port-clojure.data.patch (16 Sep 2012).&lt;/p&gt;</description>
                <environment></environment>
            <key id="15701">CLJS-378</key>
            <summary>port clojure.data</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tomoj">Tom Jack</reporter>
                        <labels>
                    </labels>
                <created>Sun, 16 Sep 2012 01:11:47 -0500</created>
                <updated>Thu, 20 Sep 2012 11:24:40 -0500</updated>
                    <resolved>Thu, 20 Sep 2012 11:24:40 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29455" author="tomoj" created="Sun, 16 Sep 2012 01:13:26 -0500"  >&lt;p&gt;This patch (differences-from-clojure.patch) shows the changes made to the Clojure version.&lt;/p&gt;</comment>
                    <comment id="29466" author="dnolen" created="Mon, 17 Sep 2012 11:57:29 -0500"  >&lt;p&gt;Nice. But I think is probably best submitted as a patch to clojure.data not ClojureScript. Code duplication aside, it&apos;s simple for a library to provide both Clojure / ClojureScript functionality - this is done in core.logic. To address the code duplication issue - it&apos;s a good reason to get behind Feature Expressions - &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="29469" author="tomoj" created="Mon, 17 Sep 2012 14:48:41 -0500"  >&lt;p&gt;How would that work given that clojure.data is in Clojure itself? Cf. clojure.{set,string,walk,zip,core.reducers}.&lt;/p&gt;</comment>
                    <comment id="29470" author="dnolen" created="Mon, 17 Sep 2012 15:04:33 -0500"  >&lt;p&gt;Oops sorry! Was completely confused &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; Yes this looks good.&lt;/p&gt;</comment>
                    <comment id="29484" author="dnolen" created="Tue, 18 Sep 2012 12:04:06 -0500"  >&lt;p&gt;Thinking a bit more about this patch I wonder if it wouldn&apos;t be better to handle things in the default case by using an explicit conditional for the protocol partitions? The patch would be significantly smaller as well allowing users implementing the core protocols to get the desired behavior for free. While I have some reservation about a closed dispatch over the core protocols as far as I can tell the current list of core protocols is pretty well defined and unlikely to change.&lt;/p&gt;</comment>
                    <comment id="29501" author="tomoj" created="Wed, 19 Sep 2012 19:13:51 -0500"  >&lt;p&gt;Like this? (0002-&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-378&quot; title=&quot;port clojure.data&quot;&gt;&lt;del&gt;CLJS-378&lt;/del&gt;&lt;/a&gt;-port-clojure.data.patch, 19 Sep 2012)&lt;/p&gt;</comment>
                    <comment id="29502" author="dnolen" created="Wed, 19 Sep 2012 19:23:20 -0500"  >&lt;p&gt;This is looking good! Can we get some tests to go along with it? Thanks much.&lt;/p&gt;</comment>
                    <comment id="29503" author="tomoj" created="Wed, 19 Sep 2012 21:11:39 -0500"  >&lt;p&gt;Now (0003-&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-378&quot; title=&quot;port clojure.data&quot;&gt;&lt;del&gt;CLJS-378&lt;/del&gt;&lt;/a&gt;-port-clojure.data.patch, 19/Sep/12) with tests.&lt;/p&gt;</comment>
                    <comment id="29506" author="dnolen" created="Thu, 20 Sep 2012 11:24:40 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/77ef4f26e00149dfcfcb785cc1c59db82cd3d305&quot;&gt;http://github.com/clojure/clojurescript/commit/77ef4f26e00149dfcfcb785cc1c59db82cd3d305&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11514" name="0003-CLJS-378-port-clojure.data.patch" size="7078" author="tomoj" created="Wed, 19 Sep 2012 21:11:39 -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-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>6</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-377] ns&apos; :refer and :only options accept only vectors</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-377</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;ClojureScript requires vectors for the :refer and :only options of :use and :require clauses in its ns forms, whereas Clojure allows vectors or lists.&lt;/p&gt;

&lt;p&gt;That is, this works:&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
 (:require [com.bar :as bar :refer [baz]]))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;...but this doesn&apos;t:&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
 (:require [com.bar :as bar :refer (baz)]))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Presuming ClojureScript should maintain compatibility with Clojure where possible, this should not be the case:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;The Clojure documentation for both &lt;a href=&quot;http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/require&quot;&gt;require&lt;/a&gt; and &lt;a href=&quot;http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/refer&quot;&gt;refer&lt;/a&gt; specify that &lt;b&gt;lists&lt;/b&gt; of symbols should be used for these options.&lt;/li&gt;
	&lt;li&gt;The canonical example of &lt;a href=&quot;http://clojure.org/libs&quot;&gt;libspecs&lt;/a&gt; uses a list literal for its :only option.&lt;/li&gt;
	&lt;li&gt;Lots of Clojure code (especially purely algorithmic stuff) that otherwise works just fine in ClojureScript won&apos;t load because of the latter&apos;s vector requirement.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;This topic was raised and (briefly discussed) on &lt;a href=&quot;https://groups.google.com/forum/?fromgroups=#!topic/clojure-dev/Cb4JsN-TGys&quot;&gt;clojure-dev&lt;/a&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15692">CLJS-377</key>
            <summary>ns&apos; :refer and :only options accept only vectors</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Thu, 13 Sep 2012 11:08:42 -0500</created>
                <updated>Thu, 13 Sep 2012 12:14:08 -0500</updated>
                    <resolved>Thu, 13 Sep 2012 12:14:08 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29432" author="cemerick" created="Thu, 13 Sep 2012 11:36:13 -0500"  >&lt;p&gt;Patch attached, tests clean on master.  I also tweaked the assertion error messages to reflect the description of the acceptable values in the Clojure docstrings (i.e. &quot;list-of-symbols&quot;, thus e.g. &lt;tt&gt;:refer (symbols)&lt;/tt&gt; instead of &lt;tt&gt;:refer [symbols]&lt;/tt&gt;).&lt;/p&gt;</comment>
                    <comment id="29433" author="dnolen" created="Thu, 13 Sep 2012 12:14:08 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/59665801d86d87fa4d46dd494bea719578b9b10d&quot;&gt;http://github.com/clojure/clojurescript/commit/59665801d86d87fa4d46dd494bea719578b9b10d&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11494" name="CLJS-377.diff" size="3708" author="cemerick" created="Thu, 13 Sep 2012 11:36:13 -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-372] align standard out printing behavior with Clojure</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-372</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The behavior and print and println do not mirror Clojure&apos;s. This makes figuring out how to print to standard out consistently a bit of guessing game. The fixes in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-340&quot; title=&quot;improve pr-str performance&quot;&gt;&lt;del&gt;CLJS-340&lt;/del&gt;&lt;/a&gt; have changed the output of the benchmarks which made me notice that the issue is pervasive.&lt;/p&gt;

&lt;p&gt;To see the basic issue run ./script/benchmark before and after the &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-340&quot; title=&quot;improve pr-str performance&quot;&gt;&lt;del&gt;CLJS-340&lt;/del&gt;&lt;/a&gt; fix.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15676">CLJS-372</key>
            <summary>align standard out printing behavior with Clojure</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 5 Sep 2012 10:14:51 -0500</created>
                <updated>Sun, 9 Sep 2012 17:51:48 -0500</updated>
                    <resolved>Sun, 9 Sep 2012 17:51:48 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29411" author="emezeske" created="Sat, 8 Sep 2012 15:32:39 -0500"  >&lt;p&gt;Attaching a patch that fixes the double-newline regression.  It was a typo on my part.&lt;/p&gt;</comment>
                    <comment id="29416" author="dnolen" created="Sun, 9 Sep 2012 17:51:48 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/f1996ac9bbbef89fb2036d57aa9814cdc47b605a&quot;&gt;http://github.com/clojure/clojurescript/commit/f1996ac9bbbef89fb2036d57aa9814cdc47b605a&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11486" name="0001-Fix-a-print-ln-regression-where-two-newlines-would-b.patch" size="809" author="emezeske" created="Sat, 8 Sep 2012 15:32:39 -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-376] `case` doesn&apos;t match quoted symbols</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-376</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;It works fine in the Clojure 1.4.0 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;user=&amp;gt; (let [a &apos;a] (&lt;span class=&quot;code-keyword&quot;&gt;case&lt;/span&gt; a nil :nil &apos;&amp;amp; :amp :none))
:none
user=&amp;gt; (let [a &apos;&amp;amp;] (&lt;span class=&quot;code-keyword&quot;&gt;case&lt;/span&gt; a nil :nil &apos;&amp;amp; :amp :none))
:amp
user=&amp;gt; (let [a &apos;b] (&lt;span class=&quot;code-keyword&quot;&gt;case&lt;/span&gt; a nil :nil &apos;b :b :none))
:b&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But in the CLJS Rhino REPL this is what I see:&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; (let [a &apos;a] (&lt;span class=&quot;code-keyword&quot;&gt;case&lt;/span&gt; a nil :nil &apos;&amp;amp; :amp :none))
:none
ClojureScript:cljs.user&amp;gt; (let [a &apos;&amp;amp;] (&lt;span class=&quot;code-keyword&quot;&gt;case&lt;/span&gt; a nil :nil &apos;&amp;amp; :amp :none))
:none
ClojureScript:cljs.user&amp;gt; (let [a &apos;b] (&lt;span class=&quot;code-keyword&quot;&gt;case&lt;/span&gt; a nil :nil &apos;b :b :none))
:none&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment>ClojureScript</environment>
            <key id="15684">CLJS-376</key>
            <summary>`case` doesn&apos;t match quoted symbols</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="kumarshantanu">Shantanu Kumar</reporter>
                        <labels>
                        <label>bug</label>
                    </labels>
                <created>Fri, 7 Sep 2012 12:28:50 -0500</created>
                <updated>Fri, 7 Sep 2012 16:49:37 -0500</updated>
                    <resolved>Fri, 7 Sep 2012 16:49:37 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29402" author="dnolen" created="Fri, 7 Sep 2012 16:48:46 -0500"  >&lt;p&gt;This did reveal a bug though the ticket description does have a user error. The tests for case can only be literals - you should not quote the test values. For example the following is how symbols should be tested:&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 [a &apos;&amp;amp;] (&lt;span class=&quot;code-keyword&quot;&gt;case&lt;/span&gt; a nil :nil &amp;amp; :amp :none))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The above code that quotes the test is actually equivalent to:&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 [a &apos;&amp;amp;] (&lt;span class=&quot;code-keyword&quot;&gt;case&lt;/span&gt; a nil :nil (quote &amp;amp;) :amp :none))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Which happens to work but probably isn&apos;t intended.&lt;/p&gt;

&lt;p&gt;With the coming patch CLJS now works as Clojure.&lt;/p&gt;</comment>
                    <comment id="29403" author="dnolen" created="Fri, 7 Sep 2012 16:49:37 -0500"  >&lt;p&gt;Fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/c8e301a9b058f81bb599026a07f97ccdf4441730&quot;&gt;http://github.com/clojure/clojurescript/commit/c8e301a9b058f81bb599026a07f97ccdf4441730&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-340] improve pr-str performance</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-340</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Currently pr-str performance is terrible. We should implement printing in the same style as core_print.clj Clojure JVM.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15590">CLJS-340</key>
            <summary>improve pr-str performance</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Tue, 24 Jul 2012 23:32:56 -0500</created>
                <updated>Fri, 7 Sep 2012 11:11:20 -0500</updated>
                    <resolved>Tue, 4 Sep 2012 21:39:23 -0500</resolved>
                                                                    <due></due>
                    <votes>2</votes>
                        <watches>5</watches>
                        <comments>
                    <comment id="29044" author="emezeske" created="Wed, 25 Jul 2012 22:43:05 -0500"  >&lt;p&gt;I&apos;ve rewritten the pr-str stuff, passing a StringBuffer down and appending to it instead of doing a massive amount of concats with temporary lists (some of which were lazy).  The results are very promising.  On V8, serialization of big data structures is 2-3 times faster, and in the IE8 JS engine, it&apos;s 10 times faster.&lt;/p&gt;

&lt;p&gt;I still need to clean it up and get the tests working, but I should be able to submit a patch pretty soon.&lt;/p&gt;</comment>
                    <comment id="29045" author="emezeske" created="Thu, 26 Jul 2012 00:11:45 -0500"  >&lt;p&gt;I&apos;ve attached my patch to optimize pr-str.  I used the StringBuffer approach, with which I see very substantial performance improvements of 2-3X in V8 and 10-100X in IE8.&lt;/p&gt;

&lt;p&gt;I also added a suite of tests for pr-str, based loosely on the reader tests, to make sure that I didn&apos;t break anything.  All tests pass.&lt;/p&gt;</comment>
                    <comment id="29048" author="dnolen" created="Thu, 26 Jul 2012 08:53:30 -0500"  >&lt;p&gt;The approach looks good but this is a pretty big breaking change. After a year of ClojureScript I think there are quite a few code bases that rely on the contract of -pr-seq. I would prefer a patch that created a new protocol, IPrintMethod (or some better name) with support for this new interface for all current IPrintable types. Yes this means a lot of code duplication for now but this allows us to provide a fast path, it allows people to adopt it, and it gives us time to deprecate IPrintable.&lt;/p&gt;</comment>
                    <comment id="29049" author="emezeske" created="Thu, 26 Jul 2012 12:26:15 -0500"  >&lt;p&gt;I was afraid that you might say that!  I was hoping that the leading dash on -pr-seq meant that nobody used it, but c&apos;est la vie.  &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;

&lt;p&gt;It shouldn&apos;t be hard to make things cohabitate in the way you described.  Since I already renamed the -pr-seq function, I can just add the old stuff back in, and as long as the protocol names differ it should be easy.&lt;/p&gt;

&lt;p&gt;I&apos;ll see if I can get to that this evening, although it might have to wait for the weekend.  Either way, I&apos;ll get to it very soon.&lt;/p&gt;</comment>
                    <comment id="29050" author="dnolen" created="Thu, 26 Jul 2012 12:30:02 -0500"  >&lt;p&gt;Yeah anybody working with deftype or defrecord will probably have provided their own IPrintable implementation. You should be able to dispatch to the fast path with a satisfies? test.&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;</comment>
                    <comment id="29072" author="emezeske" created="Wed, 1 Aug 2012 22:36:39 -0500"  >&lt;p&gt;I updated my patch with support for backwards compatibility with old types that implement -pr-seq.  If an object does not satisfy the new protocol (IPrintWith), pr-str will fall back on IPrintable recursively.  I marked various IPrintable-related features as ^:deprecated, and included comments that explain why.&lt;/p&gt;

&lt;p&gt;I also added some new tests, for backwards compatibility and printing records.&lt;/p&gt;</comment>
                    <comment id="29077" author="emezeske" created="Thu, 2 Aug 2012 15:33:59 -0500"  >&lt;p&gt;For reference, I added a simple pr-str benchmark to cljs-bench.  The test data structure that is printed is not very large, but I&apos;m thinking that it&apos;s nested deeply enough to show the performance gains of my patch once it&apos;s applied.  If not, I can update the benchmark to dynamically build up a larger data structure to really tax pr-str.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.50ply.com/cljs-bench/#plot49&quot;&gt;http://www.50ply.com/cljs-bench/#plot49&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29098" author="dnolen" created="Fri, 10 Aug 2012 11:03:33 -0500"  >&lt;p&gt;Could we get a compiler warning for IPrintable usage? We can then remove it from the next release.&lt;/p&gt;</comment>
                    <comment id="29114" author="emezeske" created="Sat, 11 Aug 2012 22:23:45 -0500"  >&lt;p&gt;I will add the warning, hopefully this weekend sometime.  I need to think about how to do it, though.  The easy way would be to just generate a warning whenever pr-seq is called.  However, for a deeply nested structure, that would produce a whole lot of warnings for just one use of pr-seq.  I&apos;ll try to come up with a solution that will only generate one warning per invocation of pr(-str).&lt;/p&gt;</comment>
                    <comment id="29115" author="dnolen" created="Sat, 11 Aug 2012 22:45:33 -0500"  >&lt;p&gt;Would be better to warn only implementation rather than usage. Ideally the patch just warns on files that are not core.cljs. That&apos;s still bound to create some noise internal to CLJS, but I think that&apos;ll encourage folks to fix their own code.&lt;/p&gt;</comment>
                    <comment id="29116" author="emezeske" created="Sat, 11 Aug 2012 23:06:04 -0500"  >&lt;p&gt;Ah, yeah, that would be much better.  I forgot we&apos;re working on the compiler here, that sort of thing should be easy!  &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="29293" author="dnolen" created="Wed, 29 Aug 2012 20:27:10 -0500"  >&lt;p&gt;I wonder if an IWriter protocol isn&apos;t warranted here instead of making printer be a function. While it seems like overkill for clientside JS perhaps for serverside scripts it would be useful. Granted those users could easily construct a function but there something protocol like here that might benefit from being made explicit.&lt;/p&gt;

&lt;p&gt;Perhaps worth pondering &lt;a href=&quot;http://docs.oracle.com/javase/6/docs/api/java/io/Writer.html&quot;&gt;http://docs.oracle.com/javase/6/docs/api/java/io/Writer.html&lt;/a&gt; and &lt;a href=&quot;http://nodejs.org/api/fs.html&quot;&gt;http://nodejs.org/api/fs.html&lt;/a&gt; just a little bit.&lt;/p&gt;</comment>
                    <comment id="29299" author="emezeske" created="Thu, 30 Aug 2012 02:28:53 -0500"  >&lt;p&gt;I added an IWriter protocol, changed IPrintWith&apos;s name to IPrintWriter, and changed its implementation to use an IWriter.  I added two types that implement IWriter: StringBufferWriter and StandardOutputWriter, and then implemented the pr-* functions in terms of those.&lt;/p&gt;</comment>
                    <comment id="29310" author="emezeske" created="Fri, 31 Aug 2012 00:52:53 -0500"  >&lt;p&gt;I changed IPrintWriter to IPrintWithWriter, as per a conversation I had with David Nolen on IRC.&lt;/p&gt;</comment>
                    <comment id="29315" author="dnolen" created="Fri, 31 Aug 2012 08:18:37 -0500"  >&lt;p&gt;This patch no longer applies to master. Can we get a new patch? Thanks!&lt;/p&gt;</comment>
                    <comment id="29335" author="emezeske" created="Sat, 1 Sep 2012 16:05:07 -0500"  >&lt;p&gt;Rebased the patch on top of master just now.&lt;/p&gt;</comment>
                    <comment id="29338" author="dnolen" created="Mon, 3 Sep 2012 13:12:15 -0500"  >&lt;p&gt;Great it applies! However tests now fail for SpiderMonkey and JavaScriptCore - &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;out/core-advanced-test.js:371: ReferenceError: write is not defined&quot;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;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;Exception: ReferenceError: Can&apos;t find variable: write
global code@out/core-advanced-test.js:371&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Also can we please remove the old patches to prevent future confusion?&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;</comment>
                    <comment id="29345" author="emezeske" created="Mon, 3 Sep 2012 15:04:48 -0500"  >&lt;p&gt;Sadly, JavaScriptCore does not have any way to print to standard output without a newline, so I had to remove the more efficient StandardOutputWriter and output strings by building them up fully in memory and then dumping them in one big print.&lt;/p&gt;

&lt;p&gt;Eventually we could add the option to supply a &lt;b&gt;write-fn&lt;/b&gt;, which is just like &lt;b&gt;print-fn&lt;/b&gt; except guaranteed not to output a trailing newline.  Then we could check whether a &lt;b&gt;write-fn&lt;/b&gt; was set and if so avoid the intermediate in-memory copy of the string.&lt;/p&gt;

&lt;p&gt;The tests are now passing under all three implementations.&lt;/p&gt;</comment>
                    <comment id="29361" author="dnolen" created="Tue, 4 Sep 2012 18:07:07 -0500"  >&lt;p&gt;I&apos;m confused as to why you needed to remove StandardOutputWriter. Is there any reason to not make the implementation adaptable to the available capabilities? I think that most people that use ClojureScript serverside will be using V8 or Rhino anyhow.&lt;/p&gt;</comment>
                    <comment id="29362" author="dnolen" created="Tue, 4 Sep 2012 18:07:07 -0500"  >&lt;p&gt;I&apos;m confused as to why you needed to remove StandardOutputWriter. Is there any reason to not make the implementation adaptable to the available capabilities? I think that most people that use ClojureScript serverside will be using V8 or Rhino anyhow.&lt;/p&gt;</comment>
                    <comment id="29363" author="emezeske" created="Tue, 4 Sep 2012 18:17:34 -0500"  >&lt;p&gt;I removed StandardOutputWriter because it doesn&apos;t work with &amp;#42;print-fn&amp;#42;, which is assumed to append a newline to the text it outputs.&lt;/p&gt;

&lt;p&gt;I agree that the implementation should be adaptable to the available capabilities, but I was thinking that such behavior could be added in a future patch.&lt;/p&gt;

&lt;p&gt;The approach I had in mind was to add a settable &amp;#42;write-fn&amp;#42;, and have the implementation use a buffering approach if it &amp;#42;write-fn&amp;#42; is nil, otherwise use the more efficient StandardOutputWriter.  If you agree with this approach, I&apos;d be happy to add it to this patch.&lt;/p&gt;</comment>
                    <comment id="29364" author="dnolen" created="Tue, 4 Sep 2012 18:25:53 -0500"  >&lt;p&gt;But why do people need to deal with &amp;#42;print-fn&amp;#42; or &amp;#42;write-fn&amp;#42; at all? Can&apos;t this logic be hidden inside StandardOutputWriter?&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;(set! *out* (&lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; StandardOutputWriter.))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Granted code exists that depends on &amp;#42;print-fn&amp;#42; so I&apos;m not talking about removing them. But being able to set! &amp;#42;out&amp;#42; also opens the door for rebinding &amp;#42;out&amp;#42; just like we do in Clojure.&lt;/p&gt;</comment>
                    <comment id="29365" author="emezeske" created="Tue, 4 Sep 2012 18:50:24 -0500"  >&lt;p&gt;Is there an official list of what JS platforms are supported by ClojureScript?  It appears that every platform has a unique API for printing to standard output, so StandardOutputWriter would have to inspect the environment to find write() (V8), putstr() (SpiderMonkey), no support (JavaScriptCore, Rhino), process.stdout.write() (node.js), or god knows what other functions in the more obscure JS engines.&lt;/p&gt;

&lt;p&gt;I assume that &amp;#42;print-fn&amp;#42; exists to allow for compatibility with any JS platform (even those not explicitly tested against).  If StandardOutputWriter is going to have platform-specific knowledge baked into it (e.g. a list of functions to try), I think it should also have a back door to allow people to override things for other JS platforms.  I guess &amp;#42;out&amp;#42; could be used for that purpose, though...&lt;/p&gt;</comment>
                    <comment id="29366" author="dnolen" created="Tue, 4 Sep 2012 19:03:14 -0500"  >&lt;p&gt;I agree that this is a bit of scope creep for this ticket, we should hash it out a bit on design page first. Do we need &amp;#42;write-fn&amp;#42; for this patch to work? It would be preferable to do w/o it so we can design something proper w/o yet something else people will inadvertently depend on.&lt;/p&gt;</comment>
                    <comment id="29367" author="emezeske" created="Tue, 4 Sep 2012 19:34:11 -0500"  >&lt;p&gt;The patch, in its current form (e.g. without a StandardOutputWriter), assumes that only &amp;#42;print-fn&amp;#42; is available, and doesn&apos;t require a &amp;#42;write-fn&amp;#42;.&lt;/p&gt;

&lt;p&gt;Even without the StandardOutputWriter, it&apos;s generally much faster (and certainly no worse) than the existing implementation.&lt;/p&gt;</comment>
                    <comment id="29368" author="dnolen" created="Tue, 4 Sep 2012 19:40:07 -0500"  >&lt;p&gt;Great! Will go with this then.&lt;/p&gt;</comment>
                    <comment id="29369" author="dnolen" created="Tue, 4 Sep 2012 19:41:39 -0500"  >&lt;p&gt;Can we rebase the patch on master again, this won&apos;t apply cleanly because of another commit thank snuck in involving pr-str. Thanks!&lt;/p&gt;</comment>
                    <comment id="29370" author="emezeske" created="Tue, 4 Sep 2012 20:11:26 -0500"  >&lt;p&gt;Huh, that patch was based on the latest master commit &amp;#8211; I&apos;m very confused about why it won&apos;t apply cleanly.  I must have done something weird when I created it.  I tested the application of the new patch I&apos;m attaching, so it should be good to go.&lt;/p&gt;</comment>
                    <comment id="29371" author="dnolen" created="Tue, 4 Sep 2012 21:39:23 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/c8bc05ca8e3c7e30a85148dd67398aa4d0e6b468&quot;&gt;http://github.com/clojure/clojurescript/commit/c8bc05ca8e3c7e30a85148dd67398aa4d0e6b468&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29372" author="bbloom" created="Tue, 4 Sep 2012 23:01:27 -0500"  >&lt;p&gt;Sweet! Good stuff, Evan, thanks.&lt;/p&gt;

&lt;p&gt;You wouldn&apos;t be interested in writing a new patch for &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-321&quot; title=&quot;Support with-out-str&quot;&gt;&lt;del&gt;CLJS-321&lt;/del&gt;&lt;/a&gt; would you? &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="29390" author="dnolen" created="Thu, 6 Sep 2012 20:03:22 -0500"  >&lt;p&gt;This ticket is great but it did affect printing behavior - it would be nice to resolve &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-372&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-372&lt;/a&gt; before cutting a new release.&lt;/p&gt;</comment>
                    <comment id="29393" author="emezeske" created="Fri, 7 Sep 2012 01:41:30 -0500"  >&lt;p&gt;Could you add some more detail to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-372&quot; title=&quot;align standard out printing behavior with Clojure&quot;&gt;&lt;del&gt;CLJS-372&lt;/del&gt;&lt;/a&gt;?  I&apos;ll be happy to fix any regressions caused by this patch.  In my testing, I didn&apos;t notice anything broken, though, so I&apos;ll need a bit more detail so that I know where to start looking.&lt;/p&gt;</comment>
                    <comment id="29398" author="dnolen" created="Fri, 7 Sep 2012 11:11:20 -0500"  >&lt;p&gt;I added some more detail to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-372&quot; title=&quot;align standard out printing behavior with Clojure&quot;&gt;&lt;del&gt;CLJS-372&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11478" name="0001-Optimize-pr-str-by-making-more-use-of-StringBuffer.patch" size="24103" author="emezeske" created="Tue, 4 Sep 2012 20:11:26 -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-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-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-373] Automatically add `var CLOSURE_NO_DEPS = true;` to output if only whitspace optimizations are being applied</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-373</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Without this, using the output of &lt;tt&gt;:whitespace&lt;/tt&gt; compilation will produce 404&apos;s as documented e.g. &lt;a href=&quot;https://github.com/emezeske/lein-cljsbuild/blob/master/example-projects/simple/src-clj/example/views.clj#L8&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15678">CLJS-373</key>
            <summary>Automatically add `var CLOSURE_NO_DEPS = true;` to output if only whitspace optimizations are being applied</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="cemerick">Chas Emerick</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Thu, 6 Sep 2012 14:53:58 -0500</created>
                <updated>Thu, 6 Sep 2012 18:49:53 -0500</updated>
                    <resolved>Thu, 6 Sep 2012 17:30:06 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29387" author="cemerick" created="Thu, 6 Sep 2012 16:15:55 -0500"  >&lt;p&gt;Attached patch tested clean; I don&apos;t see any tests for checking the concrete output of the optimizer, but I verified the results are as expected (i.e. &lt;tt&gt;CLOSURE_NO_DEPS&lt;/tt&gt; defined at the top of the output only when &lt;tt&gt;:optimizations&lt;/tt&gt; is set to &lt;tt&gt;:whitespace&lt;/tt&gt;) interactively and with an app under development with lein-cljsbuild.&lt;/p&gt;</comment>
                    <comment id="29388" author="dnolen" created="Thu, 6 Sep 2012 17:30:07 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/bc4b7ab618b5b14712829f6275de16baf2fd4956&quot;&gt;http://github.com/clojure/clojurescript/commit/bc4b7ab618b5b14712829f6275de16baf2fd4956&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29389" author="emezeske" created="Thu, 6 Sep 2012 18:49:53 -0500"  >&lt;p&gt;This is great &amp;#8211; one less question to befuddle newcomers!&lt;/p&gt;

&lt;p&gt;I&apos;ll update the lein-cljsbuild examples once this makes it into a tagged release of the compiler.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11481" name="CLJS-373.diff" size="1000" author="cemerick" created="Thu, 6 Sep 2012 16:11:58 -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-370] Incorrect behavior of integer? for integral floating point expressions</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-370</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This includes infinity, exponential expressions, etc.&lt;/p&gt;

&lt;p&gt;See: &lt;a href=&quot;http://stackoverflow.com/questions/3885817/how-to-check-if-a-number-is-float-or-integer&quot;&gt;http://stackoverflow.com/questions/3885817/how-to-check-if-a-number-is-float-or-integer&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15671">CLJS-370</key>
            <summary>Incorrect behavior of integer? for integral floating point expressions</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 3 Sep 2012 15:28:18 -0500</created>
                <updated>Wed, 5 Sep 2012 11:40:48 -0500</updated>
                    <resolved>Wed, 5 Sep 2012 10:07:21 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29349" author="dnolen" created="Mon, 3 Sep 2012 16:26:17 -0500"  >&lt;p&gt;changing the behavior of integer? outside of a more comprehensive numeric discussion is low priority. The current implementation is already suboptimal in its coercion of numbers to strings.&lt;/p&gt;</comment>
                    <comment id="29350" author="bbloom" created="Mon, 3 Sep 2012 17:31:31 -0500"  >&lt;p&gt;I&apos;m not changing the behavior of integer?, I&apos;m fixing it. Also, regarding the suboptimal nature of string coercion, the following benchmark seems to show this isn&apos;t an issue at all:&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;Benchmarking with V8
[n 5], (old-integer? n), 1000000 runs, 0 msecs
[n 5.5], (old-integer? n), 1000000 runs, 0 msecs
[n 5.0E300], (old-integer? n), 1000000 runs, 0 msecs
[n &quot;&quot;], (old-integer? n), 1000000 runs, 0 msecs
[n 5], (integer? n), 1000000 runs, 0 msecs
[n 5.5], (integer? n), 1000000 runs, 0 msecs
[n 5.0E300], (integer? n), 1000000 runs, 0 msecs
[n &quot;&quot;], (integer? n), 1000000 runs, 0 msecs


Benchmarking with SpiderMonkey
[n 5], (old-integer? n), 1000000 runs, 0 msecs
[n 5.5], (old-integer? n), 1000000 runs, 0 msecs
[n 5.0E300], (old-integer? n), 1000000 runs, 0 msecs
[n &quot;&quot;], (old-integer? n), 1000000 runs, 0 msecs
[n 5], (integer? n), 1000000 runs, 0 msecs
[n 5.5], (integer? n), 1000000 runs, 0 msecs
[n 5.0E300], (integer? n), 1000000 runs, 0 msecs
[n &quot;&quot;], (integer? n), 1000000 runs, 0 msecs


Benchmarking with JavaScriptCore
[n 5], (old-integer? n), 1000000 runs, 0 msecs
[n 5.5], (old-integer? n), 1000000 runs, 0 msecs
[n 5.0E300], (old-integer? n), 1000000 runs, 0 msecs
[n &quot;&quot;], (old-integer? n), 1000000 runs, 0 msecs
[n 5], (integer? n), 1000000 runs, 0 msecs
[n 5.5], (integer? n), 1000000 runs, 0 msecs
[n 5.0E300], (integer? n), 1000000 runs, 0 msecs
[n &quot;&quot;], (integer? n), 1000000 runs, 0 msecs&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29357" author="dnolen" created="Tue, 4 Sep 2012 10:02:32 -0500"  >&lt;p&gt;Those benchmarks are not revealing anything. Advanced compilation is eliminating that code. Try with :simple or :whitespace.&lt;/p&gt;</comment>
                    <comment id="29373" author="bbloom" created="Tue, 4 Sep 2012 23:13:39 -0500"  >&lt;p&gt;&lt;b&gt;sigh&lt;/b&gt; I&apos;ve once again shown my profiling ineptitude. Here&apos;s results running with whitespace optimizations:&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;Benchmarking with V8
[n 5], (old-integer? n), 1000000 runs, 924 msecs
[n 5.5], (old-integer? n), 1000000 runs, 1097 msecs
[n 5.0E300], (old-integer? n), 1000000 runs, 1009 msecs
[n &quot;&quot;], (old-integer? n), 1000000 runs, 77 msecs
[n 5], (integer? n), 1000000 runs, 210 msecs
[n 5.5], (integer? n), 1000000 runs, 556 msecs
[n 5.0E300], (integer? n), 1000000 runs, 731 msecs
[n &quot;&quot;], (integer? n), 1000000 runs, 78 msecs


Benchmarking with SpiderMonkey
[n 5], (old-integer? n), 1000000 runs, 236 msecs
[n 5.5], (old-integer? n), 1000000 runs, 362 msecs
[n 5.0E300], (old-integer? n), 1000000 runs, 2885 msecs
[n &quot;&quot;], (old-integer? n), 1000000 runs, 94 msecs
[n 5], (integer? n), 1000000 runs, 216 msecs
[n 5.5], (integer? n), 1000000 runs, 230 msecs
[n 5.0E300], (integer? n), 1000000 runs, 1360 msecs
[n &quot;&quot;], (integer? n), 1000000 runs, 98 msecs


Benchmarking with JavaScriptCore
[n 5], (old-integer? n), 1000000 runs, 471 msecs
[n 5.5], (old-integer? n), 1000000 runs, 467 msecs
[n 5.0E300], (old-integer? n), 1000000 runs, 771 msecs
[n &quot;&quot;], (old-integer? n), 1000000 runs, 212 msecs
[n 5], (integer? n), 1000000 runs, 882 msecs
[n 5.5], (integer? n), 1000000 runs, 756 msecs
[n 5.0E300], (integer? n), 1000000 runs, 851 msecs
[n &quot;&quot;], (integer? n), 1000000 runs, 213 msecs&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Seems like a win on V8 &amp;amp; SpiderMonkey, but a small loss on JavaScriptCore.&lt;/p&gt;</comment>
                    <comment id="29374" author="dnolen" created="Tue, 4 Sep 2012 23:40:29 -0500"  >&lt;p&gt;The slow down on JSC gives me pause. WebKit is ubiquitous in the mobile space. &lt;/p&gt;

&lt;p&gt;I&apos;m also not convinced we need to handle Infinity or NaN (though others may differ on that point). Perhaps we can in some debug mode intelligently detect and error out precisely where these kinds of mistakes may occur.&lt;/p&gt;</comment>
                    <comment id="29375" author="bbloom" created="Wed, 5 Sep 2012 01:19:27 -0500"  >&lt;p&gt;It seems like a bad precedent to favor micro-optimization over correctness when speed is easily obtainable through platform interop.&lt;/p&gt;

&lt;p&gt;Infinity, NaN, and floating point exponentiation expressions are not integers. I changed the function&apos;s behavior to match JVM Clojure&apos;s. We&apos;re going to need a reliable integer predicate if we want to implement ratios and other compound numeric types. &lt;/p&gt;

&lt;p&gt;If you need need a fast predicate for numbers, the number? predicate only checks type. It&apos;s behavior also matches JVM Clojure&apos;s: it accepts infinity, NaN, etc. If you need a fast integer test, but insist that edge cases like 5e300 are exceptional and ignorable, then you can micro-optimize by calling the necessary javascript primitives yourself.&lt;/p&gt;</comment>
                    <comment id="29378" author="dnolen" created="Wed, 5 Sep 2012 09:55:28 -0500"  >&lt;p&gt;On my machine your patch is slower across all JS engines w/ JSC faring the worst at nearly 2X. I do agree that the behavior is better. However moving forward this means that even simple functions like even? are 100X slower than their Clojure JVM counterparts. There&apos;s nothing &quot;micro-optimization&quot; about 2 orders of magnitude.&lt;/p&gt;</comment>
                    <comment id="29379" author="dnolen" created="Wed, 5 Sep 2012 10:06:12 -0500"  >&lt;p&gt;Oops after a lot more testing and playing around with your patch I turned out to be very wrong! It looks your patch + a boolean type hint is a win across the board on all engines, both in terms of performance and correctness.&lt;/p&gt;</comment>
                    <comment id="29380" author="dnolen" created="Wed, 5 Sep 2012 10:07:21 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3c210d9430b30ffeac9600ae4851e1c347c2cced&quot;&gt;http://github.com/clojure/clojurescript/commit/3c210d9430b30ffeac9600ae4851e1c347c2cced&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29382" author="bbloom" created="Wed, 5 Sep 2012 11:40:48 -0500"  >&lt;p&gt;Heh. Performance is hard &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="11474" name="CLJS-370-v1.patch" size="1708" author="bbloom" created="Mon, 3 Sep 2012 15:29:58 -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-352] Protocols cannot be imported using :use :only</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-352</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When protocol is imported using :use :only, it is not fully recognized in code. If we have protocol Map, defined in map.cljs, imported to google.cljs, name of generated method looks like this:&lt;/p&gt;

&lt;p&gt;locations.google.Google.prototype.locations$google$Map$init$arity$4&lt;/p&gt;

&lt;p&gt;When protocol is imported using :require :as, generated name is correct and looks like this:&lt;/p&gt;

&lt;p&gt;locations.google.Google.prototype.locations$map$Map$init$arity$4&lt;/p&gt;

&lt;p&gt;`satisfies?` also is saying that record is not implementing protocol, when :use :only is used. I hope what I wrote makes sense. If it does not, I&apos;m happy to provide more details.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15617">CLJS-352</key>
            <summary>Protocols cannot be imported using :use :only</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="piranha">Alexander Solovyov</reporter>
                        <labels>
                    </labels>
                <created>Wed, 8 Aug 2012 15:24:47 -0500</created>
                <updated>Tue, 4 Sep 2012 10:01:25 -0500</updated>
                    <resolved>Tue, 4 Sep 2012 10:01:24 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29304" author="dnolen" created="Thu, 30 Aug 2012 18:12:54 -0500"  >&lt;p&gt;Please provide more details. What does your ns expression look like?&lt;/p&gt;</comment>
                    <comment id="29312" author="piranha" created="Fri, 31 Aug 2012 02:33:39 -0500"  >&lt;p&gt;This is a change which fixed the problem for me:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/piranha/cj-locations/commit/0466661b7920a770626e4de5e955d645fbe02ba7#L1L5&quot;&gt;https://github.com/piranha/cj-locations/commit/0466661b7920a770626e4de5e955d645fbe02ba7#L1L5&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Map is a protocol here.&lt;/p&gt;</comment>
                    <comment id="29316" author="dnolen" created="Fri, 31 Aug 2012 09:02:25 -0500"  >&lt;p&gt;I just tested the following:&lt;/p&gt;

&lt;p&gt;In a file called clj-play.core I have:&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 cljs-play.core
  (:use [cljs-play.protos :only [IFoo -foo]]))

(set! *print-fn* (fn [&amp;amp; xs] (apply js/print xs)))

(deftype Bar []
  IFoo
  (-foo [_]
    :foo))

(println (-foo (Bar.)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;in a file call cljs-play.protos I have:&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 cljs-play.protos)

(defprotocol IFoo
  (-foo [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;]))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This works just fine for me. Can you create a reproducible case like this? Are you using ClojureScript master? Or the last release (which is quite old).&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;</comment>
                    <comment id="29318" author="piranha" created="Fri, 31 Aug 2012 09:05:16 -0500"  >&lt;p&gt;I was using last release. I&apos;ll try switching to master to check if it&apos;s fixed already.&lt;/p&gt;</comment>
                    <comment id="29352" author="piranha" created="Tue, 4 Sep 2012 07:41:26 -0500"  >&lt;p&gt;Seems to be fixed in master.&lt;/p&gt;</comment>
                    <comment id="29356" author="dnolen" created="Tue, 4 Sep 2012 10:01:25 -0500"  >&lt;p&gt;fixed 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-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-346] CLJS-319 broke behavior of println when given no arguments</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-346</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;It should print an empty string, not nil. See &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-319&quot; title=&quot;missing spaces when printing the same thing more than once&quot;&gt;&lt;del&gt;CLJS-319&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15602">CLJS-346</key>
            <summary>CLJS-319 broke behavior of println when given no arguments</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Thu, 26 Jul 2012 19:51:37 -0500</created>
                <updated>Mon, 3 Sep 2012 14:48:58 -0500</updated>
                    <resolved>Mon, 3 Sep 2012 14:48:58 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29135" author="dnolen" created="Tue, 14 Aug 2012 06:43:41 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/5035eb975298f20a246d28193deac8e56e603520&quot;&gt;http://github.com/clojure/clojurescript/commit/5035eb975298f20a246d28193deac8e56e603520&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29341" author="bbloom" created="Mon, 3 Sep 2012 14:21:56 -0500"  >&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-319&quot; title=&quot;missing spaces when printing the same thing more than once&quot;&gt;&lt;del&gt;CLJS-319&lt;/del&gt;&lt;/a&gt; broken printing, which 5035eb9 partially fixed. Sadly, 319 also broke the *-str functions as well, which use a slightly different code path. I&apos;m attaching a patch that fixes that.&lt;/p&gt;</comment>
                    <comment id="29342" author="bbloom" created="Mon, 3 Sep 2012 14:23:24 -0500"  >&lt;p&gt;part2 patch attached.&lt;/p&gt;</comment>
                    <comment id="29343" author="dnolen" created="Mon, 3 Sep 2012 14:45:30 -0500"  >&lt;p&gt;Additional patch applied, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/b8fcdf0b1cffb1c0964b5ed34e849c81103c786e&quot;&gt;http://github.com/clojure/clojurescript/commit/b8fcdf0b1cffb1c0964b5ed34e849c81103c786e&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29344" author="dnolen" created="Mon, 3 Sep 2012 14:48:58 -0500"  >&lt;p&gt;fixed&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11472" name="CLJS-346-part2.patch" size="1627" author="bbloom" created="Mon, 3 Sep 2012 14:23:10 -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-360] Analyzer incorrectly merges metadata when redefining vars</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-360</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I&apos;m experimenting with using the analyzer for some more sophisticated macros, including a CPS transform and control constructs. During interactive development, I discovered that the analyzer is incorrectly merging metadata on vars when redefining them. This patch changes redef&apos;s to replace, rather than merge, existing var metadata.&lt;/p&gt;


&lt;p&gt;The patch does not include a test, since the tests don&apos;t currently muck with the analyzer directly. Here&apos;s some code you can play with in your 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;(require &apos;[cljs.analyzer :as ana])
(require &apos;[cljs.compiler :as comp])

(def env (ana/empty-env))

(defn show-foo [form]
  (ana/analyze env form)
  (-&amp;gt; @ana/namespaces (get &apos;cljs.user) :defs (get &apos;x) :foo))

(show-foo &apos;(def ^{:foo 1} x 1))

(show-foo &apos;(def ^{:foo 2} x 1))

(show-foo &apos;(def x 1))  ; before patch, &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; returns 2. After patch, nil.&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15646">CLJS-360</key>
            <summary>Analyzer incorrectly merges metadata when redefining vars</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Sun, 26 Aug 2012 18:22:15 -0500</created>
                <updated>Fri, 31 Aug 2012 11:29:48 -0500</updated>
                    <resolved>Fri, 31 Aug 2012 11:29:48 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29269" author="bbloom" created="Sun, 26 Aug 2012 18:27:39 -0500"  >&lt;p&gt;Also, the patch makes the behavior match JVM Clojure:&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (def ^:foo x)&lt;br/&gt;
#&apos;user/x&lt;br/&gt;
user=&amp;gt; (:foo (meta #&apos;x))&lt;br/&gt;
true&lt;br/&gt;
user=&amp;gt; (def x)&lt;br/&gt;
#&apos;user/x&lt;br/&gt;
user=&amp;gt; (:foo (meta #&apos;x))&lt;br/&gt;
nil&lt;/p&gt;</comment>
                    <comment id="29323" author="dnolen" created="Fri, 31 Aug 2012 09:29:14 -0500"  >&lt;p&gt;Can we get a patch without whitespace changes? Thanks!&lt;/p&gt;</comment>
                    <comment id="29331" author="bbloom" created="Fri, 31 Aug 2012 11:22:41 -0500"  >&lt;p&gt;Updated patch: no longer changes indent/whitespace and resolves conflict with change that happened to master since original patch.&lt;/p&gt;</comment>
                    <comment id="29332" author="dnolen" created="Fri, 31 Aug 2012 11:29:48 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/8355d1eacff667b77551bb60699d5c85b2f15298&quot;&gt;http://github.com/clojure/clojurescript/commit/8355d1eacff667b77551bb60699d5c85b2f15298&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11464" name="redef-meta-2.patch" size="1698" author="bbloom" created="Fri, 31 Aug 2012 11:22:41 -0500" />
                    <attachment id="11455" name="redef-meta.patch" size="3351" author="bbloom" created="Sun, 26 Aug 2012 18:22: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>
                                            <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-60] mod not correctly implemented visavi negative num or div</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-60</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;user=&amp;gt; (map #(mod % 2) (range -2 3))&lt;br/&gt;
(0 1 0 1 0)&lt;br/&gt;
user=&amp;gt; (map #(mod % -2) (range -2 3))&lt;br/&gt;
(0 -1 0 -1 0)&lt;/p&gt;

&lt;p&gt;ClojureScript:cljs.user&amp;gt; (map #(mod % 2) (range -2 3))&lt;br/&gt;
(0 -1 0 1 0)&lt;br/&gt;
ClojureScript:cljs.user&amp;gt; (map #(mod % -2) (range -2 3))&lt;br/&gt;
(0 -1 0 1 0)&lt;/p&gt;</description>
                <environment></environment>
            <key id="14581">CLJS-60</key>
            <summary>mod not correctly implemented visavi negative num or div</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="joav">Jonas Avelin</reporter>
                        <labels>
                    </labels>
                <created>Wed, 24 Aug 2011 23:55:42 -0500</created>
                <updated>Fri, 31 Aug 2012 09:44:11 -0500</updated>
                    <resolved>Fri, 31 Aug 2012 09:44:11 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="26924" author="dnolen" created="Mon, 10 Oct 2011 21:55:04 -0500"  >&lt;p&gt;This an artifact of the fact that mod simply uses JavaScript&apos;s mod operator. It&apos;s not clear to me yet what ClojureScript&apos;s numeric stance is w/ respect to JavaScript.&lt;/p&gt;</comment>
                    <comment id="29330" author="dnolen" created="Fri, 31 Aug 2012 09:44:11 -0500"  >&lt;p&gt;Declined - numerics discussion needs to happen first.&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-142] ClojureScript reader throws TypeError when map keys start with colon then number</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-142</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; (cljs.reader/read-string &lt;span class=&quot;code-quote&quot;&gt;&quot;{:9k &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;}&quot;&lt;/span&gt;)
&lt;span class=&quot;code-quote&quot;&gt;&quot;Error evaluating:&quot;&lt;/span&gt; (cljs.reader/read-string &lt;span class=&quot;code-quote&quot;&gt;&quot;{:9k &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;}&quot;&lt;/span&gt;) :as &lt;span class=&quot;code-quote&quot;&gt;&quot;cljs.reader.read_string.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;,\&quot;&lt;/span&gt;{:9k &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;}\&lt;span class=&quot;code-quote&quot;&gt;&quot;);\n&quot;&lt;/span&gt;
#&amp;lt;TypeError: Cannot read property &apos;length&apos; of &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;&amp;gt;
TypeError: Cannot read property &apos;length&apos; of &lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;
    at http:&lt;span class=&quot;code-comment&quot;&gt;//localhost:8080/javascripts/out/cljs/reader.js:530:38
&lt;/span&gt;    at http:&lt;span class=&quot;code-comment&quot;&gt;//localhost:8080/javascripts/out/cljs/reader.js:534:2
&lt;/span&gt;    at read_keyword (http:&lt;span class=&quot;code-comment&quot;&gt;//localhost:8080/javascripts/out/cljs/reader.js:547:2)
&lt;/span&gt;    at read_delimited_list (http:&lt;span class=&quot;code-comment&quot;&gt;//localhost:8080/javascripts/out/cljs/reader.js:373:32)
&lt;/span&gt;    at read_map (http:&lt;span class=&quot;code-comment&quot;&gt;//localhost:8080/javascripts/out/cljs/reader.js:418:47)
&lt;/span&gt;    at read (http:&lt;span class=&quot;code-comment&quot;&gt;//localhost:8080/javascripts/out/cljs/reader.js:675:115)
&lt;/span&gt;    at read_string (http:&lt;span class=&quot;code-comment&quot;&gt;//localhost:8080/javascripts/out/cljs/reader.js:707:25)
&lt;/span&gt;    at eval at &amp;lt;anonymous&amp;gt; (http:&lt;span class=&quot;code-comment&quot;&gt;//localhost:8080/javascripts/out/clojure/browser/repl.js:21:158)
&lt;/span&gt;    at eval at &amp;lt;anonymous&amp;gt; (http:&lt;span class=&quot;code-comment&quot;&gt;//localhost:8080/javascripts/out/clojure/browser/repl.js:21:158)
&lt;/span&gt;    at http:&lt;span class=&quot;code-comment&quot;&gt;//localhost:8080/javascripts/out/clojure/browser/repl.js:21:153
&lt;/span&gt;nil&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15158">CLJS-142</key>
            <summary>ClojureScript reader throws TypeError when map keys start with colon then number</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="pandeiro">Murphy McMahon</reporter>
                        <labels>
                    </labels>
                <created>Fri, 3 Feb 2012 14:11:17 -0600</created>
                <updated>Fri, 31 Aug 2012 09:43:11 -0500</updated>
                    <resolved>Fri, 31 Aug 2012 09:43:11 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27644" author="pandeiro" created="Fri, 3 Feb 2012 14:21:00 -0600"  >&lt;p&gt;Probably related: the read-string function throws an &quot;Uncaught Invalid number format&quot; for any non-numeric value beginning with a number.&lt;/p&gt;</comment>
                    <comment id="27647" author="dnolen" created="Fri, 3 Feb 2012 19:03:15 -0600"  >&lt;p&gt;After looking over this &lt;a href=&quot;http://clojure.org/reader&quot;&gt;http://clojure.org/reader&lt;/a&gt; I&apos;m not sure that the current behavior is a problem. The fact that keywords that start with numbers happens to work may just be an oversight.&lt;/p&gt;</comment>
                    <comment id="27679" author="pandeiro" created="Mon, 6 Feb 2012 12:03:21 -0600"  >&lt;p&gt;OK, I see. I had wanted to use UUIDs as map keys for quick lookups. I&apos;ll rethink my approach.&lt;/p&gt;</comment>
                    <comment id="27682" author="dnolen" created="Mon, 6 Feb 2012 17:09:50 -0600"  >&lt;p&gt;You can just use regular Strings, Keywords are an illusion anyhow in ClojureScript.&lt;/p&gt;</comment>
                    <comment id="28620" author="netguy204" created="Sun, 27 May 2012 23:40:45 -0500"  >&lt;p&gt;@David&lt;/p&gt;

&lt;p&gt;Digging around LispReader.java in clojure, I found the symbol pattern:&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-quote&quot;&gt;&quot;[:]?([\\D&amp;amp;&amp;amp;[^/]].*/)?([\\D&amp;amp;&amp;amp;[^/]][^/]*)&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Best I can tell, that transcribes directly to the regex the clojurescript reader is using. I&apos;m a bit surprised that clojure allows keywords that start with a number.&lt;/p&gt;

&lt;p&gt;I created a Clojure issue mentioning this: &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1003&quot; title=&quot;:100 is a valid Clojure keyword. Is that intentional?&quot;&gt;CLJ-1003&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29329" author="dnolen" created="Fri, 31 Aug 2012 09:43:11 -0500"  >&lt;p&gt;There is no evidence that this allowed.&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-69] Calling count on args passed to a nodejs main function returns an incorrect number</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-69</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This is an interesting 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;(defn -main [&amp;amp; args]
  (prn (count args)))

(set! *main-cli-fn* -main)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;No matter how many arguments you pass to this application, count always says there are two more. The arguments appear to be fine upon inspection, it&apos;s just the count that is incorrect. I investigated a bit and noticed that node passes two extra arguments that are always dropped before being passed to -main.&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;(prn (count (drop 2 (seq (.argv nodejs/process)))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I tried the above and was surprised to find out that the count was correct.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14611">CLJS-69</key>
            <summary>Calling count on args passed to a nodejs main function returns an incorrect number</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="anthonysimpson">Anthony Simpson</reporter>
                        <labels>
                    </labels>
                <created>Sun, 4 Sep 2011 15:33:32 -0500</created>
                <updated>Fri, 31 Aug 2012 09:41:31 -0500</updated>
                    <resolved>Fri, 31 Aug 2012 09:41:31 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28846" author="dnolen" created="Sun, 17 Jun 2012 12:18:42 -0500"  >&lt;p&gt;Unless we hear whether is still a problem - marking low priority.&lt;/p&gt;</comment>
                    <comment id="29119" author="anthonygrimes" created="Sun, 12 Aug 2012 17:58:06 -0500"  >&lt;p&gt;This appears to have been fixed.&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-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-203] == has different semantics than in Clojure (and than the documentation indicates)</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-203</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Clojure:&lt;/p&gt;

&lt;p&gt;    user=&amp;gt; (== &quot;1&quot; &quot;1&quot;)&lt;br/&gt;
    ClassCastException java.lang.String cannot be cast to java.lang.Number  clojure.lang.Numbers.equiv (Numbers.java:206)&lt;/p&gt;

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

&lt;p&gt;    cljs.user&amp;gt; (== &quot;1&quot; &quot;1&quot;)&lt;br/&gt;
    true&lt;br/&gt;
    cljs.user&amp;gt; (== :a :a)&lt;br/&gt;
    true&lt;/p&gt;

&lt;p&gt;This is rather unsettling behavior which makes the difference between (=) and (==) quite hard to understand when trying out CLJS without knowing Clojure beforehand and the only documentation available is Clojure&apos;s.&lt;/p&gt;

&lt;p&gt;CLJS code tested on &lt;a href=&quot;http://himera.herokuapp.com/index.html&quot;&gt;http://himera.herokuapp.com/index.html&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15362">CLJS-203</key>
            <summary>== has different semantics than in Clojure (and than the documentation indicates)</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="masklinn">Xavier Morel</reporter>
                        <labels>
                    </labels>
                <created>Tue, 24 Apr 2012 15:22:02 -0500</created>
                <updated>Fri, 31 Aug 2012 09:34:32 -0500</updated>
                    <resolved>Fri, 31 Aug 2012 09:34:32 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28270" author="dnolen" created="Wed, 25 Apr 2012 08:58:45 -0500"  >&lt;p&gt;== is only to be used with numbers, even in Clojure. Using anything else will result in unspecified behavior at the moment. We may throw an exception in the future, but we have some thinking to do about that.&lt;/p&gt;</comment>
                    <comment id="28272" author="masklinn" created="Wed, 25 Apr 2012 09:23:07 -0500"  >&lt;p&gt;My main issue is that the documentation for &lt;tt&gt;(==)&lt;/tt&gt; states:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Returns non-nil if nums all have the equivalent value (type-independent), otherwise false&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;This seems to imply non-numbers would return &lt;tt&gt;false&lt;/tt&gt; if it does not error out.&lt;/p&gt;</comment>
                    <comment id="28274" author="dnolen" created="Wed, 25 Apr 2012 09:49:40 -0500"  >&lt;p&gt;The documentation is incorrect at this time. It will probably throw. Again, the ClojureScript numerics situation has not been sorted out thus there are some inconsistencies about. Apologies.&lt;/p&gt;</comment>
                    <comment id="29328" author="dnolen" created="Fri, 31 Aug 2012 09:34:32 -0500"  >&lt;p&gt;This is part of a larger numerics discussion. Any such ticket is essentially a duplicate of 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-277] Thorough review and removal of non-lifted local fns</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-277</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;We should be particularly vigilant of cases in the persistent data structures as unlifted local fns kill perf.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15480">CLJS-277</key>
            <summary>Thorough review and removal of non-lifted local fns</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sat, 26 May 2012 15:38:20 -0500</created>
                <updated>Fri, 31 Aug 2012 09:32:21 -0500</updated>
                    <resolved>Fri, 31 Aug 2012 09:32:21 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28615" author="netguy204" created="Sun, 27 May 2012 15:30:15 -0500"  >&lt;p&gt;Regarding non-lifted local fns: Are you referring to local functions that don&apos;t have any free variables?&lt;/p&gt;

&lt;p&gt;EDIT: Now I&apos;m guessing you&apos;re referring to local fns that v8 and friends don&apos;t lambda-lift. How are you getting that feedback from the js compilers?&lt;/p&gt;</comment>
                    <comment id="28625" author="dnolen" created="Mon, 28 May 2012 13:14:30 -0500"  >&lt;p&gt;In order to preserve expression oriented semantics the compiler wraps code in functions w/ no parameters. Under simple optimizations the Closure compiler will lift the body of the function and unwrap since it sees it&apos;s unnecessary. However Closure will only apply this optimization when functions are not too deeply nested. If a function has not been lifted and unwrapped under simple optimizations then it will not under advanced optimization.&lt;/p&gt;

&lt;p&gt;Code with lots of conditionals seems most susceptible.&lt;/p&gt;</comment>
                    <comment id="29326" author="dnolen" created="Fri, 31 Aug 2012 09:32:21 -0500"  >&lt;p&gt;Looked into this a while back. We seem to be doing pretty well at the moment. The main thing to avoid seems to be nested occurrences of satisfies?.&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-273] support ^Fn type hint</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-273</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;internal reduce is slower than it could be, for operations like + we need to go through the wrapper and check the arguments object etc. If a binding is type hinted as IFn we could do a runtime property check for the specify arity case and dispatch directly falling back on the normal behavior if the property is not found.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15475">CLJS-273</key>
            <summary>support ^Fn type hint</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Fri, 25 May 2012 08:27:40 -0500</created>
                <updated>Fri, 31 Aug 2012 09:30:50 -0500</updated>
                    <resolved>Fri, 31 Aug 2012 09:30:50 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28606" author="dnolen" created="Fri, 25 May 2012 08:34:25 -0500"  >&lt;p&gt;Under advanced optimization there may be no reason to just not always do this? Need to check code size.&lt;/p&gt;</comment>
                    <comment id="28607" author="dnolen" created="Fri, 25 May 2012 10:02:47 -0500"  >&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-275&quot; title=&quot;self calls do not optimize&quot;&gt;&lt;del&gt;CLJS-275&lt;/del&gt;&lt;/a&gt; should be addressed first&lt;/p&gt;</comment>
                    <comment id="28638" author="dnolen" created="Mon, 28 May 2012 20:35:27 -0500"  >&lt;p&gt;One the fence about this, investigating if we can&apos;t just always emit branch/call w/o affecting code-size too much.&lt;/p&gt;</comment>
                    <comment id="29325" author="dnolen" created="Fri, 31 Aug 2012 09:30:50 -0500"  >&lt;p&gt;Not a good since we need to handle regular JS fns.&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-286] optimize regex operations</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-286</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Kevin Lynagh has mentioned that CLJS regex performance is particularly bad compared to JavaScript - we should investigate.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15493">CLJS-286</key>
            <summary>optimize regex operations</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 30 May 2012 11:43:01 -0500</created>
                <updated>Fri, 31 Aug 2012 09:29:53 -0500</updated>
                    <resolved>Fri, 31 Aug 2012 09:29:53 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28727" author="dnolen" created="Tue, 5 Jun 2012 20:06:04 -0500"  >&lt;p&gt;This was likely due to the cost of PeristentVector construction which has been significantly improved. This should be verified.&lt;/p&gt;</comment>
                    <comment id="29324" author="dnolen" created="Fri, 31 Aug 2012 09:29:53 -0500"  >&lt;p&gt;No new complaints.&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-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-336] Hyphenated Protocols</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-336</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;(ns bug)

(defprotocol foo-bar-p
  (qux[&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;])
  (baaz [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; a]))

(defrecord foo-bar []
  foo-bar-p
  (qux [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;] &lt;span class=&quot;code-quote&quot;&gt;&quot;qux&quot;&lt;/span&gt;)
  (baaz [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; a]
    (qux &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;emits&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;bug.foo_bar.prototype.bug$foo_bar_p$qux$arity$1 = function() {
  &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;code-quote&quot;&gt;&quot;qux&quot;&lt;/span&gt;
};
bug.foo_bar.prototype.bug$foo_bar_p$baaz$arity$2 = function(a) {
  &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; a.bug$foo - bar - p$qux$arity$1(a)
};&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Does not work, sounds like a munging issue?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15575">CLJS-336</key>
            <summary>Hyphenated 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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Tue, 10 Jul 2012 11:25:15 -0500</created>
                <updated>Fri, 31 Aug 2012 09:20:37 -0500</updated>
                    <resolved>Fri, 31 Aug 2012 09:20:37 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28968" author="praki" created="Tue, 10 Jul 2012 14:45:32 -0500"  >&lt;p&gt;I think the problem is in protocol-prefix function in compiler.clj. Patch below.&lt;/p&gt;

&lt;p&gt;&amp;#8212;&lt;br/&gt;
 src/clj/cljs/compiler.clj |    2 +-&lt;br/&gt;
 1 files changed, 1 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;, 1 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;diff --git a/src/clj/cljs/compiler.clj b/src/clj/cljs/compiler.clj&lt;br/&gt;
index 5552aa4..180ecb8 100644&lt;br/&gt;
&amp;#8212; a/src/clj/cljs/compiler.clj&lt;br/&gt;
+++ b/src/clj/cljs/compiler.clj&lt;br/&gt;
@@ -554,7 +554,7 @@&lt;br/&gt;
     (when (= :expr context) (emits &quot;})()&quot;))))&lt;/p&gt;

&lt;p&gt; (defn protocol-prefix &lt;span class=&quot;error&quot;&gt;&amp;#91;psym&amp;#93;&lt;/span&gt;&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;(str (-&amp;gt; (str psym) (.replace \. \$) (.replace \/ \$)) &quot;$&quot;))&lt;br/&gt;
+  (clojure.lang.Compiler/munge (str (-&amp;gt; (str psym) (.replace \. \$) (.replace \/ \$)) &quot;$&quot;)))&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt; (defmethod emit :invoke&lt;br/&gt;
   [{:keys &lt;span class=&quot;error&quot;&gt;&amp;#91;f args env&amp;#93;&lt;/span&gt; :as expr}]&lt;br/&gt;
&amp;#8211; &lt;/p&gt;
</comment>
                    <comment id="28969" author="dnolen" created="Tue, 10 Jul 2012 14:52:19 -0500"  >&lt;p&gt;I&apos;m not sure that&apos;s the right place since part of the emissions looks correct, but I could be wrong about that. Also should probably use cljs.compiler/munge.&lt;/p&gt;</comment>
                    <comment id="29319" author="dnolen" created="Fri, 31 Aug 2012 09:20:37 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/9824dbd7c8ac658ebc2d5bc9fa6b5b898f17f659&quot;&gt;http://github.com/clojure/clojurescript/commit/9824dbd7c8ac658ebc2d5bc9fa6b5b898f17f659&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11374" name="0001-Fix-CLJS-336-Hyphenated-Protocols.patch" size="832" author="praki" created="Tue, 10 Jul 2012 14:42: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-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-180] Function params shadow top-level namespace segments</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-180</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Given the following ClojureScript:&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)

(defn bar [] 42)

(ns baz
  (:require [foo :as x]))

(defn quux [foo]
  (x/bar))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;tt&gt;baz.quux&lt;/tt&gt; compiles to:&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;baz.quux = function quux(foo) {
  &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; foo.bar.call(&lt;span class=&quot;code-keyword&quot;&gt;null&lt;/span&gt;)
};&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;i.e. the parameter name shadows the top-level &quot;foo&quot; namespace.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15332">CLJS-180</key>
            <summary>Function params shadow top-level namespace segments</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="harto">Stuart Campbell</reporter>
                        <labels>
                    </labels>
                <created>Fri, 13 Apr 2012 08:48:37 -0500</created>
                <updated>Thu, 30 Aug 2012 22:27:15 -0500</updated>
                    <resolved>Thu, 30 Aug 2012 22:07:18 -0500</resolved>
                                                                    <due></due>
                    <votes>3</votes>
                        <watches>4</watches>
                        <comments>
                    <comment id="28387" author="dnolen" created="Fri, 4 May 2012 13:31:51 -0500"  >&lt;p&gt;A simple solution would be to just gensym all function parameters. Even if we analyzed all the namespaces this might not address foreign JavaScript libs?&lt;/p&gt;</comment>
                    <comment id="28388" author="dnolen" created="Fri, 4 May 2012 13:59:29 -0500"  >&lt;p&gt;After some discussion - we should do the right thing. We should track all namespaces and JS libs that are part of the build and warn on namespace clashes. This does assume we have a sensible analysis order which we currently do not.&lt;/p&gt;</comment>
                    <comment id="28418" author="dnolen" created="Wed, 9 May 2012 18:12:50 -0500"  >&lt;p&gt;Another simple solution? Emit a gensymed alias for all top-level namespace segments. If we see that any binding form uses a known top-level namespace segment resolve to the alias instead.&lt;/p&gt;</comment>
                    <comment id="28848" author="dnolen" created="Sun, 17 Jun 2012 13:16:35 -0500"  >&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-318&quot; title=&quot;resolution conflict between var names and namespace segments&quot;&gt;&lt;del&gt;CLJS-318&lt;/del&gt;&lt;/a&gt; is similar but reveals that we need to handle this in a general way. If a fully namespaced symbol has an initial namespace segment that matches a local, we also need to switch to the namespace alias.&lt;/p&gt;</comment>
                    <comment id="29133" author="dnolen" created="Tue, 14 Aug 2012 05:58:02 -0500"  >&lt;p&gt;Google Closure does not like aliasing of namespaces. Perhaps should just emit namespaces as cljs$core instead of cljs.core? Another (perhaps nicer) option would be just to munge the first segment: cljs$.core&lt;/p&gt;</comment>
                    <comment id="29309" author="dnolen" created="Thu, 30 Aug 2012 22:07:18 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/1c71ab3bff27dc4a099b06e122ec3fdf5a2a8ba8&quot;&gt;http://github.com/clojure/clojurescript/commit/1c71ab3bff27dc4a099b06e122ec3fdf5a2a8ba8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Changing namespaces was too hairy, file lookup and many other things are implicated. Changing the function params and locals was a much simpler fix and it works.&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-366] doseq&apos;s :when clause always fails: &quot;recur not supported here&quot;.</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-366</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;(for &lt;span class=&quot;error&quot;&gt;&amp;#91;i &amp;#39;(0 1 2 3) :when (pos? i)&amp;#93;&lt;/span&gt; i) works correctly, while (doseq &lt;span class=&quot;error&quot;&gt;&amp;#91;i &amp;#39;(0 1 2 3) :when (pos? i)&amp;#93;&lt;/span&gt; i) will throw a java.lang.AssertionError.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15654">CLJS-366</key>
            <summary>doseq&apos;s :when clause always fails: &quot;recur not supported here&quot;.</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="vemv">V&#237;ctor M. Valenzuela</reporter>
                        <labels>
                    </labels>
                <created>Thu, 30 Aug 2012 09:39:35 -0500</created>
                <updated>Thu, 30 Aug 2012 20:06:03 -0500</updated>
                    <resolved>Thu, 30 Aug 2012 19:35:16 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29305" author="dnolen" created="Thu, 30 Aug 2012 19:35:16 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/b73c51a75c58d00e6cbe9c16d94852af8e642880&quot;&gt;http://github.com/clojure/clojurescript/commit/b73c51a75c58d00e6cbe9c16d94852af8e642880&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-39&quot; title=&quot;doseq bindings not properly scoped&quot;&gt;&lt;del&gt;CLJS-39&lt;/del&gt;&lt;/a&gt; was not a real fix and broke :when in doseq. &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-154&quot; title=&quot;let scoping broken inside loop/recur with async calls&quot;&gt;&lt;del&gt;CLJS-154&lt;/del&gt;&lt;/a&gt; fixed the fundamental issue, that we need to track let scopes inside of loops. So we can backout &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-39&quot; title=&quot;doseq bindings not properly scoped&quot;&gt;&lt;del&gt;CLJS-39&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;</comment>
                    <comment id="29308" author="vemv" created="Thu, 30 Aug 2012 20:06:03 -0500"  >&lt;p&gt;Well, that was quick! Thank you very much David.&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-312] Support :import</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-312</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Useful for bringing in ctors.&lt;/p&gt;

&lt;p&gt;See the ggroup discussion:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://groups.google.com/d/topic/clojure/etFN-sdBS6c/discussion&quot;&gt;https://groups.google.com/d/topic/clojure/etFN-sdBS6c/discussion&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15526">CLJS-312</key>
            <summary>Support :import</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="michalmarczyk">Micha&#322; Marczyk</reporter>
                        <labels>
                    </labels>
                <created>Mon, 11 Jun 2012 20:18:15 -0500</created>
                <updated>Thu, 30 Aug 2012 19:50:35 -0500</updated>
                    <resolved>Thu, 30 Aug 2012 19:50:35 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28777" author="michalmarczyk" created="Mon, 11 Jun 2012 20:21:45 -0500"  >&lt;p&gt;No support for prefix lists in this patch, since there is none for other libspec types.&lt;/p&gt;</comment>
                    <comment id="28780" author="dnolen" created="Tue, 12 Jun 2012 07:53:56 -0500"  >&lt;p&gt;By prefix lists, you mean &lt;span class=&quot;error&quot;&gt;&amp;#91;foo.bar Baz Woz ...&amp;#93;&lt;/span&gt; ?&lt;/p&gt;</comment>
                    <comment id="28784" author="tomoj" created="Tue, 12 Jun 2012 15:17:19 -0500"  >&lt;p&gt;This doesn&apos;t seem to work for me. E.g.:&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 &lt;span class=&quot;code-keyword&quot;&gt;import&lt;/span&gt;-test
  (:&lt;span class=&quot;code-keyword&quot;&gt;import&lt;/span&gt; goog.async.Deferred))

(def ^:export d Deferred)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;compiles to:&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;import_test&quot;&lt;/span&gt;);
import_test.d = import_test.Deferred;
goog.exportSymbol(&lt;span class=&quot;code-quote&quot;&gt;&quot;import_test.d&quot;&lt;/span&gt;, import_test.d);&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;edit: Oh, but (Deferred.) does work. That&apos;s what I really want anyway. But the above would be nice, also for e.g.:&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-protocol Foo
  Deferred
  (foo [_]))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="28786" author="michalmarczyk" created="Tue, 12 Jun 2012 21:40:27 -0500"  >&lt;p&gt;@David Nolen &amp;#8211; Yes. I&apos;m quite fond of prefix lists myself, but seeing how they&apos;re not supported for other libspec types... (Whenever the time is ripe for that to change, I&apos;ll be happy to provide a patch. &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;

&lt;p&gt;@Tom Jack &amp;#8211; Thanks, I&apos;ll look into it!&lt;/p&gt;

&lt;p&gt;I guess the precise form of any new patch will need to depend on the resolution to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-272&quot; title=&quot;support :require without :as&quot;&gt;&lt;del&gt;CLJS-272&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;</comment>
                    <comment id="28789" author="dnolen" created="Tue, 12 Jun 2012 23:44:54 -0500"  >&lt;p&gt;Does this patch also handle importing deftypes &amp;amp; defrecords?&lt;/p&gt;</comment>
                    <comment id="28790" author="michalmarczyk" created="Wed, 13 Jun 2012 00:52:23 -0500"  >&lt;p&gt;I wouldn&apos;t expect it to, since types &amp;amp; records are fundamentally different to GClosure classes in that they don&apos;t constitute separate &quot;dependencies&quot;. For this reason e.g. (:require clojure.core.reducers.Cat) won&apos;t work, whereas (:require goog.string.StringBuffer) works fine.&lt;/p&gt;

&lt;p&gt;It would be straightforward to have, say, (:import foo.bar/Quux) pull in Quux from the foo.bar ns. Of course that&apos;s already possible with :use / :require :refer, plus this kind of syntax would constitute a departure from the current state of affairs in Clojure; but if it seems worthwhile, I&apos;ll be happy to adjust the patch / provide a new one to support this.&lt;/p&gt;

&lt;p&gt;Figuring out automagically whether a GClosure-style dependency or a native type is needed would be somewhat more involved, I think. I&apos;ll need to think about what exactly might be required.&lt;/p&gt;

&lt;p&gt;Incidentally, I wonder if there&apos;s any chance of Clojure supporting deftype/defrecord in use/require... I&apos;ll think about this some more, see if I can find anything on the topic in clojure-dev archives and possibly bring it up and/or produce a patch.&lt;/p&gt;

&lt;p&gt;In any event, I&apos;ll be attaching a new patch ready for application on current master. It does seem to address Tom&apos;s issue at least.&lt;/p&gt;</comment>
                    <comment id="28791" author="michalmarczyk" created="Wed, 13 Jun 2012 01:37:38 -0500"  >&lt;p&gt;Some random thoughts re: how much of a problem treating records/types in :import otherwise than as in Clojure would be: we have {-&amp;gt;Foo} and {map-&amp;gt;Foo} for records; types are close to the metal, particularly perf-conscious users will already expect to be exposed to some platform details etc.&lt;/p&gt;

&lt;p&gt;What do you think?&lt;/p&gt;</comment>
                    <comment id="28800" author="tomoj" created="Wed, 13 Jun 2012 21:36:22 -0500"  >&lt;p&gt;With (ns foo (:import goog.async.Deferred)), this does not seem to require goog.async.Deferred (so you get an error about missing &apos;Deferred&apos; property on undefined).&lt;/p&gt;

&lt;p&gt;Does the test pass because goog.string is required elsewhere?&lt;/p&gt;</comment>
                    <comment id="28822" author="dnolen" created="Fri, 15 Jun 2012 15:17:16 -0500"  >&lt;p&gt;After pondering this some more. I wonder if :import should simply be restricted to the Google namespaces? I don&apos;t really see another case for it. Related - a warning from :require about specs that look 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;(:require [goog.foo.Bar :as Bar])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Should be pretty simple to detect. It could suggest the correct :import.&lt;/p&gt;</comment>
                    <comment id="28823" author="michalmarczyk" created="Fri, 15 Jun 2012 19:59:37 -0500"  >&lt;p&gt;@Tom: The test is indeed flawed since StringBuffer is being required by core, thanks for pointing this out! I need to use some Closure &quot;class&quot; which is available in the version of Closure library used by ClojureScript, but not required elsewhere.&lt;/p&gt;

&lt;p&gt;Not sure what the story is re: g.a.Deferred. I understand you&apos;re seeing that behaviour in a project where bringing it in with a :require does work? At any rate, I&apos;ll be preparing a new version of the patch soon; I&apos;ll make double sure it works for me on some non-trivial case.&lt;/p&gt;

&lt;p&gt;@David: I think convenience of working with GClosure classes is the no. 1 reason :import might be useful, so thus restricting it or introducing a restricted version first and only expanding it to cover types/records later seems ok to me. It occurred to me that types/records could be goog.provide&apos;d in the JS output unless, say, goog.provide calls must occur early in the file, which I don&apos;t know to be or not to be the case &amp;#8211; will check that later; if this turns out to work fine, we might as well support the full Clojure-like behaviour.&lt;/p&gt;

&lt;p&gt;Re: warning, do you consider that :require form strictly incorrect? Is any :require spec of the form &lt;span class=&quot;error&quot;&gt;&amp;#91;a.b.Foo :as Foo&amp;#93;&lt;/span&gt; always incorrect (as opposed to not the most elegant way to go about it etc.)? Honest questions both.&lt;/p&gt;</comment>
                    <comment id="28825" author="michalmarczyk" created="Fri, 15 Jun 2012 23:30:35 -0500"  >&lt;p&gt;This patch should actually work. The test now uses goog.math.Long and tests both constructor and &quot;static method&quot; calls.&lt;/p&gt;

&lt;p&gt;Support for &quot;static methods&quot; is achieved by implicitly :require&apos;ing the namespace/class :as the final segment of its name. Resolution of the ctor symbol is still handled by a separate :imports entry in the namespace map.&lt;/p&gt;

&lt;p&gt;I haven&apos;t looked into implementing the type/record idea I mentioned before &amp;#8211; that&apos;s coming next (if it works). Not sure if it should be a separate commit, an ammendment to the current one or a separate ticket.&lt;/p&gt;

&lt;p&gt;Re: warnings, I think {:import foo.Bar} should cause foo.Bar to be :require&apos;d anyway. If :require provided an option to :import &amp;#8211; (:require &lt;span class=&quot;error&quot;&gt;&amp;#91;foo.bar.Quux :as Quux :import true&amp;#93;&lt;/span&gt;), say &amp;#8211; the situation would be entirely analogous to that with :use / :refer (no strong opinion on whether that would be a good idea at this time). Plus there&apos;s nothing broken in (:require &lt;span class=&quot;error&quot;&gt;&amp;#91;foo.Bar :as Bar&amp;#93;&lt;/span&gt;); what is broken is going on to expect that (Bar. ...) will then be a ctor call. So maybe the warning should occur when (Bar. ...) is encountered in a namespace with this sort of :require spec? This sounds like a separate ticket though.&lt;/p&gt;</comment>
                    <comment id="28826" author="michalmarczyk" created="Sat, 16 Jun 2012 00:00:47 -0500"  >&lt;p&gt;Here&apos;s a patch which causes emit :deftype*/:defrecord* to emit goog.provide when compiling a file. It does indeed allow :import to bring in cljs types/records.&lt;/p&gt;

&lt;p&gt;Some notes:&lt;/p&gt;

&lt;p&gt;1. This patch goes out of its way to prevent duplicate goog.provides, because (1) GClosure doesn&apos;t like them, (2) the test suite actually specifies (defrecord A ...) twice. I guess the sensible thing to do may be to fix the test to use unique record names and always emit goog.provide in files.&lt;/p&gt;

&lt;p&gt;2. This could be suppressed in the presence of :private (or similar) metadata on the type/record name.&lt;/p&gt;

&lt;p&gt;3. Assuming this is useful at all, it seems to me it might be better for this to remain in a separate commit and maybe a separate ticket.&lt;/p&gt;

&lt;p&gt;Thoughts?&lt;/p&gt;</comment>
                    <comment id="28830" author="dnolen" created="Sat, 16 Jun 2012 10:46:49 -0500"  >&lt;p&gt;Wow, you really went for it! &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;

&lt;p&gt;What does the patch do to prevent duplicates? If this really solves the issues I see no need for a separate ticket. This brings us in line with Clojure :import semantics I&apos;d say.&lt;/p&gt;</comment>
                    <comment id="28831" author="dnolen" created="Sat, 16 Jun 2012 10:47:57 -0500"  >&lt;p&gt;Oh if this patch works, it would still be nice to issue the warning I mentioned above as it will probably continue to be a source of user error.&lt;/p&gt;</comment>
                    <comment id="28833" author="michalmarczyk" created="Sat, 16 Jun 2012 18:38:14 -0500"  >&lt;p&gt;&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;

&lt;p&gt;There&apos;s a new dynamic Var in the patch, &lt;tt&gt;&amp;#42;emitted-provides&amp;#42;&lt;/tt&gt;, with a root binding of &lt;tt&gt;nil&lt;/tt&gt; and bound to &lt;tt&gt;(atom #{})&lt;/tt&gt; by &lt;tt&gt;compile-file&amp;#42;&lt;/tt&gt; (in the binding form which handles &lt;tt&gt;&amp;#42;out&amp;#42;&lt;/tt&gt;, &lt;tt&gt;&amp;#42;cljs-ns&amp;#42;&lt;/tt&gt; etc.; &lt;tt&gt;&amp;#42;position&amp;#42;&lt;/tt&gt; provides a precedent for binding an Atom to a Var). &lt;tt&gt;goog.provide&lt;/tt&gt; calls are only output when &lt;tt&gt;&amp;#42;emitted-provides&amp;#42;&lt;/tt&gt; is non-&lt;tt&gt;nil&lt;/tt&gt; and &lt;tt&gt;@&amp;#42;emitted-provides&amp;#42;&lt;/tt&gt; does not contain the currently processed symbol (which is then &lt;tt&gt;swap!&lt;/tt&gt;&apos;d in).&lt;/p&gt;

&lt;p&gt;Stipulating that only one type/record can be defined with the given name in a given namespace would make the check around unnecessary, but then we should presumably check for duplicate type names and produce errors of our own (the GClosure error might be a tad cryptic from a user&apos;s POV).&lt;/p&gt;

&lt;p&gt;In any case, outside of the dynamic extent of &lt;tt&gt;compile-file&amp;#42;&lt;/tt&gt;&apos;s bindings &lt;tt&gt;&amp;#42;emitted-provides&amp;#42;&lt;/tt&gt; is &lt;tt&gt;nil&lt;/tt&gt; and so no &lt;tt&gt;goog.provide&lt;/tt&gt; calls are included in the compiled output (so compiling single forms for REPL interactions should work as it did previously).&lt;/p&gt;

&lt;p&gt;As for the warning, I&apos;m still not sure that &lt;tt&gt;:require&lt;/tt&gt; form should be considered an error &amp;#8211; it works fine and might even be what is meant if the user plans on defining a type under the same name. (The alias may be useful for calling &quot;static methods&quot; of the GClosure class.) That is in contrast to broken ctor calls which would work were a &lt;tt&gt;:require&lt;/tt&gt; spec replaced with an &lt;tt&gt;:import&lt;/tt&gt; spec; these are very likely to be errors (and otherwise they&apos;re probably caused by a missing &lt;tt&gt;declare&lt;/tt&gt;), so we could warn when dealing with them (as outlined in my last-but-one comment here) &amp;#8211; say, &quot;bad ctor call, you might want to use :import rather than :require foo.Ctor&quot; when dealing with a &lt;tt&gt;Ctor. ...&lt;/tt&gt; form. Does this sound right?&lt;/p&gt;


&lt;p&gt;@Tom &amp;#8211; the new patch fixes a problem which would have prevented &lt;tt&gt;:import&lt;/tt&gt; from pulling in &lt;tt&gt;g.a.Deferred&lt;/tt&gt; correctly in situations where &lt;tt&gt;:require&lt;/tt&gt; worked fine. Hopefully this was the only such problem (the new &lt;tt&gt;goog.math.Long&lt;/tt&gt; test works fine, so this is likely to be the case). Thanks again for the heads-up!&lt;/p&gt;</comment>
                    <comment id="28835" author="dnolen" created="Sun, 17 Jun 2012 11:12:20 -0500"  >&lt;p&gt;I agree about the :require. Yes a warning about bad ctor calls would be nice - but only if the implementation isn&apos;t overly involved. Otherwise updating the documentation will suffice.&lt;/p&gt;</comment>
                    <comment id="28836" author="dnolen" created="Sun, 17 Jun 2012 11:14:18 -0500"  >&lt;p&gt;I also agree about producing our own warnings about only one type/record.&lt;/p&gt;</comment>
                    <comment id="28853" author="michalmarczyk" created="Sun, 17 Jun 2012 21:46:58 -0500"  >&lt;p&gt;Ok. So we can just emit &lt;tt&gt;goog.provide&lt;/tt&gt; always (as we do for &lt;tt&gt;ns&lt;/tt&gt; forms) and disallow multiple &lt;tt&gt;deftype&lt;/tt&gt; / &lt;tt&gt;defrecord&lt;/tt&gt; calls within a single body of code delivered to GClosure. The attached patch does this (and adjusts the tests appropriately).&lt;/p&gt;

&lt;p&gt;As for providing our own errors, the straightforward approach fails because for some reason &lt;tt&gt;deftype&amp;#42;&lt;/tt&gt; forms get processed by &lt;tt&gt;parse &apos;deftype&amp;#42;&lt;/tt&gt;. No idea why that is (and whether it happens for all such forms or only under special circumstances), will need to investigate. The GClosure error, on second glance, does include the full type name, so the user should be able to deduce what&apos;s wrong, so this patch needn&apos;t necessarily wait for a proper error check of our own.&lt;/p&gt;

&lt;p&gt;Note that this is really about an error rather than a warning &amp;#8211; if we only want to warn about duplicate types (and then handle them gracefully), then the original &lt;tt&gt;goog.provide&lt;/tt&gt; patch is more appropriate (and we need to figure out how to warn the user / deal with the double &lt;tt&gt;parse&lt;/tt&gt;).&lt;/p&gt;

&lt;p&gt;(It would be easy enough to produce the error/warning at emit time rather than in the analyser, avoiding the double &lt;tt&gt;parse&lt;/tt&gt; problem entirely... This just doesn&apos;t feel right though.)&lt;/p&gt;</comment>
                    <comment id="28854" author="michalmarczyk" created="Sun, 17 Jun 2012 22:54:17 -0500"  >&lt;p&gt;Ok, so the last patch is broken in that it causes duplicate type names to become errors at the REPL. The original &lt;tt&gt;goog.provide&lt;/tt&gt; patch doesn&apos;t suffer from this problem.&lt;/p&gt;

&lt;p&gt;Given the above I think the original &lt;tt&gt;goog.provide&lt;/tt&gt; patch may actually be the correct one to use.&lt;/p&gt;

&lt;p&gt;I suppose it could be simplified to emit &lt;tt&gt;goog.provide&lt;/tt&gt; when in &lt;tt&gt;compile-file&amp;#42;&lt;/tt&gt; without regard to which types have been emitted, but that wouldn&apos;t be that much of a simplification and can wait for proper warning/error functionality (which I&apos;m planning to figure out in any case).&lt;/p&gt;</comment>
                    <comment id="28889" author="michalmarczyk" created="Fri, 22 Jun 2012 14:19:28 -0500"  >&lt;p&gt;The original &lt;tt&gt;:import&lt;/tt&gt;-handling logic + the type/record support of the working patch rolled into one commit.&lt;/p&gt;</comment>
                    <comment id="29307" author="dnolen" created="Thu, 30 Aug 2012 19:50:35 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/0f37c9da05442293d0e6b2944c4c3b41aef52f87&quot;&gt;http://github.com/clojure/clojurescript/commit/0f37c9da05442293d0e6b2944c4c3b41aef52f87&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11342" name="0001-CLJS-312-support-import-emit-goog.provide-for-types-.patch" size="8180" author="michalmarczyk" created="Fri, 22 Jun 2012 14:19: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>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-361] Invoking anonymous functions with wrong arity does not produce a warning</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-361</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When an anonymous function is invoked with incorrect arity, no warning message is displayed:&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; (let [f #(&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt; 1)] (f 2)) 
1 
ClojureScript:cljs.user&amp;gt; (let [f (fn [] (&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt; 1))] (f 2)) 
1 
ClojureScript:cljs.user&amp;gt; (let [f (fn [_] (&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt; 1))] (f 2)) 
1 
ClojureScript:cljs.user&amp;gt; (let [f (fn [_ _] (&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt; 1))] (f 2)) 
1 
ClojureScript:cljs.user&amp;gt; (let [f (fn [x y] (&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt; 1))] (f 2)) 
1 
ClojureScript:cljs.user&amp;gt; (defn f [] 1) 
#&amp;lt; 
function f() { 
    &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; 1; 
} 

ClojureScript:cljs.user&amp;gt; (f 2) 
WARNING: Wrong number of args (1) passed to cljs.user/f at line 8 
1&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment>Rhino CLJS REPL</environment>
            <key id="15647">CLJS-361</key>
            <summary>Invoking anonymous functions with wrong arity does not produce a warning</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="kumarshantanu">Shantanu Kumar</reporter>
                        <labels>
                    </labels>
                <created>Mon, 27 Aug 2012 09:03:04 -0500</created>
                <updated>Thu, 30 Aug 2012 18:08:57 -0500</updated>
                    <resolved>Thu, 30 Aug 2012 18:08:57 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29303" author="dnolen" created="Thu, 30 Aug 2012 18:08:57 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/1fd703fa9b23af29c0a02408e939ae2bb1d0ce0e&quot;&gt;http://github.com/clojure/clojurescript/commit/1fd703fa9b23af29c0a02408e939ae2bb1d0ce0e&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-347] extend-type js/String fails for empty string</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-347</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When using extend-type on the Javascript String type, trying to call the protocol method with empty string fails with the following message: &quot;No protocol method ProtocolName.method defined for type string: &quot;&lt;/p&gt;

&lt;p&gt;To repro, compile the include cljs file and run it by opening the esp.html file.&lt;/p&gt;

&lt;p&gt;The output in the Javascript console will be:&lt;br/&gt;
ABC&lt;br/&gt;
Uncaught Error: No protocol method CaseProtocol.case-upper defined for type string: &lt;/p&gt;

&lt;p&gt;The expected output is&lt;br/&gt;
ABC&lt;br/&gt;
&amp;lt;newline&amp;gt;&lt;/p&gt;</description>
                <environment>Last commit in my checkout of clojurescript: b5b20fdc4fa5c9f8a12e527407a72a7e6957bcd6</environment>
            <key id="15604">CLJS-347</key>
            <summary>extend-type js/String fails for empty string</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="brighamb">Brigham Brown</reporter>
                        <labels>
                    </labels>
                <created>Sun, 29 Jul 2012 16:45:39 -0500</created>
                <updated>Wed, 29 Aug 2012 20:43:18 -0500</updated>
                    <resolved>Wed, 29 Aug 2012 20:43:18 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29137" author="dnolen" created="Tue, 14 Aug 2012 06:51:36 -0500"  >&lt;p&gt;I cannot reproduce this. When I test at the repl I see that the protocol fn dispatch for IHash -hash on empty strings work just fine. Can you give more details? Compilation settings, etc?&lt;/p&gt;</comment>
                    <comment id="29138" author="brighamb" created="Tue, 14 Aug 2012 09:31:06 -0500"  >&lt;p&gt;It looks like the problem is that I was doing:&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/&lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt;
    ...)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;instead of:&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 string
    ...)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I looked at core.cljs to deduce the correct way to go about this after reading your comment.&lt;/p&gt;
</comment>
                    <comment id="29297" author="dnolen" created="Wed, 29 Aug 2012 20:43:18 -0500"  >&lt;p&gt;works&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11403" name="empty_string_protocol.cljs" size="363" author="brighamb" created="Sun, 29 Jul 2012 16:45:39 -0500" />
                    <attachment id="11404" name="esp.html" size="242" author="brighamb" created="Sun, 29 Jul 2012 16:45:39 -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-334] (new (some-complex-expr) ...) results in incomprehensible error</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-334</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Here&apos;s a link to a conversation with kovasb on #clojure (can&apos;t seem to find it in Chouser&apos;s logs for some reason):&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;&lt;a href=&quot;http://rotty.xx.vu/irclogs/freenode/%23clojure/2012-06-30/#e598&quot;&gt;http://rotty.xx.vu/irclogs/freenode/%23clojure/2012-06-30/#e598&lt;/a&gt;&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;The problem is that &lt;tt&gt;new&lt;/tt&gt; always fails if given a complex expression (= not a symbol) as the ctor argument. This used not to be the case in earlier ClojureScript releases; the reason it fails now is due to number-of-fields validation not guarding against the non-symbol-ctor-argument case.&lt;/p&gt;

&lt;p&gt;I see two possible solutions: (1) restore the old behaviour while preserving the number-of-fields validation for symbolic ctor args; (2) mandate symbolic-ctor-only usage of &lt;tt&gt;new&lt;/tt&gt; and throw an error with a useful message in &lt;tt&gt;parse &apos;new&lt;/tt&gt;. I&apos;m leaning towards (1), so the forthcoming patch takes this approach. Either approach is easy enough to implement. (I think the way &lt;tt&gt;parse &apos;new&lt;/tt&gt; is written suggests that allowing complex ctor expressions was the original intention; I could be wrong about this though.)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15570">CLJS-334</key>
            <summary>(new (some-complex-expr) ...) results in incomprehensible error</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="michalmarczyk">Micha&#322; Marczyk</reporter>
                        <labels>
                    </labels>
                <created>Tue, 3 Jul 2012 23:04:21 -0500</created>
                <updated>Wed, 29 Aug 2012 20:39:35 -0500</updated>
                    <resolved>Wed, 29 Aug 2012 20:39:35 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28951" author="michalmarczyk" created="Tue, 3 Jul 2012 23:08:44 -0500"  >&lt;p&gt;Allow non-symbolic-ctor args to new while still providing field count warnings when given a symbolic arg.&lt;/p&gt;</comment>
                    <comment id="28952" author="michalmarczyk" created="Tue, 3 Jul 2012 23:11:11 -0500"  >&lt;p&gt;Improved commit message.&lt;/p&gt;</comment>
                    <comment id="28963" author="dnolen" created="Tue, 10 Jul 2012 11:16:02 -0500"  >&lt;p&gt;This doesn&apos;t work in Clojure, you have to refer to a real class. Unless we hear otherwise I see no reason to diverge in this case. Let&apos;s get a better error message.&lt;/p&gt;</comment>
                    <comment id="29165" author="michalmarczyk" created="Wed, 15 Aug 2012 05:04:49 -0500"  >&lt;p&gt;Here&apos;s a patch taking this approach (that is with an assertion requiring that ctor arg to new be a symbol).&lt;/p&gt;</comment>
                    <comment id="29295" author="dnolen" created="Wed, 29 Aug 2012 20:39:35 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/dae155a34cd30dabba94f90e306afac930345dcf&quot;&gt;http://github.com/clojure/clojurescript/commit/dae155a34cd30dabba94f90e306afac930345dcf&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11429" name="0001-CLJS-334-produce-sane-error-message-when-ctor-arg-to.patch" size="780" author="michalmarczyk" created="Wed, 15 Aug 2012 05:04:49 -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-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-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-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-342] Send proper content types when serving JPGs, PNGs and stylesheets.</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-342</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The send-static fn in the browser repl tries to detect the content&lt;br/&gt;
type of a file by it&apos;s pathname extension. This patch adds support for&lt;br/&gt;
JPGs, PNGs and stylesheets as well.&lt;/p&gt;

&lt;p&gt;Without proper content type Chrome and Firefox are refusing to&lt;br/&gt;
apply stylesheets. &lt;/p&gt;</description>
                <environment></environment>
            <key id="15593">CLJS-342</key>
            <summary>Send proper content types when serving JPGs, PNGs and stylesheets.</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="r0man">Roman Scherer</assignee>
                                <reporter username="r0man">Roman Scherer</reporter>
                        <labels>
                    </labels>
                <created>Wed, 25 Jul 2012 12:09:40 -0500</created>
                <updated>Wed, 29 Aug 2012 20:34:32 -0500</updated>
                    <resolved>Wed, 29 Aug 2012 20:34:32 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29039" author="dnolen" created="Wed, 25 Jul 2012 12:28:58 -0500"  >&lt;p&gt;Ah this is for the built-in webserver for simple browser REPL usage correct?&lt;/p&gt;</comment>
                    <comment id="29040" author="r0man" created="Wed, 25 Jul 2012 12:32:45 -0500"  >&lt;p&gt;yep&lt;/p&gt;</comment>
                    <comment id="29136" author="dnolen" created="Tue, 14 Aug 2012 06:45:48 -0500"  >&lt;p&gt;This patch no longer applies. Can we get a new one?&lt;/p&gt;</comment>
                    <comment id="29139" author="r0man" created="Tue, 14 Aug 2012 12:20:26 -0500"  >&lt;p&gt;Sure. Use this one: detect-more-content-types-2.diff&lt;/p&gt;</comment>
                    <comment id="29294" author="dnolen" created="Wed, 29 Aug 2012 20:34:32 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/6b44ea9a191094b4324d7e3ad0bf76bb70413517&quot;&gt;http://github.com/clojure/clojurescript/commit/6b44ea9a191094b4324d7e3ad0bf76bb70413517&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11424" name="detect-more-content-types-2.diff" size="1433" author="r0man" created="Tue, 14 Aug 2012 12:17: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="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-357] Large PersistentVector benchmarks</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-357</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;We need benchmarks for large data structures, e.g. large PVs with shifts greater than 5 (a shift of 20 would perhaps be problematic due to the necessary size of the vector, so probably 10 or 15).&lt;/p&gt;

&lt;p&gt;My first cut at a patch (to be attached in a moment) provides benchmarks for building a large vector without using transients (to get an idea of conj perf), conjing onto a large vector in a situation where this involves a push-tail operation, associng in non-tail position in a large vector and popping a large vector where this involves a pop-tail op.&lt;/p&gt;

&lt;p&gt;The push-tail / pop-tail benchmarks, as written here, are dependent on the exact position of the tail inside the vector; as an alternative, we could benchmark conjing / popping 32 times (max tail length is probably going to be pretty stable). Thoughts?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15633">CLJS-357</key>
            <summary>Large PersistentVector benchmarks</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="michalmarczyk">Micha&#322; Marczyk</reporter>
                        <labels>
                    </labels>
                <created>Fri, 17 Aug 2012 04:15:09 -0500</created>
                <updated>Wed, 29 Aug 2012 20:00:54 -0500</updated>
                    <resolved>Wed, 29 Aug 2012 20:00:54 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29208" author="michalmarczyk" created="Fri, 17 Aug 2012 04:25:31 -0500"  >&lt;p&gt;As mentioned in the discussion on &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-299&quot; title=&quot;PersistentVector push-tail, do-assoc, pop-tail should not contain recursive calls&quot;&gt;CLJS-299&lt;/a&gt;, these benchmarks could use some scrutiny in case they&apos;re not testing what they should be. Also, I wonder if the iteration counts should be greater.&lt;/p&gt;</comment>
                    <comment id="29241" author="dnolen" created="Tue, 21 Aug 2012 17:04:02 -0500"  >&lt;p&gt;Will take a look and report back.&lt;/p&gt;</comment>
                    <comment id="29291" author="dnolen" created="Wed, 29 Aug 2012 19:56:52 -0500"  >&lt;p&gt;Looks good to me.&lt;/p&gt;</comment>
                    <comment id="29292" author="dnolen" created="Wed, 29 Aug 2012 20:00:54 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/52820a1ececb3a66660551102fc456ba43ccafb6&quot;&gt;http://github.com/clojure/clojurescript/commit/52820a1ececb3a66660551102fc456ba43ccafb6&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11438" name="0001-CLJS-357-large-PersistentVector-benchmarks.patch" size="1425" author="michalmarczyk" created="Fri, 17 Aug 2012 04:17:31 -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-363] `format` %s behavior is incorrect for keyword, symbol etc.</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-363</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;On the Clojure REPL, `format` works fine:&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; (format &lt;span class=&quot;code-quote&quot;&gt;&quot;foo%s&quot;&lt;/span&gt; :s) 
&lt;span class=&quot;code-quote&quot;&gt;&quot;foo:s&quot;&lt;/span&gt; 
user=&amp;gt; (format &lt;span class=&quot;code-quote&quot;&gt;&quot;foo%s&quot;&lt;/span&gt; &apos;s) 
&lt;span class=&quot;code-quote&quot;&gt;&quot;foos&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;However, on the CLJS REPL (Rhino), the output is different:&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; (format &lt;span class=&quot;code-quote&quot;&gt;&quot;foo%s&quot;&lt;/span&gt; :s) 
&lt;span class=&quot;code-quote&quot;&gt;&quot;foo &apos;s&quot;&lt;/span&gt; 
ClojureScript:cljs.user&amp;gt; (format &lt;span class=&quot;code-quote&quot;&gt;&quot;foo%s&quot;&lt;/span&gt; &apos;s) 
&lt;span class=&quot;code-quote&quot;&gt;&quot;foo &apos;s&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Reference: &lt;a href=&quot;http://groups.google.com/group/clojure/browse_thread/thread/b253d810536a4046&quot;&gt;http://groups.google.com/group/clojure/browse_thread/thread/b253d810536a4046&lt;/a&gt;&lt;/p&gt;</description>
                <environment>ClojureScript Rhino REPL</environment>
            <key id="15650">CLJS-363</key>
            <summary>`format` %s behavior is incorrect for keyword, symbol etc.</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="kumarshantanu">Shantanu Kumar</reporter>
                        <labels>
                        <label>bug</label>
                    </labels>
                <created>Wed, 29 Aug 2012 09:40:38 -0500</created>
                <updated>Wed, 29 Aug 2012 19:54:29 -0500</updated>
                    <resolved>Wed, 29 Aug 2012 19:54:29 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29289" author="dnolen" created="Wed, 29 Aug 2012 19:54:29 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/bf0622a594473c9a6de57fe3b5d10e0419fc7a2a&quot;&gt;http://github.com/clojure/clojurescript/commit/bf0622a594473c9a6de57fe3b5d10e0419fc7a2a&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-289] Represent ast :children as a vector of keys</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-289</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;See discussion here: &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/vZLVKmKX0oc/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/vZLVKmKX0oc/discussion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Summary: Duplication of ast nodes in various keys and in :children is problematic for some users. In particular, it doesn&apos;t play nicely with printing. A solution is needed which preserves &quot;The AST is data. Period.&quot;&lt;/p&gt;

&lt;p&gt;The attached patch makes no changes to how the sub nodes are currently stored outside of the :children key. Instead, it replaces :children values with a vector of keys into the main ast node. This preserves child ordering and allows a children function to be defined as:&lt;/p&gt;

&lt;p&gt;(defn children &lt;span class=&quot;error&quot;&gt;&amp;#91;ast&amp;#93;&lt;/span&gt;&lt;br/&gt;
  (mapcat #(if (coll? %) % &lt;span class=&quot;error&quot;&gt;&amp;#91;%&amp;#93;&lt;/span&gt;) ((apply juxt (:children ast)) ast)))&lt;/p&gt;

&lt;p&gt;The attached patch has two caveats: 1) Many (but not all?) blocks will now be present in the children hierarchy as &apos;do forms. 2) Interleaved forms are intentionally bugged with respect to ordering. The :children vector for those forms match the actual behavior, not the expected behavior. This can be fixed along with &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-288&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-288&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15497">CLJS-289</key>
            <summary>Represent ast :children as a vector of keys</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Thu, 31 May 2012 17:51:17 -0500</created>
                <updated>Wed, 29 Aug 2012 00:09:12 -0500</updated>
                    <resolved>Tue, 5 Jun 2012 08:09:05 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="28692" author="dnolen" created="Sun, 3 Jun 2012 10:00:41 -0500"  >&lt;p&gt;the result of the discussion did not end with agreement on representing :children as a vector of keys&lt;/p&gt;</comment>
                    <comment id="28694" author="bbloom" created="Sun, 3 Jun 2012 11:24:01 -0500"  >&lt;p&gt;I realize that, but it was one approach suggested and seemed entirely viable, so I tried it. From what I can tell, it seems like a solution that meets all of the criteria that came up during the discussion.&lt;/p&gt;

&lt;p&gt;Did I overlook a requirement?&lt;/p&gt;

&lt;p&gt;Who is currently using :children and could weigh in on whether or not this still meets their needs?&lt;/p&gt;</comment>
                    <comment id="28696" author="jonase" created="Sun, 3 Jun 2012 11:52:00 -0500"  >&lt;p&gt;I&apos;m using :children and I don&apos;t think this patch (currently) meets my needs. At least {:op :let ...} is broken IMO. (something like `(map :init bes)` is missing from the patch) &lt;/p&gt;</comment>
                    <comment id="28697" author="bbloom" created="Sun, 3 Jun 2012 12:09:10 -0500"  >&lt;p&gt;Ah OK, you&apos;re right. It&apos;s the same problem there that I ran into with :statements and analyze-block: There is a pseudo AST node that needs to be traversed down into.&lt;/p&gt;

&lt;p&gt;The easy fix for that here would be to merge {:children &lt;span class=&quot;error&quot;&gt;&amp;#91;:init&amp;#93;&lt;/span&gt;} into each binding, but the binding hash will be missing :op and :form. For analyze-block, I was able to use :op :do and :form (list &apos;do ...), but there isn&apos;t an obvious analogy here without inventing a :binding op or relaxing the requirement for :op and :form.&lt;/p&gt;

&lt;p&gt;Interestingly, each successive binding can be treated as a single nested binding. What if we defined let as a macro which expands to a series of let1 forms? (let &lt;span class=&quot;error&quot;&gt;&amp;#91;x 1 y 2&amp;#93;&lt;/span&gt; (* x y)) --&amp;gt; (let1 &lt;span class=&quot;error&quot;&gt;&amp;#91;x 1&amp;#93;&lt;/span&gt; (let1 &lt;span class=&quot;error&quot;&gt;&amp;#91;y 2&amp;#93;&lt;/span&gt; (* x y))&lt;/p&gt;

&lt;p&gt;That may increase the depth of the AST, but it would really simplify traversal into binding clauses. Each let op would have :name, :init, and children as &lt;span class=&quot;error&quot;&gt;&amp;#91;:init&amp;#93;&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;In general, it may be worth while to consider doing the same thing with the various analyze-blocks situations, such that &apos;do is the only place multiple statements can occur.&lt;/p&gt;</comment>
                    <comment id="28698" author="bbloom" created="Sun, 3 Jun 2012 12:16:27 -0500"  >&lt;p&gt;Er, I mean: a hypothetical let1 op would have children &lt;span class=&quot;error&quot;&gt;&amp;#91;:init :statements :ret&amp;#93;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;However, if you also expanded the implicit do blocks, you&apos;d be able to simplify to &lt;span class=&quot;error&quot;&gt;&amp;#91;:init :body&amp;#93;&lt;/span&gt; or something like that.&lt;/p&gt;</comment>
                    <comment id="28699" author="bbloom" created="Sun, 3 Jun 2012 12:34:16 -0500"  >&lt;p&gt;Forgive me for repeatedly commenting, but it also occurs to me that you can change &apos;do to a macro which expands to a series of &apos;do2 forms:&lt;/p&gt;

&lt;p&gt;(do x y z) --&amp;gt; (do2 x (do2 y z)) or (do2 (do2 x y) z)&lt;/p&gt;

&lt;p&gt;That do2 op could have children &lt;span class=&quot;error&quot;&gt;&amp;#91;:left :right&amp;#93;&lt;/span&gt; and all other :statements and :ret children could be simplified down to &apos;do2 expansions.&lt;/p&gt;

&lt;p&gt;With that in mind, the children fn becomes simply (defn children &lt;span class=&quot;error&quot;&gt;&amp;#91;ast&amp;#93;&lt;/span&gt; ((apply juxt (:children ast)) ast)) and a lot of analyze and emit code gets much simpler by not having to map over many collections all over the place.&lt;/p&gt;

&lt;p&gt;Kinda a wild idea and probably not the right forum for it, but worth suggesting. Thoughts?&lt;/p&gt;</comment>
                    <comment id="28710" author="dnolen" created="Mon, 4 Jun 2012 11:35:32 -0500"  >&lt;p&gt;I see little benefit to changing core macros. I also see no problem with creating a :binding ast node.&lt;/p&gt;</comment>
                    <comment id="28717" author="jonase" created="Tue, 5 Jun 2012 00:44:40 -0500"  >&lt;p&gt;Every node (i.e. an map with :op, :form and :env keys, called an &quot;Expression Object&quot; in the docstring for analyze) in ClojureScript corresponds to a self-contained expression. A binding form is not self-contained, it is a part of the let expression.&lt;/p&gt;

&lt;p&gt;Another similar example is functions. There is a node {:op :fn ...} but there is no {:op :fn-method} even thou there are maps under the :methods key describing function methods. The same argument goes for this: A function method is not self-contained, it is part of the function and should not be a node.&lt;/p&gt;

&lt;p&gt;The nodes (expression objects) which make up the ClojureScript AST seems to be really well thought out and I would be careful in making the proposed change.&lt;/p&gt;</comment>
                    <comment id="28719" author="dnolen" created="Tue, 5 Jun 2012 08:09:05 -0500"  >&lt;p&gt;Agreed I think it&apos;s far too early to have a ticket for this. Confluence page first.&lt;/p&gt;</comment>
                    <comment id="29283" author="bbloom" created="Wed, 29 Aug 2012 00:09:12 -0500"  >&lt;p&gt;Design page here: &lt;a href=&quot;http://dev.clojure.org/display/design/AST+children&quot;&gt;http://dev.clojure.org/display/design/AST+children&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11276" name="children-keys.patch" size="8838" author="bbloom" created="Thu, 31 May 2012 17:51:17 -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-356] `read-string` exception message should be the same as in Clojure</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-356</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When I run (read-string &quot;&quot;), I get the exception message &quot;EOF while reading&quot; on Clojure (clojure.core) but on ClojureScript (cljs.reader) the message is just &quot;EOF&quot;.&lt;/p&gt;

&lt;p&gt;ClojureScript&apos;s `read-string` should be fixed to match the error message &quot;EOF while reading&quot;.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href=&quot;https://groups.google.com/forum/?fromgroups#!topic/clojure/k-ZX5MaXoiQ%5B1-25%5D&quot;&gt;https://groups.google.com/forum/?fromgroups#!topic/clojure/k-ZX5MaXoiQ%5B1-25%5D&lt;/a&gt;&lt;/p&gt;</description>
                <environment>ClojureScript (Rhino REPL, browser, PhantomJS)</environment>
            <key id="15631">CLJS-356</key>
            <summary>`read-string` exception message should be the same as in Clojure</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="kumarshantanu">Shantanu Kumar</reporter>
                        <labels>
                        <label>reader</label>
                    </labels>
                <created>Thu, 16 Aug 2012 08:50:06 -0500</created>
                <updated>Fri, 17 Aug 2012 00:40:51 -0500</updated>
                    <resolved>Fri, 17 Aug 2012 00:40:51 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29206" author="dnolen" created="Fri, 17 Aug 2012 00:40:51 -0500"  >&lt;p&gt;Fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/df6f316acdc3375ea6de29b7700dac1a5c8e9dbe&quot;&gt;http://github.com/clojure/clojurescript/commit/df6f316acdc3375ea6de29b7700dac1a5c8e9dbe&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-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-351] replace .-length usage with alength </title>
                <link>http://dev.clojure.org/jira/browse/CLJS-351</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15614">CLJS-351</key>
            <summary>replace .-length usage with alength </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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 5 Aug 2012 16:42:40 -0500</created>
                <updated>Tue, 14 Aug 2012 05:34:02 -0500</updated>
                    <resolved>Thu, 9 Aug 2012 09:35:04 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29092" author="raph_amiard" created="Thu, 9 Aug 2012 06:08:11 -0500"  >&lt;p&gt;Patch was tested and working with V8/SpiderMonkey&lt;/p&gt;</comment>
                    <comment id="29094" author="dnolen" created="Thu, 9 Aug 2012 09:35:04 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/f94d57f9e4e953085c2945d915c3e609eb92f956&quot;&gt;http://github.com/clojure/clojurescript/commit/f94d57f9e4e953085c2945d915c3e609eb92f956&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29131" author="wagjo" created="Tue, 14 Aug 2012 01:38:08 -0500"  >&lt;p&gt;this patch changes also the definition of alength, which calls itself. This results in the stack overflow. I&apos;ve attached a new patch to fix this.&lt;/p&gt;</comment>
                    <comment id="29132" author="dnolen" created="Tue, 14 Aug 2012 05:34:02 -0500"  >&lt;p&gt;alength issue should be fixed in master.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11415" name="0001-CLJS-351-replace--length-usage-with-alength.patch" size="12047" author="raph_amiard" created="Thu, 9 Aug 2012 06:08:11 -0500" />
                    <attachment id="11423" name="alength-macro.patch" size="331" author="wagjo" created="Tue, 14 Aug 2012 02:28:25 -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-354] node.js sys is now util</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-354</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Whenever one compiles anything targeting node.js, running the result prints the following output:&lt;/p&gt;

&lt;p&gt;The &quot;sys&quot; module is now called &quot;util&quot;. It should have a similar interface.&lt;/p&gt;

&lt;p&gt;Looks like this happened in recent versions of node.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15626">CLJS-354</key>
            <summary>node.js sys is now util</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="anthonysimpson">Anthony Simpson</reporter>
                        <labels>
                    </labels>
                <created>Sat, 11 Aug 2012 20:47:46 -0500</created>
                <updated>Sat, 11 Aug 2012 21:03:50 -0500</updated>
                    <resolved>Sat, 11 Aug 2012 21:03:50 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29113" author="dnolen" created="Sat, 11 Aug 2012 21:03:50 -0500"  >&lt;p&gt;fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/67e120c53774cae1a71b0a021fcdd5e3f8f888ab&quot;&gt;http://github.com/clojure/clojurescript/commit/67e120c53774cae1a71b0a021fcdd5e3f8f888ab&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-350] record printed form is inconsistent with Clojure</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-350</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;ClojureScript:cljs.user&amp;gt; (defrecord Bar &lt;span class=&quot;error&quot;&gt;&amp;#91;x&amp;#93;&lt;/span&gt;)&lt;br/&gt;
cljs.user/Bar&lt;br/&gt;
ClojureScript:cljs.user&amp;gt; (Bar. 1)&lt;br/&gt;
#Bar{:x 1}&lt;/p&gt;

&lt;p&gt;Clojure 1.4.0&lt;br/&gt;
user=&amp;gt; (defrecord Bar &lt;span class=&quot;error&quot;&gt;&amp;#91;x&amp;#93;&lt;/span&gt;)&lt;br/&gt;
user.Bar&lt;br/&gt;
user=&amp;gt; (Bar. 1)&lt;br/&gt;
#user.Bar{:x 1}&lt;/p&gt;

&lt;p&gt;This makes round-tripping records between Clojure and Clojurescript challenging.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15612">CLJS-350</key>
            <summary>record printed form is inconsistent with Clojure</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="netguy204">Brian Taylor</reporter>
                        <labels>
                    </labels>
                <created>Thu, 2 Aug 2012 20:01:26 -0500</created>
                <updated>Wed, 8 Aug 2012 21:28:15 -0500</updated>
                    <resolved>Wed, 8 Aug 2012 21:28:15 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29079" author="netguy204" created="Thu, 2 Aug 2012 20:38:34 -0500"  >&lt;p&gt;This makes the printed form of a record consistent with Clojure.&lt;/p&gt;</comment>
                    <comment id="29091" author="dnolen" created="Wed, 8 Aug 2012 21:28:15 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/fe7adc4ef5a5cbe68b628f97c2cb56c59057a753&quot;&gt;http://github.com/clojure/clojurescript/commit/fe7adc4ef5a5cbe68b628f97c2cb56c59057a753&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11409" name="0001-record-printed-forms-that-are-consistent-with-Clojur.patch" size="1074" author="netguy204" created="Thu, 2 Aug 2012 20:38:34 -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-348] Failure when using seq keys for PersistentHashMap</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-348</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;If you create a PersistentHashMap with a key that is a seq, lookup on that key 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; 
ClojureScript:cljs.user&amp;gt; ((hash-map (seq [1 2]) :a) [1 2])
nil
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
</description>
                <environment>Issue occurs with checkout of master from github at commit 8ce31243da0dd031c278a702088f5d1b95a05ec7.</environment>
            <key id="15605">CLJS-348</key>
            <summary>Failure when using seq keys for PersistentHashMap</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="maport">Michael Porter</reporter>
                        <labels>
                    </labels>
                <created>Mon, 30 Jul 2012 07:28:47 -0500</created>
                <updated>Wed, 1 Aug 2012 03:21:55 -0500</updated>
                    <resolved>Tue, 31 Jul 2012 19:54:56 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29065" author="bronsa" created="Tue, 31 Jul 2012 19:03:47 -0500"  >&lt;p&gt;The bug was due to ChunkedSeq not implementing IHash.&lt;/p&gt;

&lt;p&gt;The following patch makes ChunkedSeq as well as ChunkedCons implement IHash.&lt;br/&gt;
Contains a simple test case&lt;/p&gt;</comment>
                    <comment id="29069" author="dnolen" created="Tue, 31 Jul 2012 19:54:56 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/6348f9749d8901bc708f954014f685535675a822&quot;&gt;http://github.com/clojure/clojurescript/commit/6348f9749d8901bc708f954014f685535675a822&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29071" author="maport" created="Wed, 1 Aug 2012 03:21:55 -0500"  >&lt;p&gt;Thanks for the speedy fix. Works for me.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11406" name="001-CLJS-348.patch" size="3173" author="bronsa" created="Tue, 31 Jul 2012 19:03: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>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-343] make clojure.reflect fns conform to standard names</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-343</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;clojure.reflect/doc, clojure.reflect/meta etc&lt;/p&gt;</description>
                <environment></environment>
            <key id="15595">CLJS-343</key>
            <summary>make clojure.reflect fns conform to standard names</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="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Wed, 25 Jul 2012 14:33:02 -0500</created>
                <updated>Sun, 29 Jul 2012 18:52:59 -0500</updated>
                    <resolved>Sun, 29 Jul 2012 18:52:59 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29042" author="zachallaun" created="Wed, 25 Jul 2012 15:27:01 -0500"  >&lt;p&gt;I&apos;d be happy to submit a patch that does this. I chose the query-* names for fns because I didn&apos;t want to give the impression that they retained the same semantics as their Clojure JVM counterparts (they currently work with async callbacks). I intended the eventual synchronous implementation to use the standard names. &lt;/p&gt;</comment>
                    <comment id="29053" author="zachallaun" created="Fri, 27 Jul 2012 12:17:02 -0500"  >&lt;p&gt;Attached patch standardizes names. clojure.reflect/macroexpand will also now print a pretty-printed string to make longer macroexpansions readable.&lt;/p&gt;</comment>
                    <comment id="29059" author="dnolen" created="Sun, 29 Jul 2012 18:52:59 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/8ce31243da0dd031c278a702088f5d1b95a05ec7&quot;&gt;http://github.com/clojure/clojurescript/commit/8ce31243da0dd031c278a702088f5d1b95a05ec7&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11402" name="cljs-343.diff" size="2850" author="zachallaun" created="Fri, 27 Jul 2012 12:17:02 -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-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