<!--
RSS generated by JIRA (4.4#649-r158309) at Fri May 24 10:30:17 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&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</link>
        <description>An XML representation of a search request</description>
                <language>en-us</language>
                        <issue start="0" end="508" total="508"/>
                <build-info>
            <version>4.4</version>
            <build-number>649</build-number>
            <build-date>25-07-2011</build-date>
        </build-info>
<item>
            <title>[CLJS-509] Spurious warning about symbol not being a protocol</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-509</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;&quot;lein cljsbuild&quot; generates &quot;Symbol X is not a protocol&quot; warning. The following code snippet reproduces the issue. Renaming &quot;my.foo&quot; namespace to &quot;foo&quot; compiles with no warning.&lt;/p&gt;

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

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

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

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

&lt;p&gt;cljs output:&lt;br/&gt;
WARNING: Symbol foo/IFoo is not a protocol at line 5 src/fubar.cljs&lt;/p&gt;
</description>
                <environment>Clojure 1.5.1, ClojureScript, cljsbuild 0.3.2</environment>
            <key id="16196">CLJS-509</key>
            <summary>Spurious warning about symbol not being a protocol</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="praki">Praki Prakash</reporter>
                        <labels>
                    </labels>
                <created>Tue, 21 May 2013 09:22:44 -0500</created>
                <updated>Tue, 21 May 2013 09:22:44 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                    <attachment id="12001" name="foo.cljs" size="46" author="praki" created="Tue, 21 May 2013 09:22:44 -0500" />
                    <attachment id="12002" name="fubar.cljs" size="90" author="praki" created="Tue, 21 May 2013 09:22:44 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-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="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>Tue, 21 May 2013 05:51:11 -0500</created>
                <updated>Thu, 23 May 2013 03:10:17 -0500</updated>
                    <resolved>Tue, 21 May 2013 10:03:02 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="31124" author="dnolen" created="Tue, 21 May 2013 09:59:26 -0500"  >&lt;p&gt;Thanks for the patch. I doubt that array push is inefficient, but I imagine the regularity of TransientVector operations is something that V8 likes.&lt;/p&gt;</comment>
                    <comment id="31125" author="dnolen" created="Tue, 21 May 2013 10:03:02 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/30bb0b9e55fb77cdfe952fbf5df763a25c4a25c5&quot;&gt;http://github.com/clojure/clojurescript/commit/30bb0b9e55fb77cdfe952fbf5df763a25c4a25c5&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="31133" author="dnolen" created="Wed, 22 May 2013 23:36:23 -0500"  >&lt;p&gt;BTW I notice you haven&apos;t submitted your Contributor Agreement (unless I&apos;m mistaken). Please send that in at your earliest convenience thanks much!&lt;/p&gt;</comment>
                    <comment id="31134" author="skardan" created="Thu, 23 May 2013 03:02:23 -0500"  >&lt;p&gt;Patch for missing IReduce protocol for LazySeq&lt;/p&gt;</comment>
                    <comment id="31135" author="skardan" created="Thu, 23 May 2013 03:10:17 -0500"  >&lt;p&gt;@swannodette: Ok, I will send it today.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="12003" name="0001-Add-IReduce-protocol-to-LazySeq.patch" size="1438" author="skardan" created="Thu, 23 May 2013 03:02:23 -0500" />
                    <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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-480] *cljs-data-readers* is bound to *data-readers* inconsistently</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-480</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;It looks like &lt;tt&gt;&amp;#42;cljs-data-readers&amp;#42;&lt;/tt&gt; is not being bound to &lt;tt&gt;&amp;#42;data-readers&amp;#42;&lt;/tt&gt; where it should be.&lt;/p&gt;

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

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

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

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


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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

<item>
            <title>[CLJS-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-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-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-341] dissoc of optional keys on a Record removes all optional keys</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-341</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;dissoc does not work correctly when removing optional keys from a Record. dissocing an optional key will remove all optional keys.&lt;/p&gt;

&lt;p&gt;The assertion below will fail.&lt;/p&gt;

&lt;p&gt;(defrecord A &lt;span class=&quot;error&quot;&gt;&amp;#91;a b&amp;#93;&lt;/span&gt;)&lt;br/&gt;
(def something (assoc (A. 1 2) :c 3 :d 4))&lt;br/&gt;
(assert (= (set (keys (dissoc something :c))) #{:a :b :d}))&lt;/p&gt;

&lt;p&gt;When dissocing :c, :d is also removed.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15592">CLJS-341</key>
            <summary>dissoc of optional keys on a Record removes all optional keys</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="brentonashworth">Brenton Ashworth</reporter>
                        <labels>
                    </labels>
                <created>Wed, 25 Jul 2012 09:26:23 -0500</created>
                <updated>Wed, 25 Jul 2012 09:28:58 -0500</updated>
                    <resolved>Wed, 25 Jul 2012 09:28:58 -0500</resolved>
                                                                    <due>Tue, 24 Jul 2012 00:00:00 -0500</due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29038" author="brentonashworth" created="Wed, 25 Jul 2012 09:28:58 -0500"  >&lt;p&gt;Fixed with commit 0f73237dce2a1432a2da9760bdd925c45d84a407&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-339] (inc nil) returns 1 instead of throwing an exception</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-339</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;(inc nil) =&amp;gt; 1 in ClojureScript&lt;br/&gt;
(inc nil) =&amp;gt; raise NullPointerException in Clojure&lt;/p&gt;

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

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

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

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

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

<item>
            <title>[CLJS-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-337] Shell scripts in cljs tree incompatible with baseline POSIX sh, cannot deal w/ filenames w/ whitespace</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-337</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;At present, the cljsc wrapper uses an unquoted &lt;tt&gt;$*&lt;/tt&gt; to append all arguments to the end of the Java command running clojure.main, and fails to quote the CLJSC_CP variable dereference.&lt;/p&gt;

&lt;p&gt;This means that both of these values are string-split and glob-expanded, rather than having their contents passed verbatim as individual argv array members. Similar issues occur in failing to properly quote the expansion of SPIDERMONKEY_HOME, JSC_HOME, V8_HOME, etc.&lt;/p&gt;

&lt;p&gt;This will cause a failure if the CLOJURESCRIPT_HOME directory, or the name of the file or directory being compiled, contains whitespace. It also means that the command-line interface has to piece together multiple argv array elements to form the options map, rather than being able to parse it as a single entity, which is unfortunate in and of itself.&lt;/p&gt;

&lt;p&gt;Also, the &lt;tt&gt;==&lt;/tt&gt; operator to test is frequently used. This is a bash extension; baseline POSIX /bin/sh specifies only &lt;tt&gt;=&lt;/tt&gt; as a test operator, and the presence of this extension should not be relied on.&lt;/p&gt;

&lt;p&gt;Also, the [ &quot;x$1&quot; = &quot;xfoo&quot; ] test idiom is used in some cases. This is a holdout from ancient pre-POSIX Bourne shells which could not handle strings starting with &lt;tt&gt;-&lt;/tt&gt; in this position, and is no longer considered good practice for generating readable shell code.&lt;/p&gt;

&lt;p&gt;Also, &lt;tt&gt;&amp;lt;&amp;lt;EOF &amp;gt;file&lt;/tt&gt;, while correct, tends to confuse syntax highlighting in common editors (including bash). The more common ordering &lt;tt&gt;&amp;gt;file &amp;lt;&amp;lt;EOF&lt;/tt&gt; should be used instead.&lt;/p&gt;

&lt;p&gt;Also, dots are not special in glob expressions (unlike regular expressions), and do not need to be quoted.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15578">CLJS-337</key>
            <summary>Shell scripts in cljs tree incompatible with baseline POSIX sh, cannot deal w/ filenames w/ 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="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="charles-dyfis-net">Charles Duffy</reporter>
                        <labels>
                    </labels>
                <created>Mon, 16 Jul 2012 11:17:26 -0500</created>
                <updated>Mon, 16 Jul 2012 17:34:03 -0500</updated>
                    <resolved>Mon, 16 Jul 2012 17:34:03 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28987" author="charles-dyfis-net" created="Mon, 16 Jul 2012 11:18:49 -0500"  >&lt;p&gt;Should have been &quot;common editors (including vim)&quot;&lt;/p&gt;</comment>
                    <comment id="28989" author="dnolen" created="Mon, 16 Jul 2012 17:34:03 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/5c8e1d4ece4f660fdd5b62dc5861c8dc76b7b27c&quot;&gt;http://github.com/clojure/clojurescript/commit/5c8e1d4ece4f660fdd5b62dc5861c8dc76b7b27c&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11383" name="CLJS-shell.patch" size="7896" author="charles-dyfis-net" created="Mon, 16 Jul 2012 11:17: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>
                                            <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-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-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-333] Keyword self-lookups to return default value when appropriate</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-333</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Originally reported by Evan Mezeske in a comment on &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-330&quot; title=&quot;(hash js/undefined) results in trouble (with implications to reasonable CLJS code)&quot;&gt;&lt;del&gt;CLJS-330&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Due to a missing &lt;tt&gt;-invoke&lt;/tt&gt; arity in &lt;tt&gt;cljs.core.Keyword&lt;/tt&gt;&apos;s implementation of &lt;tt&gt;IFn&lt;/tt&gt;, calls like &lt;tt&gt;(:foo {} 1)&lt;/tt&gt; fail to produce the given default value.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15569">CLJS-333</key>
            <summary>Keyword self-lookups to return default value when appropriate</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="michalmarczyk">Micha&#322; Marczyk</reporter>
                        <labels>
                    </labels>
                <created>Tue, 3 Jul 2012 19:22:58 -0500</created>
                <updated>Tue, 3 Jul 2012 19:52:34 -0500</updated>
                    <resolved>Tue, 3 Jul 2012 19:52:34 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28945" author="michalmarczyk" created="Tue, 3 Jul 2012 19:30:52 -0500"  >&lt;p&gt;Note the case with &lt;tt&gt;not-found&lt;/tt&gt; doesn&apos;t bother to check if it&apos;s dealing with an ObjMap. This is because an ObjMap is capable of holding &lt;tt&gt;nil&lt;/tt&gt; or &lt;tt&gt;false&lt;/tt&gt; as a value, so we would still need to call &lt;tt&gt;contains?&lt;/tt&gt; which on an ObjMap does exactly the same work as &lt;tt&gt;-lookup&lt;/tt&gt;, except it returns &lt;tt&gt;true&lt;/tt&gt; / &lt;tt&gt;false&lt;/tt&gt; thus forcing us to pick the correct return value.&lt;/p&gt;</comment>
                    <comment id="28948" author="dnolen" created="Tue, 3 Jul 2012 19:52:34 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/04e44e444f9bf63d2833d8ff9f87fdb32ac9de48&quot;&gt;http://github.com/clojure/clojurescript/commit/04e44e444f9bf63d2833d8ff9f87fdb32ac9de48&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11366" name="0001-CLJS-333-add-missing-arity-to-cljs.core.Keyword-s-IF.patch" size="892" author="michalmarczyk" created="Tue, 3 Jul 2012 19:30: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-332] cljs.core.UUID&apos;s equiv should check that the other object is also a UUID instance</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-332</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Currently UUID instances are considered &lt;tt&gt;=&lt;/tt&gt; to any object with a &lt;tt&gt;uuid&lt;/tt&gt; field containing the same UUID string.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15568">CLJS-332</key>
            <summary>cljs.core.UUID&apos;s equiv should check that the other object is also a UUID instance</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="michalmarczyk">Micha&#322; Marczyk</reporter>
                        <labels>
                    </labels>
                <created>Tue, 3 Jul 2012 18:01:28 -0500</created>
                <updated>Tue, 3 Jul 2012 19:58:55 -0500</updated>
                    <resolved>Tue, 3 Jul 2012 19:58:55 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28950" author="dnolen" created="Tue, 3 Jul 2012 19:58:55 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/6776e305d32c49e003ca0a468040b0453689df98&quot;&gt;http://github.com/clojure/clojurescript/commit/6776e305d32c49e003ca0a468040b0453689df98&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11364" name="0001-CLJS-332-have-UUID-s-impl-check-that-the-other-objec.patch" size="779" author="michalmarczyk" created="Tue, 3 Jul 2012 18:05:41 -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-331] nil values in :children vector for &apos;try&apos; forms</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-331</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;When analyzing an expression like&lt;/p&gt;

&lt;p&gt;    (try&lt;br/&gt;
      (foo bar)&lt;br/&gt;
      (catch js/Error e&lt;br/&gt;
        :do-something))&lt;/p&gt;

&lt;p&gt;the `:children` vector will contain `nil` keys (corresponding to the &quot;missing&quot; finally form)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15567">CLJS-331</key>
            <summary>nil values in :children vector for &apos;try&apos; forms</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="jonase">Jonas Enlund</reporter>
                        <labels>
                    </labels>
                <created>Tue, 3 Jul 2012 10:33:15 -0500</created>
                <updated>Tue, 3 Jul 2012 19:55:04 -0500</updated>
                    <resolved>Tue, 3 Jul 2012 19:55:04 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28949" author="dnolen" created="Tue, 3 Jul 2012 19:55:04 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/8caff5930ea73d9357f215b95a48ae123b2536a1&quot;&gt;http://github.com/clojure/clojurescript/commit/8caff5930ea73d9357f215b95a48ae123b2536a1&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11362" name="patch-331.diff" size="855" author="jonase" created="Tue, 3 Jul 2012 10:38: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="10009">Fixed</customfieldvalue>

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

<item>
            <title>[CLJS-330] (hash js/undefined) results in trouble (with implications to reasonable CLJS code)</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-330</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;See the ggroup thread started by Robert Marianski:&lt;/p&gt;

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

&lt;p&gt;Here&apos;s a copy of the breaking code exhibited there:&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;noformat&lt;/tt&gt;&lt;br/&gt;
(defmulti  foo (fn &lt;span class=&quot;error&quot;&gt;&amp;#91;a b&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;(:foo a) (:foo b)&amp;#93;&lt;/span&gt;))&lt;br/&gt;
(defmethod foo &lt;span class=&quot;error&quot;&gt;&amp;#91;:foo :bar&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;a b&amp;#93;&lt;/span&gt; :foobar)&lt;br/&gt;
(defmethod foo :default &lt;span class=&quot;error&quot;&gt;&amp;#91;a b&amp;#93;&lt;/span&gt; :default)&lt;/p&gt;

&lt;p&gt;;; this fails with an error - expecting default case&lt;br/&gt;
(foo {} {})&lt;br/&gt;
;; succeeds -&amp;gt; :foobar&lt;br/&gt;
(foo {:foo :foo} {:foo :bar})&lt;br/&gt;
&lt;tt&gt;noformat&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;There are further snippets which work with minor modifications.&lt;/p&gt;

&lt;p&gt;The problem is twofold. Firstly, &lt;tt&gt;(:foo m)&lt;/tt&gt; returns &lt;tt&gt;undefined&lt;/tt&gt; if &lt;tt&gt;m&lt;/tt&gt; is an &lt;tt&gt;ObjMap&lt;/tt&gt; without a &lt;tt&gt;:foo&lt;/tt&gt; key. Secondly, &lt;tt&gt;hash&lt;/tt&gt; delegates to &lt;tt&gt;goog.Uid&lt;/tt&gt; on &lt;tt&gt;undefined&lt;/tt&gt; and the latter understandably complains.&lt;/p&gt;

&lt;p&gt;The immediate fix is to the handling of &lt;tt&gt;undefined&lt;/tt&gt; in &lt;tt&gt;hash&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;(:foo {})&lt;/tt&gt; is a separate issue which should also perhaps be fixed. Then there is the bigger question of &lt;tt&gt;undefined&lt;/tt&gt; handling; for example, should the REPL actually print &lt;tt&gt;nil&lt;/tt&gt; when returning &lt;tt&gt;undefined&lt;/tt&gt;, given that &lt;tt&gt;nil?&lt;/tt&gt; currently accepts &lt;tt&gt;undefined&lt;/tt&gt;? Should we have a separate &lt;tt&gt;null?&lt;/tt&gt; predicate to check for the real JS &lt;tt&gt;null&lt;/tt&gt;? And so on.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15564">CLJS-330</key>
            <summary>(hash js/undefined) results in trouble (with implications to reasonable CLJS code)</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>Mon, 2 Jul 2012 23:00:14 -0500</created>
                <updated>Wed, 4 Jul 2012 10:17:58 -0500</updated>
                    <resolved>Tue, 3 Jul 2012 19:45:15 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28934" author="michalmarczyk" created="Mon, 2 Jul 2012 23:03:21 -0500"  >&lt;p&gt;Patch against current master. Fixes &lt;tt&gt;(hash js/undefined)&lt;/tt&gt;.&lt;/p&gt;</comment>
                    <comment id="28935" author="michalmarczyk" created="Mon, 2 Jul 2012 23:12:41 -0500"  >&lt;p&gt;Further discussion on the linked-to ggroup thread. My initial impression is that &lt;tt&gt;(:foo {})&lt;/tt&gt; may not require a fix, but we should make sure &lt;tt&gt;null&lt;/tt&gt; and &lt;tt&gt;undefined&lt;/tt&gt; really are interchangeable in interop-free scenarios and distinguishable where necessary (&lt;tt&gt;null?&lt;/tt&gt;). It&apos;s not a very strong opinion though, I&apos;ll need to think about it some more.&lt;/p&gt;</comment>
                    <comment id="28936" author="dnolen" created="Mon, 2 Jul 2012 23:40:47 -0500"  >&lt;p&gt;it&apos;s preferred that we treat undefined as null. Anywhere where we might fail because we have undefined as a value we should coerce to null.&lt;/p&gt;</comment>
                    <comment id="28937" author="dnolen" created="Mon, 2 Jul 2012 23:42:22 -0500"  >&lt;p&gt;We should avoid gratuitous use of &lt;b&gt;unchecked-if&lt;/b&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; I think if-not nil? will suffice here.&lt;/p&gt;</comment>
                    <comment id="28939" author="michalmarczyk" created="Tue, 3 Jul 2012 17:35:08 -0500"  >&lt;p&gt;Ah, true. Switched to &lt;tt&gt;nil?&lt;/tt&gt; for this patch.&lt;/p&gt;</comment>
                    <comment id="28940" author="emezeske" created="Tue, 3 Jul 2012 18:36:36 -0500"  >&lt;p&gt;Adding a patch that tests that e.g. (:foo {} 42) returns 42 instead of nil/undefined.&lt;/p&gt;</comment>
                    <comment id="28941" author="emezeske" created="Tue, 3 Jul 2012 18:38:50 -0500"  >&lt;p&gt;I&apos;m not sure if this is the right forum for this, but I&apos;d like to suggest cutting a new release of the compiler once this issue has been resolved.  This problem breaks a lot of code (default values for map lookups are very common, at least in code I&apos;ve seen).&lt;/p&gt;</comment>
                    <comment id="28942" author="michalmarczyk" created="Tue, 3 Jul 2012 19:07:03 -0500"  >&lt;p&gt;Default value handling for keyword self-lookups seems to be a separate major problem requiring a separate ticket and patch. Also, to test it comprehensively we&apos;d have to use all possible map types (&lt;tt&gt;ObjMap&lt;/tt&gt;, &lt;tt&gt;PersistentArrayMap&lt;/tt&gt;, &lt;tt&gt;PersistentHashMap&lt;/tt&gt; and &lt;tt&gt;PersistentTreeMap&lt;/tt&gt;, obtainable using &lt;tt&gt;obj-map&lt;/tt&gt;, &lt;tt&gt;array-map&lt;/tt&gt;, &lt;tt&gt;hash-map&lt;/tt&gt; and &lt;tt&gt;sorted-map&lt;/tt&gt;, respectively, as well as under names of the form &lt;tt&gt;cljs.core.FooMap/EMPTY&lt;/tt&gt;). Anyway, thanks for bringing this up, I&apos;m sure I wasn&apos;t aware of it!&lt;/p&gt;

&lt;p&gt;The original problem in this ticket is that an unhashable value is being looked up in a method cache, namely a vector including &lt;tt&gt;undefined&lt;/tt&gt;. This particular &lt;tt&gt;undefined&lt;/tt&gt; originated in an ObjMap lookup, but it was not incorrect for ObjMap to return it (given the current policy to make &lt;tt&gt;null&lt;/tt&gt; and &lt;tt&gt;undefined&lt;/tt&gt; undistinguishable in ClojureScript except with &lt;tt&gt;undefined?&lt;/tt&gt;). My patch makes &lt;tt&gt;undefined&lt;/tt&gt; hashable (and thus closer to &lt;tt&gt;null&lt;/tt&gt; in the way it is treated in ClojureScript) and has no impact on self-lookups.&lt;/p&gt;</comment>
                    <comment id="28943" author="michalmarczyk" created="Tue, 3 Jul 2012 19:09:19 -0500"  >&lt;p&gt;Oh, I suppose &lt;tt&gt;cljs.core.HashMap&lt;/tt&gt; is still around, but marked deprecated. Also, perhaps we needn&apos;t test with all map types after all... though it is no problem to loop through all types in a &lt;tt&gt;doseq&lt;/tt&gt;, so I&apos;d still do it just in case (of weird &lt;tt&gt;undefined&lt;/tt&gt; related issues, may they not resurface again, for example).&lt;/p&gt;</comment>
                    <comment id="28944" author="michalmarczyk" created="Tue, 3 Jul 2012 19:17:54 -0500"  >&lt;p&gt;Ok, I think I see what the problem is with the self-lookups. I&apos;ll go ahead and create a new ticket for this issue; I&apos;ll be back here with a link.&lt;/p&gt;</comment>
                    <comment id="28946" author="michalmarczyk" created="Tue, 3 Jul 2012 19:31:36 -0500"  >&lt;p&gt;New ticket for the self-lookups problem, fix attached:&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-333&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-333&lt;/a&gt;&lt;/tt&gt;&lt;/p&gt;</comment>
                    <comment id="28947" author="dnolen" created="Tue, 3 Jul 2012 19:45:15 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/76a33355251f7bf3984083cdcf73617c5cfbc3ce&quot;&gt;http://github.com/clojure/clojurescript/commit/76a33355251f7bf3984083cdcf73617c5cfbc3ce&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28953" author="dnolen" created="Wed, 4 Jul 2012 10:11:04 -0500"  >&lt;p&gt;The patch didn&apos;t address the underlying issue. We should never have to handle undefined in the protocol default case. Fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/e3c6991ad545d6a7fab7f68bf461ac57b6483d81&quot;&gt;http://github.com/clojure/clojurescript/commit/e3c6991ad545d6a7fab7f68bf461ac57b6483d81&lt;/a&gt;. undefined is now coerced to nil at the protocol dispatch level.&lt;/p&gt;</comment>
                    <comment id="28954" author="michalmarczyk" created="Wed, 4 Jul 2012 10:17:58 -0500"  >&lt;p&gt;Totally right, thanks for catching this before it causes further trouble.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11365" name="0001-Add-tests-for-default-values-for-map-lookups.patch" size="1249" author="emezeske" created="Tue, 3 Jul 2012 18:36:36 -0500" />
                    <attachment id="11363" name="0001-CLJS-330-fix-hash-js-undefined.patch" size="688" author="michalmarczyk" created="Tue, 3 Jul 2012 17:35: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-329] Cannot reference protocols using dot syntax (cljs.core.ILookup).</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-329</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;One used to be able to reference protocols using dot-separators; e.g.,&lt;/p&gt;

&lt;p&gt;(satisifies? cljs.core.ILookup {:a 1}) ;;=&amp;gt; true&lt;/p&gt;

&lt;p&gt;however, after CLJS commit 2aeb3d8f this is no longer possible.&lt;br/&gt;
These forms work correctly:&lt;/p&gt;

&lt;p&gt;(satisfies? cljs.core/ILookup {:a 1})&lt;br/&gt;
(satisfies? ILookup {:a 1})&lt;/p&gt;

&lt;p&gt;This issue came to my attention because core.match uses the cljs.core.ILookup form, so if that gets depreciated, downstream libraries will have to be updated.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15558">CLJS-329</key>
            <summary>Cannot reference protocols using dot syntax (cljs.core.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="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="lynaghk">Kevin Lynagh</reporter>
                        <labels>
                    </labels>
                <created>Fri, 29 Jun 2012 17:55:34 -0500</created>
                <updated>Sat, 30 Jun 2012 12:11:45 -0500</updated>
                    <resolved>Sat, 30 Jun 2012 12:11:45 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28919" author="michalmarczyk" created="Fri, 29 Jun 2012 19:12:50 -0500"  >&lt;p&gt;Note that extend-protocol in Clojure expects the foo.bar/IQuux form (or IQuux in same namespace / after :use) and refuses to work with foo.bar.Quux. That&apos;s because in contrast to types and records, protocols actually expose a Var. The dotted name refers to the interface backing the protocol and seems to be an implementation detail.&lt;/p&gt;

&lt;p&gt;So, I think the current behaviour is in line with how things are in Clojure.&lt;/p&gt;</comment>
                    <comment id="28920" author="lynaghk" created="Fri, 29 Jun 2012 20:47:02 -0500"  >&lt;p&gt;Matching the syntax of JVM Clojure sounds reasonable to me.&lt;br/&gt;
I take it I should close this issue and open up a ticket/patch core.match to use the correct syntax?&lt;/p&gt;</comment>
                    <comment id="28924" author="lynaghk" created="Sat, 30 Jun 2012 12:11:45 -0500"  >&lt;p&gt;Patch opened on downstream lib:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/MATCH-62&quot;&gt;http://dev.clojure.org/jira/browse/MATCH-62&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-328] Bugfix for :require spec handling in ns</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-328</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;(:require &lt;span class=&quot;error&quot;&gt;&amp;#91;lib.ns&amp;#93;&lt;/span&gt;) should be equivalent to (:require lib.ns) and (:require &lt;span class=&quot;error&quot;&gt;&amp;#91;lib.ns :as lib.ns&amp;#93;&lt;/span&gt;) (the latter two are correctly handled in the same way), but currently isn&apos;t due to an oversight. The forthcoming patch fixes this.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15556">CLJS-328</key>
            <summary>Bugfix for :require spec handling in ns</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>Thu, 28 Jun 2012 11:05:50 -0500</created>
                <updated>Fri, 29 Jun 2012 10:49:18 -0500</updated>
                    <resolved>Fri, 29 Jun 2012 10:49:18 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28913" author="michalmarczyk" created="Thu, 28 Jun 2012 11:10:47 -0500"  >&lt;p&gt;Patch against current master.&lt;/p&gt;</comment>
                    <comment id="28917" author="dnolen" created="Fri, 29 Jun 2012 10:49:18 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/8365d2a8202a429a907450a54c10dd067096f87f&quot;&gt;http://github.com/clojure/clojurescript/commit/8365d2a8202a429a907450a54c10dd067096f87f&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11349" name="0001-CLJS-328-fix-require-spec-handling-in-ns.patch" size="1665" author="michalmarczyk" created="Thu, 28 Jun 2012 11:10: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-327] Backend agnostic repl infrastructure</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-327</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This enhancement is about changing some names and docs in the repl infrastructure, so that it is backend agnostic.&lt;/p&gt;

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

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

<item>
            <title>[CLJS-326] hash-set and PersistentHashSet/fromArray == faster set construction</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-326</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;As discussed with mmarczyk in irc, the attached patch implements Clojure&apos;s hash-set function and modifies the compiler to create sets using a new fromArray static method. To test these, I created three new benchmarks. Here&apos;s before and after benchmark results:&lt;/p&gt;

&lt;p&gt;$ time ./script/benchmark | grep &apos;#{&apos;&lt;br/&gt;
[], #{}, 100000 runs, 77 msecs&lt;br/&gt;
[], #{1 2 3}, 100000 runs, 582 msecs&lt;br/&gt;
[coll #{1 2 3}], (conj coll 4), 100000 runs, 104 msecs&lt;br/&gt;
[], #{}, 100000 runs, 740 msecs&lt;br/&gt;
[], #{1 2 3}, 100000 runs, 1809 msecs&lt;br/&gt;
[coll #{1 2 3}], (conj coll 4), 100000 runs, 221 msecs&lt;br/&gt;
[], #{}, 100000 runs, 281 msecs&lt;br/&gt;
[], #{1 2 3}, 100000 runs, 1310 msecs&lt;br/&gt;
[coll #{1 2 3}], (conj coll 4), 100000 runs, 288 msecs&lt;br/&gt;
./script/benchmark  109.41s user 3.82s system 127% cpu 1:28.96 total&lt;/p&gt;

&lt;p&gt;$ time ./script/benchmark | grep &apos;#{&apos;&lt;br/&gt;
[], #{}, 100000 runs, 1 msecs&lt;br/&gt;
[], #{1 2 3}, 100000 runs, 333 msecs&lt;br/&gt;
[coll #{1 2 3}], (conj coll 4), 100000 runs, 100 msecs&lt;br/&gt;
[], #{}, 100000 runs, 1 msecs&lt;br/&gt;
[], #{1 2 3}, 100000 runs, 1670 msecs&lt;br/&gt;
[coll #{1 2 3}], (conj coll 4), 100000 runs, 325 msecs&lt;br/&gt;
[], #{}, 100000 runs, 1 msecs&lt;br/&gt;
[], #{1 2 3}, 100000 runs, 689 msecs&lt;br/&gt;
[coll #{1 2 3}], (conj coll 4), 100000 runs, 321 msecs&lt;br/&gt;
./script/benchmark  103.94s user 4.89s system 108% cpu 1:39.88 total&lt;br/&gt;
grep &apos;#{&apos;  0.00s user 0.00s system 0% cpu 1:39.85 total&lt;/p&gt;</description>
                <environment></environment>
            <key id="15554">CLJS-326</key>
            <summary>hash-set and PersistentHashSet/fromArray == faster set construction</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>Sun, 24 Jun 2012 20:01:16 -0500</created>
                <updated>Mon, 25 Jun 2012 06:33:47 -0500</updated>
                    <resolved>Mon, 25 Jun 2012 06:33:47 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28896" author="bbloom" created="Sun, 24 Jun 2012 20:47:21 -0500"  >&lt;p&gt;Slightly better patch with the EMPTY case&lt;/p&gt;</comment>
                    <comment id="28899" author="dnolen" created="Sun, 24 Jun 2012 22:13:25 -0500"  >&lt;p&gt;Getting a weird error when I try to run the tests. Also can we squash the commits? Thanks!&lt;/p&gt;</comment>
                    <comment id="28900" author="bbloom" created="Sun, 24 Jun 2012 22:24:08 -0500"  >&lt;p&gt;Squashed patch.&lt;/p&gt;</comment>
                    <comment id="28901" author="bbloom" created="Sun, 24 Jun 2012 22:28:42 -0500"  >&lt;p&gt;Squashed and rebased on latest master. Is the rule no-multi-commit patches? Or simply just not for such small patches? In this case, I made and tested each each change in sequence. I also wanted the benchmarks to have a different sha1, so that the perf improvement would show up in the graphs. I&apos;ll try to provide squashed patches in the future.&lt;/p&gt;

&lt;p&gt;What weird error are you getting? Works for me :-P&lt;/p&gt;</comment>
                    <comment id="28902" author="bbloom" created="Sun, 24 Jun 2012 22:33:08 -0500"  >&lt;p&gt;Updating 2nd benchmark in description to include the EMPTY optimization&lt;/p&gt;</comment>
                    <comment id="28903" author="dnolen" created="Mon, 25 Jun 2012 06:33:47 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/c60df78e2fd318109a9338a87277c11565b506ae&quot;&gt;http://github.com/clojure/clojurescript/commit/c60df78e2fd318109a9338a87277c11565b506ae&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11345" name="making-sets.patch" size="4523" author="bbloom" created="Sun, 24 Jun 2012 20:47:21 -0500" />
                    <attachment id="11346" name="making-sets-squashed.patch" size="3826" author="bbloom" created="Sun, 24 Jun 2012 22:24: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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-325] Destructuring broken when using Clojure 1.5 alphas</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-325</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;destructuring macro changed - clojure.lang.PersistentHashMap/create reference added to destructure. This probably means we&apos;ll need our own destructure macro and any macros that rely on it will also need to be moved over into the core.clj macros file.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15553">CLJS-325</key>
            <summary>Destructuring broken when using Clojure 1.5 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="-1">Unassigned</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 24 Jun 2012 18:53:49 -0500</created>
                <updated>Sun, 24 Jun 2012 22:04:46 -0500</updated>
                    <resolved>Sun, 24 Jun 2012 22:03:03 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28895" author="michalmarczyk" created="Sun, 24 Jun 2012 20:29:27 -0500"  >&lt;p&gt;Patch on top of the current master. Here&apos;s the 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-325: copy over destructure, let, loop to cljs.core to fix destructuring

Copy &amp;amp; paste from clojure.core with adjustments to make things work
again and remove some metadata.
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="28897" author="dnolen" created="Sun, 24 Jun 2012 21:53:11 -0500"  >&lt;p&gt;assert-args has a reference to IllegalArgumentException, probably don&apos;t want that.&lt;/p&gt;

&lt;p&gt;UPDATE: Oops forgot it&apos;s a macro for macros.&lt;/p&gt;</comment>
                    <comment id="28898" author="dnolen" created="Sun, 24 Jun 2012 22:03:03 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/49bff846e450286d4565ab5c44d3ec3d1d9640c9&quot;&gt;http://github.com/clojure/clojurescript/commit/49bff846e450286d4565ab5c44d3ec3d1d9640c9&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11344" name="0001-CLJS-325-copy-over-destructure-let-loop-to-cljs.core.patch" size="7661" author="michalmarczyk" created="Sun, 24 Jun 2012 20:29:27 -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-324] cljs.core/format</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-324</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Implement cljs.core/format. Make sure there is nothing in gclosure for this. I suppose we should try to emulate the jvm version as much as that makes sense?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15552">CLJS-324</key>
            <summary>cljs.core/format</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="gfredericks">Gary Fredericks</reporter>
                        <labels>
                    </labels>
                <created>Sun, 24 Jun 2012 18:50:21 -0500</created>
                <updated>Fri, 29 Jun 2012 11:07:07 -0500</updated>
                    <resolved>Fri, 29 Jun 2012 11:07:07 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28914" author="michalmarczyk" created="Thu, 28 Jun 2012 11:29:11 -0500"  >&lt;p&gt;GClosure does actually include a string formatter &amp;#8211; goog.string.format. Note that that&apos;s both a non-ctor function name and the GClosure &quot;namespace&quot; name, so in order to use it one must require goog.string.format on top of gstring and say gstring/format (or perhaps leave out the gstring require spec and use goog.string/format &amp;#8211; not tested, but should work).&lt;/p&gt;

&lt;p&gt;The patch to introduce format and printf as wrappers for goog.string.format is naturally extremely simple, so here it is. Note that this particular patch must be applied on top of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-328&quot; title=&quot;Bugfix for :require spec handling in ns&quot;&gt;&lt;del&gt;CLJS-328&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I have no idea how goog.string.format compares to the JVM&apos;s String/format (basic number formatting seems to work as it should in sprintf-like functions, but other than that I haven&apos;t tested it much).&lt;/p&gt;</comment>
                    <comment id="28916" author="dnolen" created="Fri, 29 Jun 2012 10:44:17 -0500"  >&lt;p&gt;The tests fail for me with this patch applied.&lt;/p&gt;</comment>
                    <comment id="28918" author="dnolen" created="Fri, 29 Jun 2012 11:07:07 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/8f518760a3df8b351208e97bb70270856623bb0a&quot;&gt;http://github.com/clojure/clojurescript/commit/8f518760a3df8b351208e97bb70270856623bb0a&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11350" name="0001-CLJS-324-implement-cljs.core-format-as-wrapper-for-g.patch" size="2089" author="michalmarczyk" created="Thu, 28 Jun 2012 11:29: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>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-323] add :warnings :all / :none option to compiler build options </title>
                <link>http://dev.clojure.org/jira/browse/CLJS-323</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;lein-cljsbuild experienced some breakage since we move things into the analyzer namespaces - &lt;b&gt;cljs-warn-on-undeclared&lt;/b&gt; for example.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15549">CLJS-323</key>
            <summary>add :warnings :all / :none option to compiler build options </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>Fri, 22 Jun 2012 12:24:23 -0500</created>
                <updated>Sat, 23 Jun 2012 12:18:40 -0500</updated>
                    <resolved>Sat, 23 Jun 2012 12:18:40 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28892" author="dnolen" created="Sat, 23 Jun 2012 12:18:40 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/d4671a96fbcc046bf4b0b25f445e7d06b6b8ab6a&quot;&gt;http://github.com/clojure/clojurescript/commit/d4671a96fbcc046bf4b0b25f445e7d06b6b8ab6a&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-322] Introduce an obj-map function as an analogue of array-map</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-322</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This function would be expected to produce ObjMaps of arbitrary size. ObjMaps are great for lookup speed with string keys in a wide range of sizes, so this could conceivably be useful. Additionally, ObjMaps currently are the only non-deprecated map type without a dedicated factory function.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15546">CLJS-322</key>
            <summary>Introduce an obj-map function as an analogue of array-map</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="michalmarczyk">Micha&#322; Marczyk</reporter>
                        <labels>
                    </labels>
                <created>Mon, 18 Jun 2012 18:00:46 -0500</created>
                <updated>Mon, 18 Jun 2012 21:09:48 -0500</updated>
                    <resolved>Mon, 18 Jun 2012 21:09:48 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28872" author="michalmarczyk" created="Mon, 18 Jun 2012 18:10:57 -0500"  >&lt;p&gt;Patch against current master, a handful of tests included.&lt;/p&gt;</comment>
                    <comment id="28876" author="dnolen" created="Mon, 18 Jun 2012 21:09:48 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/16863e3e5cdf2d968fc8d90d2d8da6f00e2398c0&quot;&gt;http://github.com/clojure/clojurescript/commit/16863e3e5cdf2d968fc8d90d2d8da6f00e2398c0&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11339" name="0001-CLJS-322-introduce-cljs.core-obj-map.patch" size="1865" author="michalmarczyk" created="Mon, 18 Jun 2012 18:10:57 -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-320] memfn not supported</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-320</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The docs say &quot;it almost always preferable to do this directly now&quot;, but this was one more thing that slowed down the porting of a small piece of JVM Clojure code for me. I&apos;m of the opinion that parity with Clojure proper is desirable where it doesn&apos;t hurt platform interop or performance.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15543">CLJS-320</key>
            <summary>memfn not supported</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, 18 Jun 2012 01:49:07 -0500</created>
                <updated>Mon, 18 Jun 2012 21:01:52 -0500</updated>
                    <resolved>Mon, 18 Jun 2012 21:01:52 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28858" author="dnolen" created="Mon, 18 Jun 2012 08:53:21 -0500"  >&lt;p&gt;Can we get a simple test with this patch?&lt;/p&gt;</comment>
                    <comment id="28868" author="bbloom" created="Mon, 18 Jun 2012 16:55:06 -0500"  >&lt;p&gt;Updated patch with tests&lt;/p&gt;</comment>
                    <comment id="28875" author="dnolen" created="Mon, 18 Jun 2012 21:01:52 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/8965df74d424ed41beb3990a55d775d2d851aacd&quot;&gt;http://github.com/clojure/clojurescript/commit/8965df74d424ed41beb3990a55d775d2d851aacd&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11332" name="memfn.patch" size="615" author="bbloom" created="Mon, 18 Jun 2012 01:49:07 -0500" />
                    <attachment id="11338" name="memfn-with-tests.patch" size="1494" author="bbloom" created="Mon, 18 Jun 2012 16:55: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>
                                            <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-319] missing spaces when printing the same thing more than once</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-319</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;E.g. (println 1 1) prints &quot;11\n&quot; instead of &quot;1 1\n&quot;.&lt;/p&gt;

&lt;p&gt;Here&apos;s the culprit:&lt;br/&gt;
&lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L6136-6137&quot;&gt;https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L6136-6137&lt;/a&gt;&lt;/p&gt;</description>
                <environment>9ad79e1c</environment>
            <key id="15542">CLJS-319</key>
            <summary>missing spaces when printing the same thing more than once</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>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 18 Jun 2012 01:20:51 -0500</created>
                <updated>Thu, 5 Jul 2012 15:06:57 -0500</updated>
                    <resolved>Thu, 5 Jul 2012 15:06:57 -0500</resolved>
                                                                    <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28855" author="bbloom" created="Mon, 18 Jun 2012 02:14:02 -0500"  >&lt;p&gt;Both pr-with-opts and pr-sb are affected. See:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L6107&quot;&gt;https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L6107&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28856" author="bbloom" created="Mon, 18 Jun 2012 03:16:07 -0500"  >&lt;p&gt;Patch here: &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;&lt;/p&gt;</comment>
                    <comment id="28888" author="bbloom" created="Thu, 21 Jun 2012 18:19:32 -0500"  >&lt;p&gt;Attaching a simple patch for this bug instead of fixing it along side with-out-str&lt;/p&gt;</comment>
                    <comment id="28955" author="dnolen" created="Thu, 5 Jul 2012 15:06:57 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/280ea95938883f97be82267d109342178a2e47aa&quot;&gt;http://github.com/clojure/clojurescript/commit/280ea95938883f97be82267d109342178a2e47aa&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11341" name="cljs-319.patch" size="2283" author="bbloom" created="Thu, 21 Jun 2012 18:19:32 -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-318] resolution conflict between var names and namespace segments</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-318</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;If the initial segment of the namespace of a symbol matches a var in the resolving namespace, there can be a conflict. E.g. &quot;conflict.core/conflict&quot; might end up compiling to &quot;conflict.core.conflict.core.conflict&quot; instead of &quot;conflict.core.conflict&quot;.&lt;/p&gt;

&lt;p&gt;In this example &lt;a href=&quot;https://gist.github.com/ec4dce098d47268a64b3&quot;&gt;https://gist.github.com/ec4dce098d47268a64b3&lt;/a&gt; , the problem only occurs inside a multiple-arity defn. The problem is line 4 in the compiled js, which should, I think, be &quot;a&quot; or &quot;conflict.core.conflict&quot; instead of &quot;a.core.conflict&quot;.&lt;/p&gt;</description>
                <environment>9ad79e1c</environment>
            <key id="15540">CLJS-318</key>
            <summary>resolution conflict between var names and 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="3">Duplicate</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tomoj">Tom Jack</reporter>
                        <labels>
                    </labels>
                <created>Sun, 17 Jun 2012 04:30:26 -0500</created>
                <updated>Sun, 17 Jun 2012 13:13:58 -0500</updated>
                    <resolved>Sun, 17 Jun 2012 13:13:58 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28847" author="dnolen" created="Sun, 17 Jun 2012 13:13:58 -0500"  >&lt;p&gt;this is identical to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-180&quot; title=&quot;Function params shadow top-level namespace segments&quot;&gt;&lt;del&gt;CLJS-180&lt;/del&gt;&lt;/a&gt;. We need to use a namespace alias for cases like 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-317] Decouple the analyzer</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-317</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This is an enhancement that gets the analyzer part of the compiler in its own file.&lt;/p&gt;

&lt;p&gt;The compiler.clj file (cljs.compiler namespace) still contains everything else, namely the js emitters and compilation utility functions (compile-file et. all)&lt;/p&gt;

&lt;p&gt;References to functions or dynamic vars now in the analyzer have been updated throughout the whole code base.&lt;/p&gt;

&lt;p&gt;Tested with the repl and the regular compiler. Everything seems to work fine&lt;/p&gt;

&lt;p&gt;With this patch, it should now be possible to develop alternative backends in parallel to the JS one quite easily.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15539">CLJS-317</key>
            <summary>Decouple the analyzer</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="raph_amiard">Rapha&#235;l AMIARD</reporter>
                        <labels>
                    </labels>
                <created>Fri, 15 Jun 2012 09:58:08 -0500</created>
                <updated>Fri, 15 Jun 2012 11:17:56 -0500</updated>
                    <resolved>Fri, 15 Jun 2012 11:17:56 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28818" author="dnolen" created="Fri, 15 Jun 2012 10:58:55 -0500"  >&lt;p&gt;Looks like the load-macros patch (&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-316&quot; title=&quot;Use load dynamically instead of static require to load core cljs macros&quot;&gt;&lt;del&gt;CLJS-316&lt;/del&gt;&lt;/a&gt;) which was already applied is a part of this patch. Can we fix that?&lt;/p&gt;</comment>
                    <comment id="28819" author="raph_amiard" created="Fri, 15 Jun 2012 11:13:43 -0500"  >&lt;p&gt;Ah sure, sorry, i thought i had taken care of that, the new patch should be ok&lt;/p&gt;</comment>
                    <comment id="28820" author="dnolen" created="Fri, 15 Jun 2012 11:17:56 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/9ad79e1c9b87c862ccb7ad6aad37d90414123c76&quot;&gt;http://github.com/clojure/clojurescript/commit/9ad79e1c9b87c862ccb7ad6aad37d90414123c76&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11325" name="decouple-analyzer-2.patch" size="99072" author="raph_amiard" created="Fri, 15 Jun 2012 11:13:12 -0500" />
                    <attachment id="11323" name="decouple-analyzer.patch" size="101585" author="raph_amiard" created="Fri, 15 Jun 2012 09:58: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-316] Use load dynamically instead of static require to load core cljs macros</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-316</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This is an enhancement that replaces the static (require &apos;cljs.core) with a dynamic load operation that happens when the analyzer is first called. The features are :&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;The load can be classpath relative or filesystem relative (a dynamic var sets wether it&apos;s one or the other)&lt;/li&gt;
	&lt;li&gt;The load happens dynamically and once when the analyzer is first ran. However, is the path is rebound, the load will happen a second time, to provides semantics in tune with the binding of a dynamic var.&lt;/li&gt;
	&lt;li&gt;Helpers macros to bind the path to be used this way :&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;(with-core-macros &lt;span class=&quot;code-quote&quot;&gt;&quot;cljs/core&quot;&lt;/span&gt;
  ...)

(with-core-macros-file &lt;span class=&quot;code-quote&quot;&gt;&quot;src/clj/cljs/core.clj&quot;&lt;/span&gt;
 ...)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Path has been tested, and helpers macros too, even if they are not used yet.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15538">CLJS-316</key>
            <summary>Use load dynamically instead of static require to load core cljs macros</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="raph_amiard">Rapha&#235;l AMIARD</reporter>
                        <labels>
                    </labels>
                <created>Fri, 15 Jun 2012 06:30:08 -0500</created>
                <updated>Fri, 15 Jun 2012 09:27:19 -0500</updated>
                    <resolved>Fri, 15 Jun 2012 09:27:19 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28813" author="dnolen" created="Fri, 15 Jun 2012 09:27:19 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/b261447e598dd9463ace406337c9f2d1a02bb799&quot;&gt;http://github.com/clojure/clojurescript/commit/b261447e598dd9463ace406337c9f2d1a02bb799&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11322" name="analyzer-load-macros.patch" size="2504" author="raph_amiard" created="Fri, 15 Jun 2012 06:30: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-315] compiler bug resulting from proto inlining optimization</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-315</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 jayq.core)

(extend-type js/jQuery
  IIndexed
  (-nth [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; n]
    (when (&amp;lt; n (count &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;))
      (.slice &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; n (inc n))))
  (-nth [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; n not-found]
    (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (&amp;lt; n (count &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;))
      (.slice &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; n (inc n))
      (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (undefined? not-found)
        nil
        not-found)))

  ILookup
  (-lookup
    ([&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; k]
       (or (.slice &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; k (inc k)) nil))
    ([&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; k not-found]
       (-nth &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; k not-found)                     ; &amp;lt;---- here &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; I comment and replace with 1 &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; will compile in advanced mode.
       ;1
       ))
  )&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;java.lang.ClassCastException: java.lang.&lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt; cannot be &lt;span class=&quot;code-keyword&quot;&gt;cast&lt;/span&gt; to clojure.lang.Named
	at clojure.core$namespace.invoke(core.clj:1497)
	at cljs.compiler$resolve_existing_var.invoke(compiler.clj:110)
	at cljs.compiler$eval1054$fn__1056.invoke(compiler.clj:716)
	at clojure.lang.MultiFn.invoke(MultiFn.java:163)
	at cljs.compiler$emit_block.invoke(compiler.clj:333)
	at cljs.compiler$emit_fn_method.invoke(compiler.clj:512)
	at cljs.compiler$eval952$fn__954.invoke(compiler.clj:573)
	at clojure.lang.MultiFn.invoke(MultiFn.java:163)
	at cljs.compiler$emits.doInvoke(compiler.clj:232)
	at clojure.lang.RestFn.invoke(RestFn.java:436)
	at cljs.compiler$eval1089$fn__1091.invoke(compiler.clj:791)
	at clojure.lang.MultiFn.invoke(MultiFn.java:163)
	at cljs.compiler$emit_block.invoke(compiler.clj:333)
	at cljs.compiler$eval996$fn__998.invoke(compiler.clj:633)
	at clojure.lang.MultiFn.invoke(MultiFn.java:163)
	at cljs.compiler$compile_file_STAR_.invoke(compiler.clj:1668)
	at cljs.compiler$compile_file.invoke(compiler.clj:1705)
	at cljs.compiler$compile_root.invoke(compiler.clj:1766)
	at cljs.closure$compile_dir.invoke(closure.clj:364)
	at cljs.closure$eval1981$fn__1982.invoke(closure.clj:396)
	at cljs.closure$eval1910$fn__1911$G__1901__1918.invoke(closure.clj:266)
	at cljs.closure$eval1968$fn__1969.invoke(closure.clj:410)
	at cljs.closure$eval1910$fn__1911$G__1901__1918.invoke(closure.clj:266)
	at cljs.closure$build.invoke(closure.clj:874)
	at user$compile_cljs.invoke(NO_SOURCE_FILE:273)
	at user$cljs_build.invoke(NO_SOURCE_FILE:284)
	at clojure.lang.AFn.applyToHelper(AFn.java:167)
	at clojure.lang.AFn.applyTo(AFn.java:151)
	at clojure.core$apply.invoke(core.clj:605)
	at clojure.core$partial$fn__4072.doInvoke(core.clj:2345)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at user$changed_fn$fn__2184.invoke(NO_SOURCE_FILE:88)
	at user$watch.invoke(NO_SOURCE_FILE:103)
	at user$main$fn__2271.invoke(NO_SOURCE_FILE:387)
	at clojure.core$binding_conveyor_fn$fn__3989.invoke(core.clj:1819)
	at clojure.lang.AFn.call(AFn.java:18)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.&lt;span class=&quot;code-object&quot;&gt;Thread&lt;/span&gt;.run(&lt;span class=&quot;code-object&quot;&gt;Thread&lt;/span&gt;.java:662)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15535">CLJS-315</key>
            <summary>compiler bug resulting from proto inlining optimization</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, 14 Jun 2012 14:05:49 -0500</created>
                <updated>Thu, 14 Jun 2012 18:59:22 -0500</updated>
                    <resolved>Thu, 14 Jun 2012 18:59:22 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28809" author="dnolen" created="Thu, 14 Jun 2012 18:59:22 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/f30cd5e4e9ae32de8d510012394789b9fb1868c3&quot;&gt;http://github.com/clojure/clojurescript/commit/f30cd5e4e9ae32de8d510012394789b9fb1868c3&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-314] Simplify if form emission in js backend</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-314</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Factor out some condition checks in emit :if , patch attached&lt;/p&gt;</description>
                <environment></environment>
            <key id="15531">CLJS-314</key>
            <summary>Simplify if form emission in js backend</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="raph_amiard">Rapha&#235;l AMIARD</reporter>
                        <labels>
                    </labels>
                <created>Wed, 13 Jun 2012 07:10:54 -0500</created>
                <updated>Wed, 13 Jun 2012 16:14:01 -0500</updated>
                    <resolved>Wed, 13 Jun 2012 16:14:01 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28796" author="dnolen" created="Wed, 13 Jun 2012 09:29:38 -0500"  >&lt;p&gt;One problem with this is that emission is a side effect that we use to track line numbers and column numbers. Open to thoughts on how to improve tracking line numbers and columns numbers if you have thoughts about that. In general this is why we don&apos;t generate substrings which would make many parts of the code a lot cleaner.&lt;/p&gt;

&lt;p&gt;One way might be to trigger emission w/o side-effecting line/col numbers via dynamic var?&lt;/p&gt;</comment>
                    <comment id="28797" author="raph_amiard" created="Wed, 13 Jun 2012 09:32:50 -0500"  >&lt;p&gt;Aaah ok, i didn&apos;t take that into accound, i&apos;m gonna look into the code and check about that ! I guess i can close the issue for the time being then&lt;/p&gt;</comment>
                    <comment id="28798" author="dnolen" created="Wed, 13 Jun 2012 16:14:01 -0500"  >&lt;p&gt;closing for now.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11318" name="simplify-if.patch" size="1314" author="raph_amiard" created="Wed, 13 Jun 2012 07:10: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-313] Encapsulate namespaces access and environment creation</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-313</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;For the moment, the initialization of the &quot;namespaces&quot; atom is static in the ClojureScript compiler.&lt;/p&gt;

&lt;p&gt;However, if we are to decouple the js backend, this initialization will need to be done dynamically, because it will have to come &lt;b&gt;after&lt;/b&gt; the core namespace is set by the analyzer user.&lt;/p&gt;

&lt;p&gt;The problem is that analyze environments are created by hand by the repl and the compiler for the moment, and that the &quot;namespaces&quot; atom is accessed and modified directly, without checking for initialization.&lt;/p&gt;

&lt;p&gt;The patch attached encapsulates the creation of environments and the access of the namespaces atom, so that&lt;/p&gt;

&lt;p&gt;1. Environment creation is factored&lt;br/&gt;
2. There is a hook to ensure proper initialization in further enhancements&lt;/p&gt;</description>
                <environment></environment>
            <key id="15530">CLJS-313</key>
            <summary>Encapsulate namespaces access and environment creation</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="raph_amiard">Rapha&#235;l AMIARD</reporter>
                        <labels>
                    </labels>
                <created>Wed, 13 Jun 2012 05:58:21 -0500</created>
                <updated>Wed, 13 Jun 2012 09:23:49 -0500</updated>
                    <resolved>Wed, 13 Jun 2012 09:23:49 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28793" author="raph_amiard" created="Wed, 13 Jun 2012 06:37:23 -0500"  >&lt;p&gt;Fixed patch, uses empty-env function in rhino.clj&lt;/p&gt;</comment>
                    <comment id="28795" author="dnolen" created="Wed, 13 Jun 2012 09:23:49 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/ca63aabd2183ff0097052e8c7b1f0501a11fc007&quot;&gt;http://github.com/clojure/clojurescript/commit/ca63aabd2183ff0097052e8c7b1f0501a11fc007&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11317" name="encapsulate-namespaces-and-env-2.patch" size="5501" author="raph_amiard" created="Wed, 13 Jun 2012 06:37:23 -0500" />
                    <attachment id="11316" name="encapsulate-namespaces-and-env.patch" size="4630" author="raph_amiard" created="Wed, 13 Jun 2012 05:58: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-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-311] rename-to-js regex has a non escaped &quot;.&quot;</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-311</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;this can wrongly replace filenames&lt;br/&gt;
(rename-to-js &quot;file.xcljs&quot;)&lt;br/&gt;
&quot;file..js&quot;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15525">CLJS-311</key>
            <summary>rename-to-js regex has a non escaped &quot;.&quot;</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>Mon, 11 Jun 2012 11:15:29 -0500</created>
                <updated>Mon, 11 Jun 2012 11:57:13 -0500</updated>
                    <resolved>Mon, 11 Jun 2012 11:57:13 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28775" author="dnolen" created="Mon, 11 Jun 2012 11:57:13 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/d3e2d2c6b72081ba2173f35b9d6ce38603b9188a&quot;&gt;http://github.com/clojure/clojurescript/commit/d3e2d2c6b72081ba2173f35b9d6ce38603b9188a&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11308" name="fix-rename-to-js-regex.patch" size="769" author="bronsa" created="Mon, 11 Jun 2012 11:15:29 -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-310] Use backend agnostic munging function for namespace resolution</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-310</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;ns-&amp;gt;relpath uses the js specific munge function for path resolution.&lt;/p&gt;

&lt;p&gt;A patch is attached that uses a backend agnostic munge function.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15522">CLJS-310</key>
            <summary>Use backend agnostic munging function for namespace resolution</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="raph_amiard">Rapha&#235;l AMIARD</reporter>
                        <labels>
                    </labels>
                <created>Sat, 9 Jun 2012 05:15:33 -0500</created>
                <updated>Mon, 11 Jun 2012 07:23:27 -0500</updated>
                    <resolved>Mon, 11 Jun 2012 07:23:27 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28767" author="dnolen" created="Sat, 9 Jun 2012 20:09:51 -0500"  >&lt;p&gt;Excellent! Been a bit busy will try to apply this tomorrow!&lt;/p&gt;</comment>
                    <comment id="28768" author="dnolen" created="Sun, 10 Jun 2012 13:18:47 -0500"  >&lt;p&gt;Patch looks good. Did you verify that analysis still follows namespace dependencies w/ this patch applied?&lt;/p&gt;</comment>
                    <comment id="28773" author="raph_amiard" created="Mon, 11 Jun 2012 05:46:02 -0500"  >&lt;p&gt;Yes i did, i think it works just the same as before &lt;/p&gt;</comment>
                    <comment id="28774" author="dnolen" created="Mon, 11 Jun 2012 07:23:27 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3db771065ebda9d23ba5f52994b6e4f99c28e11f&quot;&gt;http://github.com/clojure/clojurescript/commit/3db771065ebda9d23ba5f52994b6e4f99c28e11f&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11305" name="munge-path.patch" size="894" author="raph_amiard" created="Sat, 9 Jun 2012 05:15:33 -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-309] Bug - Typo in commit &quot;Tagged literals in the CLJS compiler and first blush tests &quot; </title>
                <link>http://dev.clojure.org/jira/browse/CLJS-309</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I&apos;m pretty sure there is a typo in this commit,&lt;/p&gt;

&lt;p&gt;&lt;b&gt;cljs-data-readers&lt;/b&gt; is declared, but then &lt;b&gt;data-readers&lt;/b&gt; is bound in compile-file, which makes compilation fail&lt;/p&gt;

&lt;p&gt;Patch attached&lt;/p&gt;</description>
                <environment></environment>
            <key id="15520">CLJS-309</key>
            <summary>Bug - Typo in commit &quot;Tagged literals in the CLJS compiler and first blush tests &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="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="raph_amiard">Rapha&#235;l AMIARD</reporter>
                        <labels>
                        <label>bug</label>
                    </labels>
                <created>Fri, 8 Jun 2012 08:23:51 -0500</created>
                <updated>Fri, 8 Jun 2012 10:49:17 -0500</updated>
                    <resolved>Fri, 8 Jun 2012 10:49:17 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28740" author="fogus" created="Fri, 8 Jun 2012 08:43:49 -0500"  >&lt;p&gt;I&apos;m unable to reproduce this. Do you mind posting the steps that you ran to see the error?&lt;br/&gt;
Thank you.&lt;/p&gt;</comment>
                    <comment id="28746" author="raph_amiard" created="Fri, 8 Jun 2012 10:48:59 -0500"  >&lt;p&gt;Sorry, i failed to follow the implications of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-890&quot; title=&quot;Tagged literals in reader&quot;&gt;&lt;del&gt;CLJ-890&lt;/del&gt;&lt;/a&gt;, the bug was related to my configuration, and the binding valid.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11299" name="fix-data-readers-typo.patch" size="1057" author="raph_amiard" created="Fri, 8 Jun 2012 08:23: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-308] Support types &amp; protocols as type hints</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-308</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;If we have a type / protocol type hint we can direct dispatch in regular fns too.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15519">CLJS-308</key>
            <summary>Support types &amp; protocols as type hints</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>Thu, 7 Jun 2012 11:38:15 -0500</created>
                <updated>Fri, 8 Jun 2012 18:12:55 -0500</updated>
                    <resolved>Fri, 8 Jun 2012 18:12:55 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28758" author="dnolen" created="Fri, 8 Jun 2012 18:12:55 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/8e944175668044eebc3912b2831515e99f524c9a&quot;&gt;http://github.com/clojure/clojurescript/commit/8e944175668044eebc3912b2831515e99f524c9a&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-307] Faster empty map creation, default to PersistentArrayMap when converting an obj-map whose lenght is less than cljs.core.PersistentArrayMap/HASHMAP_THRESHOLD</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-307</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description></description>
                <environment></environment>
            <key id="15518">CLJS-307</key>
            <summary>Faster empty map creation, default to PersistentArrayMap when converting an obj-map whose lenght is less than cljs.core.PersistentArrayMap/HASHMAP_THRESHOLD</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="bronsa">Nicola Mometto</reporter>
                        <labels>
                    </labels>
                <created>Thu, 7 Jun 2012 06:51:32 -0500</created>
                <updated>Thu, 7 Jun 2012 11:58:34 -0500</updated>
                    <resolved>Thu, 7 Jun 2012 11:58:34 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28733" author="dnolen" created="Thu, 7 Jun 2012 08:55:07 -0500"  >&lt;p&gt;Fast empty map creation looks good, but does the PersistentArrayMap conversion also result in a performance boost?&lt;/p&gt;</comment>
                    <comment id="28735" author="bronsa" created="Thu, 7 Jun 2012 10:47:32 -0500"  >&lt;p&gt;operations on small PersistentArrayMaps are faster than on PersistentHashMaps, see:&lt;/p&gt;

&lt;p&gt;ClojureScript:cljs.user&amp;gt; (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;_ 5&amp;#93;&lt;/span&gt; (time (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;_ 1e5&amp;#93;&lt;/span&gt; (seq (assoc cljs.core.PersistentArrayMap/EMPTY :a 1)))))&lt;br/&gt;
&quot;Elapsed time: 2357 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 2098 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 2044 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 2397 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 2125 msecs&quot;&lt;br/&gt;
nil&lt;br/&gt;
ClojureScript:cljs.user&amp;gt; (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;_ 5&amp;#93;&lt;/span&gt; (time (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;_ 1e5&amp;#93;&lt;/span&gt; (seq (assoc cljs.core.PersistentHashMap/EMPTY :a 1)))))&lt;br/&gt;
&quot;Elapsed time: 4501 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 4701 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 5437 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 5287 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 4732 msecs&quot;&lt;/p&gt;</comment>
                    <comment id="28737" author="dnolen" created="Thu, 7 Jun 2012 11:36:57 -0500"  >&lt;p&gt;Please report back numbers from V8, JavaScriptCore, and SpiderMonkey, preferably via jsperf.com. &lt;/p&gt;

&lt;p&gt;We don&apos;t use Rhino for benchmarking.&lt;/p&gt;

&lt;p&gt;I&apos;ll take the first part of the patch if you split them apart.&lt;/p&gt;</comment>
                    <comment id="28738" author="bronsa" created="Thu, 7 Jun 2012 11:55:26 -0500"  >&lt;p&gt;Ok, so testing with v8 and SpiderMonkey shows PersistentHashMaps to be faster, here&apos;s a patch with only the first commit &lt;/p&gt;</comment>
                    <comment id="28739" author="dnolen" created="Thu, 7 Jun 2012 11:58:34 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/2630b4913fb2f17a45e8a686f561e21ffac541cb&quot;&gt;http://github.com/clojure/clojurescript/commit/2630b4913fb2f17a45e8a686f561e21ffac541cb&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11298" name="CLJS-307-faster-empty-map-creation.patch" size="764" author="bronsa" created="Thu, 7 Jun 2012 11:55:38 -0500" />
                    <attachment id="11297" name="maps-improvs.patch" size="1832" author="bronsa" created="Thu, 7 Jun 2012 06:51:32 -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-306] Clojure.core/intern is not implemented</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-306</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;There is no &quot;intern&quot; in ClojureScript. If this is intended, it would be nice to have this documented in &quot;Differences from Clojure&quot; article.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15517">CLJS-306</key>
            <summary>Clojure.core/intern is not implemented</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="si14">Dmitry Groshev</reporter>
                        <labels>
                    </labels>
                <created>Thu, 7 Jun 2012 04:26:57 -0500</created>
                <updated>Sun, 17 Jun 2012 11:08:30 -0500</updated>
                    <resolved>Sun, 17 Jun 2012 11:08:30 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28832" author="bbloom" created="Sat, 16 Jun 2012 16:24:10 -0500"  >&lt;p&gt;&apos;intern creates Var objects, which are documented in &quot;Differences from Clojure&quot; as not part of ClojureScript.&lt;/p&gt;</comment>
                    <comment id="28834" author="dnolen" created="Sun, 17 Jun 2012 11:08:30 -0500"  >&lt;p&gt;You should be able to update the Wiki.&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-305] direct protocol dispatch from within deftype / defrecord / extend-type</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-305</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;We actually have a lot of information around deftype / defrecord / extend-type. We could use this information to emit direct dispatches to protocol implementations and avoid going through protocol fns.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15516">CLJS-305</key>
            <summary>direct protocol dispatch from within deftype / defrecord / 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="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>Thu, 7 Jun 2012 00:39:54 -0500</created>
                <updated>Fri, 8 Jun 2012 18:11:16 -0500</updated>
                    <resolved>Fri, 8 Jun 2012 18:11:16 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28734" author="dnolen" created="Thu, 7 Jun 2012 09:32:40 -0500"  >&lt;p&gt;We needs to store all the protocols a type implements. We then should add type meta to the this argument of the protocol fn implementations. This should actually result in a reasonable performance boost across the board.&lt;/p&gt;</comment>
                    <comment id="28757" author="dnolen" created="Fri, 8 Jun 2012 18:11:16 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/8e944175668044eebc3912b2831515e99f524c9a&quot;&gt;http://github.com/clojure/clojurescript/commit/8e944175668044eebc3912b2831515e99f524c9a&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-304] Comparing a js/Date to nil throws</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-304</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;(= (js/Date.) nil)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15515">CLJS-304</key>
            <summary>Comparing a js/Date to nil throws</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, 5 Jun 2012 21:28:33 -0500</created>
                <updated>Mon, 18 Jun 2012 20:59:50 -0500</updated>
                    <resolved>Mon, 18 Jun 2012 20:59:50 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28728" author="bbloom" created="Tue, 5 Jun 2012 22:27:40 -0500"  >&lt;p&gt;D&apos;oh! Sorry, this patch causes a warning:&lt;/p&gt;

&lt;p&gt;WARNING: Use of undeclared Var cljs.core/instance? at line 384 &lt;/p&gt;</comment>
                    <comment id="28839" author="dnolen" created="Sun, 17 Jun 2012 12:06:56 -0500"  >&lt;p&gt;updated patch please.&lt;/p&gt;</comment>
                    <comment id="28849" author="bbloom" created="Sun, 17 Jun 2012 16:28:40 -0500"  >&lt;p&gt;Sorry, forgot about this ticket. Attached patch has two additional commits: 1st stops calling .getTime with list/EMPTY via unecessary &apos;() and the 2nd moves instance? from the &quot;preds&quot; to &quot;fundamentals&quot; section of core.cljs.&lt;/p&gt;</comment>
                    <comment id="28859" author="dnolen" created="Mon, 18 Jun 2012 09:01:57 -0500"  >&lt;p&gt;Thanks can we collapse the patch into one commit?&lt;/p&gt;</comment>
                    <comment id="28867" author="bbloom" created="Mon, 18 Jun 2012 16:45:07 -0500"  >&lt;p&gt;Same as patch 2 with commits squashed&lt;/p&gt;</comment>
                    <comment id="28874" author="dnolen" created="Mon, 18 Jun 2012 20:59:50 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/80726438d7375eb72cd4ea82a7ea676d3237b6ce&quot;&gt;http://github.com/clojure/clojurescript/commit/80726438d7375eb72cd4ea82a7ea676d3237b6ce&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11329" name="date-equiv2.patch" size="2820" author="bbloom" created="Sun, 17 Jun 2012 16:28:40 -0500" />
                    <attachment id="11337" name="date-equiv3.patch" size="2137" author="bbloom" created="Mon, 18 Jun 2012 16:45:07 -0500" />
                    <attachment id="11295" name="date-equiv.patch" size="731" author="bbloom" created="Tue, 5 Jun 2012 21:28:33 -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-303] (case e ...) evaluates e multiple times</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-303</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;(case (do (pr 1) 2) 3 4 5 6 7) ; CLJS prints 117, CLJ prints 17&lt;/p&gt;</description>
                <environment></environment>
            <key id="15514">CLJS-303</key>
            <summary>(case e ...) evaluates e multiple times</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="bbloom">Brandon Bloom</reporter>
                        <labels>
                    </labels>
                <created>Tue, 5 Jun 2012 20:01:21 -0500</created>
                <updated>Wed, 6 Jun 2012 11:22:33 -0500</updated>
                    <resolved>Wed, 6 Jun 2012 11:22:33 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28729" author="michalmarczyk" created="Tue, 5 Jun 2012 23:09:50 -0500"  >&lt;p&gt;The attached patch fixes the case macro so that its first arg is only evaluated once.&lt;/p&gt;</comment>
                    <comment id="28730" author="dnolen" created="Wed, 6 Jun 2012 11:22:33 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/77d29466c7c8598a04d2f7d0ca0f05b5f3e9f154&quot;&gt;http://github.com/clojure/clojurescript/commit/77d29466c7c8598a04d2f7d0ca0f05b5f3e9f154&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11296" name="0001-CLJS-303-fix-case-so-it-only-evaluates-its-first-arg.patch" size="1107" author="michalmarczyk" created="Tue, 5 Jun 2012 23:09: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>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-302] Implement &apos;clojure.core/bases&apos;</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-302</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This can be done in terms of Closure&apos;s inheritance mechanism, I guess. Example 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;(defn bases [o]
  (lazy-seq
   (when-let [ctor (and o (.-constructor o))]
     (cons ctor (bases (.-superClass_ ctor))))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15513">CLJS-302</key>
            <summary>Implement &apos;clojure.core/bases&apos;</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="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="superbobry">Sergei Lebedev</reporter>
                        <labels>
                    </labels>
                <created>Tue, 5 Jun 2012 07:32:47 -0500</created>
                <updated>Tue, 5 Jun 2012 13:48:48 -0500</updated>
                    <resolved>Tue, 5 Jun 2012 13:48:48 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28721" author="dnolen" created="Tue, 5 Jun 2012 11:36:58 -0500"  >&lt;p&gt;I see no reason to support GClosure&apos;isms in this case. I&apos;m not even sure if it should return the protocols.&lt;/p&gt;</comment>
                    <comment id="28722" author="superbobry" created="Tue, 5 Jun 2012 12:01:12 -0500"  >&lt;p&gt;Correct me if I&apos;m wrong, but afaik JavaScript has no notion of inheritance, so the only way to mimic the &lt;a href=&quot;http://clojuredocs.org/clojure_core/clojure.core/bases&quot;&gt;original&lt;/a&gt; Clojure behaviour is using &lt;em&gt;GClosure&apos;isms&lt;/em&gt;.&lt;/p&gt;</comment>
                    <comment id="28723" author="dnolen" created="Tue, 5 Jun 2012 13:48:01 -0500"  >&lt;p&gt;The original behavior is about interop. This is not necessary at all in CLJS. It also doesn&apos;t address the fact that there many other inheritance mechanisms in the wild besides GClosure&apos;s.&lt;/p&gt;</comment>
                    <comment id="28724" author="dnolen" created="Tue, 5 Jun 2012 13:48:48 -0500"  >&lt;p&gt;Won&apos;t fix.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-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-300] RegExp objects print incorrectly</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-300</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;#&quot;x&quot; is currently printing as #&amp;lt;/x/&amp;gt;&lt;/p&gt;

&lt;p&gt;js/RegExp needs an IPrintable implementation: (-pr-seq &lt;span class=&quot;error&quot;&gt;&amp;#91;re _&amp;#93;&lt;/span&gt; (list &quot;#\&quot;&quot; (.-source re) &quot;\&quot;&quot;))&lt;/p&gt;

&lt;p&gt;Unfortunately, this is blocked by the same GClosure issue as &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-68&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-68&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15511">CLJS-300</key>
            <summary>RegExp objects print incorrectly</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, 4 Jun 2012 15:43:37 -0500</created>
                <updated>Mon, 4 Jun 2012 23:52:42 -0500</updated>
                    <resolved>Mon, 4 Jun 2012 23:52:42 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28711" author="dnolen" created="Mon, 4 Jun 2012 15:58:24 -0500"  >&lt;p&gt;The simplest solution is to add a RegExp case to pr-seq.&lt;/p&gt;</comment>
                    <comment id="28712" author="bbloom" created="Mon, 4 Jun 2012 18:09:44 -0500"  >&lt;p&gt;That was surprisingly not that simple...&lt;/p&gt;

&lt;p&gt;(instance? js/RegExp obj) compiles to `cljs.core.instance_QMARK_.call(null, RegExp, obj)` which also triggers the GClosure warning. So I thought I could inline `instance?` with a macro, but the instanceof operator&apos;s operands are in reverse order of instance?&apos;s arguments. To preserve evaluation order, the expansion would be `(let &lt;a href=&quot;#~t&quot;&gt;t# ~t&lt;/a&gt; (&lt;sub&gt;&apos;js* &quot;(&lt;/sub&gt;{} instanceof ~{})&quot; ~o t#))) however even that triggers the warning because the output leaves RegExp as an expression by itself again. I wound up just special-casing simple instanceof checks against symbols in the macro.&lt;/p&gt;

&lt;p&gt;Attached patch fixes printing of RegExp objects and also enables calling (instance? js/RegExp X) without triggering the warning. Sadly, any more complex expression which evaluates to js/RegExp, or any higher order usage of instance? against that type will still trigger the warning.&lt;/p&gt;</comment>
                    <comment id="28713" author="bbloom" created="Mon, 4 Jun 2012 19:15:32 -0500"  >&lt;p&gt;As discussed, will make a separate ticket for inlining &apos;instance? and will (defn regexp? &lt;span class=&quot;error&quot;&gt;&amp;#91;o&amp;#93;&lt;/span&gt; (js* &quot;~{o} instanceof RegExp&quot;))&lt;/p&gt;</comment>
                    <comment id="28715" author="bbloom" created="Mon, 4 Jun 2012 20:46:21 -0500"  >&lt;p&gt;Updated with simplified patch&lt;/p&gt;</comment>
                    <comment id="28716" author="dnolen" created="Mon, 4 Jun 2012 23:52:42 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/63cd8ce9c7c9a8864deb676f2b855b8018698d57&quot;&gt;http://github.com/clojure/clojurescript/commit/63cd8ce9c7c9a8864deb676f2b855b8018698d57&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11292" name="print-regexp2.patch" size="1955" author="bbloom" created="Mon, 4 Jun 2012 20:42:37 -0500" />
                    <attachment id="11291" name="print-regex.patch" size="3663" author="bbloom" created="Mon, 4 Jun 2012 18:10:01 -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-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-298] CLJS-294 broke ^:export</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-298</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;the fix for munging broke &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-294&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-294&lt;/a&gt; ^:export.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15509">CLJS-298</key>
            <summary>CLJS-294 broke ^:export</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="bbloom">Brandon Bloom</assignee>
                                <reporter username="dnolen">David Nolen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 3 Jun 2012 21:40:47 -0500</created>
                <updated>Sun, 3 Jun 2012 22:59:34 -0500</updated>
                    <resolved>Sun, 3 Jun 2012 22:59:34 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28706" author="bbloom" created="Sun, 3 Jun 2012 21:55:14 -0500"  >&lt;p&gt;Whoops! I&apos;ll look into that a little later tonight (hopefully). I&apos;ll also see if I can get an export test case added to the suite.&lt;/p&gt;</comment>
                    <comment id="28707" author="dnolen" created="Sun, 3 Jun 2012 22:59:34 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/2371c1cfcf1df15384f4eed337aeab0ab1d30689&quot;&gt;http://github.com/clojure/clojurescript/commit/2371c1cfcf1df15384f4eed337aeab0ab1d30689&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11290" name="export-munge.patch" size="981" author="bbloom" created="Sun, 3 Jun 2012 22:14:45 -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-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