<!--
RSS generated by JIRA (4.4#649-r158309) at Mon May 20 07:48:34 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=labels+%3D+patch&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=labels+%3D+patch</link>
        <description>An XML representation of a search request</description>
                <language>en-us</language>
                        <issue start="0" end="53" total="53"/>
                <build-info>
            <version>4.4</version>
            <build-number>649</build-number>
            <build-date>25-07-2011</build-date>
        </build-info>
<item>
            <title>[TMACRO-2] protect let-bound symbols from macrolet expansion</title>
                <link>http://dev.clojure.org/jira/browse/TMACRO-2</link>
                <project id="10083" key="TMACRO">tools.macro</project>
                        <description>&lt;p&gt;As discussed here: &lt;a href=&quot;https://groups.google.com/d/msg/clojure-dev/-/UheAzkyI_WcJ&quot;&gt;https://groups.google.com/d/msg/clojure-dev/-/UheAzkyI_WcJ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Patch macrolet-protect.diff fixes the issue and provides a test.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15858">TMACRO-2</key>
            <summary>protect let-bound symbols from macrolet expansion</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="khinsen">Konrad Hinsen</assignee>
                                <reporter username="tomoj">Tom Jack</reporter>
                        <labels>
                        <label>bug</label>
                        <label>patch</label>
                    </labels>
                <created>Mon, 26 Nov 2012 05:15:37 -0600</created>
                <updated>Tue, 27 Nov 2012 08:41:28 -0600</updated>
                    <resolved>Tue, 27 Nov 2012 08:41:27 -0600</resolved>
                                                                    <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30041" author="tomoj" created="Mon, 26 Nov 2012 14:55:48 -0600"  >&lt;p&gt;D&apos;oh, patch macrolet-protect.diff has a bug &#8212; it doesn&apos;t macroexpand-1 if the symbol is protected.&lt;/p&gt;</comment>
                    <comment id="30045" author="tsdh" created="Tue, 27 Nov 2012 01:38:48 -0600"  >&lt;p&gt;This patch supersedes Tom&apos;s patch as discussed on the clojure-dev mailinglist.  See&lt;/p&gt;

&lt;p&gt;  Message-ID: &amp;lt;CADygAw4ArNq4Z2=ZJmT6MwkBw160ShJmfQwoFEh4VOiwxfjDKQ@mail.gmail.com&amp;gt;&lt;/p&gt;

&lt;p&gt;for reference.&lt;/p&gt;

&lt;p&gt;The patch also adds &lt;tt&gt;letfn*&lt;/tt&gt; as a form introducing protected symbols.  That one was completely missing.&lt;/p&gt;

&lt;p&gt;I added test cases for both &lt;tt&gt;let&lt;/tt&gt; as well as &lt;tt&gt;letfn&lt;/tt&gt;.&lt;/p&gt;</comment>
                    <comment id="30048" author="khinsen" created="Tue, 27 Nov 2012 08:40:36 -0600"  >&lt;p&gt;Patch applied: &lt;a href=&quot;https://github.com/clojure/tools.macro/commit/19c8197e10079f04e55d81c26884b9248762c2ca&quot;&gt;https://github.com/clojure/tools.macro/commit/19c8197e10079f04e55d81c26884b9248762c2ca&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11712" name="0001-Don-t-apply-macro-expansion-to-protected-forms.patch" size="3285" author="tsdh" created="Tue, 27 Nov 2012 01:38:48 -0600" />
                    <attachment id="11709" name="macrolet-protect.diff" size="1833" author="tomoj" created="Mon, 26 Nov 2012 05:15: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>[MTOWER-1] README should be updated to conform to contrib standard</title>
                <link>http://dev.clojure.org/jira/browse/MTOWER-1</link>
                <project id="10080" key="MTOWER">math.numeric-tower</project>
                        <description>&lt;p&gt;As per Sean Corfield&apos;s suggestion here: &lt;a href=&quot;https://groups.google.com/forum/?fromgroups=#!searchin/clojure-dev/math/clojure-dev/p5oz42gR_sk/cesMHO9cDWEJ&quot;&gt;https://groups.google.com/forum/?fromgroups=#!searchin/clojure-dev/math/clojure-dev/p5oz42gR_sk/cesMHO9cDWEJ&lt;/a&gt;&lt;br/&gt;
the math.numeric-tower README.md should be updated to be more useful, especially to newbies. &lt;/p&gt;</description>
                <environment></environment>
            <key id="15702">MTOWER-1</key>
            <summary>README should be updated to conform to contrib standard</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="markengelberg">Mark Engelberg</assignee>
                                <reporter username="xmlblog">Christian Romney</reporter>
                        <labels>
                        <label>documentation</label>
                        <label>patch</label>
                    </labels>
                <created>Sun, 16 Sep 2012 22:32:43 -0500</created>
                <updated>Mon, 17 Sep 2012 11:33:44 -0500</updated>
                    <resolved>Mon, 17 Sep 2012 11:33:44 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29456" author="xmlblog" created="Sun, 16 Sep 2012 22:50:03 -0500"  >&lt;p&gt;Please ignore previous patch (doesn&apos;t format code examples correctly). This one looks better on Github. You can see it here: &lt;a href=&quot;https://github.com/xmlblog/math.numeric-tower&quot;&gt;https://github.com/xmlblog/math.numeric-tower&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29464" author="seancorfield" created="Mon, 17 Sep 2012 11:33:44 -0500"  >&lt;p&gt;Patch applied.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11506" name="0001-Improved-README-to-follow-standard-for-contrib.patch" size="5383" author="xmlblog" created="Sun, 16 Sep 2012 22:50:03 -0500" />
                    <attachment id="11505" name="0001-Improved-README-to-follow-standard-for-contrib.patch" size="5341" author="xmlblog" created="Sun, 16 Sep 2012 22:32: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="10001">Code</customfieldvalue>

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

<item>
            <title>[MCOMB-1] math.combinatorics README should be updated to conform to contrib standard</title>
                <link>http://dev.clojure.org/jira/browse/MCOMB-1</link>
                <project id="10079" key="MCOMB">math.combinatorics</project>
                        <description>&lt;p&gt;As per Sean Corfield&apos;s suggestion here: &lt;a href=&quot;https://groups.google.com/forum/?fromgroups=#!searchin/clojure-dev/math/clojure-dev/p5oz42gR_sk/cesMHO9cDWEJ&quot;&gt;https://groups.google.com/forum/?fromgroups=#!searchin/clojure-dev/math/clojure-dev/p5oz42gR_sk/cesMHO9cDWEJ&lt;/a&gt;&lt;br/&gt;
the math.combinatorics README.md should be updated to be more useful, especially to newbies.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15704">MCOMB-1</key>
            <summary>math.combinatorics README should be updated to conform to contrib standard</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="markengelberg">Mark Engelberg</assignee>
                                <reporter username="xmlblog">Christian Romney</reporter>
                        <labels>
                        <label>documentation</label>
                        <label>patch</label>
                    </labels>
                <created>Mon, 17 Sep 2012 07:00:39 -0500</created>
                <updated>Mon, 17 Sep 2012 11:35:57 -0500</updated>
                    <resolved>Mon, 17 Sep 2012 11:35:57 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29465" author="seancorfield" created="Mon, 17 Sep 2012 11:35:57 -0500"  >&lt;p&gt;Patch applied.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11508" name="0001-Updated-README-to-conform-to-new-contrib-standard.patch" size="4608" author="xmlblog" created="Mon, 17 Sep 2012 07:00: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>[LOGIC-64] Support inequalities in finite domain sugar</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-64</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;The attached patch enables the follow 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;(run* [x]
  (infd x (interval 0 9))
  (eqfd (!= 6 (* 2 x))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also substitute != with &amp;lt;, &amp;gt;, &amp;gt;=, or &amp;lt;=&lt;/p&gt;</description>
                <environment></environment>
            <key id="15786">LOGIC-64</key>
            <summary>Support inequalities in finite domain sugar</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="dnolen">David Nolen</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Fri, 26 Oct 2012 22:37:35 -0500</created>
                <updated>Sat, 27 Oct 2012 11:33:23 -0500</updated>
                    <resolved>Sat, 27 Oct 2012 11:33:23 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29827" author="dnolen" created="Sat, 27 Oct 2012 11:33:23 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/core.logic/commit/423639c62584c0100f295cc87c1cf2f721e986e3&quot;&gt;http://github.com/clojure/core.logic/commit/423639c62584c0100f295cc87c1cf2f721e986e3&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11623" name="LOGIC-64-v1.patch" size="1843" author="bbloom" created="Fri, 26 Oct 2012 22:39: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>[LOGIC-44] ex* could expand macros in patterns</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-44</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;So, tagged data structures are probably interesting in a relational context. Say you have a relation with some default logic about dogs:&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;(defna friendlyo [Dog-Or-Breed]
    ([:Spot] succeed)
    ([:Spike] fail)
    ([Other-Dog] (fresh [Breed] (dog-breed Other-Dog Breed) (friendlyo Breed)))
    ([(breed :miniature-dachshund)] fail)
    ([(breed :golden-retriever)] succeed)
    ;. . .)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Assume there&apos;s a (defmacro breed &lt;span class=&quot;error&quot;&gt;&amp;#91;t&amp;#93;&lt;/span&gt; `&lt;span class=&quot;error&quot;&gt;&amp;#91;:breed ~t&amp;#93;&lt;/span&gt;).&lt;/p&gt;

&lt;p&gt;That&apos;s nicer than having to drop &lt;span class=&quot;error&quot;&gt;&amp;#91;:breed :golden-retriever&amp;#93;&lt;/span&gt; in there or whatever, since it&apos;s compile-time-checkable, less error-prone, reduces duplication, etc.&lt;/p&gt;

&lt;p&gt;This little patch makes ex* expand macros in patterns so it doesn&apos;t treat e.g. (breed :golden-retriever) as introducing a new LVar called &quot;breed&quot;. Test also provided.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15582">LOGIC-44</key>
            <summary>ex* could expand macros in patterns</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="dnolen">David Nolen</assignee>
                                <reporter username="joeosborn">Joe Osborn</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                        <label>test</label>
                    </labels>
                <created>Thu, 19 Jul 2012 16:32:01 -0500</created>
                <updated>Sun, 17 Mar 2013 19:05:17 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28996" author="dnolen" created="Thu, 19 Jul 2012 16:41:30 -0500"  >&lt;p&gt;I&apos;m surprised that this doesn&apos;t already work. We have support for unifying expressions in the pattern already. Look at line 1230 in tests.clj in the master branch.&lt;/p&gt;

&lt;p&gt;So this should just work, no need to explicitly support macros as far as I can tell. If it&apos;s not working, then there&apos;s a bug.&lt;/p&gt;</comment>
                    <comment id="28997" author="joeosborn" created="Thu, 19 Jul 2012 17:18:48 -0500"  >&lt;p&gt;At least on 0.7.5, matching against a macro gives a runtime 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;Exception in thread &lt;span class=&quot;code-quote&quot;&gt;&quot;main&quot;&lt;/span&gt; java.lang.ClassCastException: clojure.core.logic.LVar cannot be &lt;span class=&quot;code-keyword&quot;&gt;cast&lt;/span&gt; to clojure.lang.IFn
	at rl.core$glyph_$fn__123$fn__144$fn__165$fn__166$_inc__167$fn__168.invoke(core.clj:61)
	at clojure.core.logic.Substitutions.bind(logic.clj:211)
	at rl.core$glyph_$fn__123$fn__144$fn__165$fn__166$_inc__167.invoke(core.clj:58)
	at clojure.core.logic$fn__1056$_inc__1057.invoke(logic.clj:1160)
	at clojure.core.logic$fn__1056$_inc__1057.invoke(logic.clj:1160)
	at clojure.core.logic$fn__898$_inc__899.invoke(logic.clj:823)
	at clojure.core.logic$fn__890$fn__891.invoke(logic.clj:828)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Using a fn instead of a macro gives the same:&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 in thread &lt;span class=&quot;code-quote&quot;&gt;&quot;main&quot;&lt;/span&gt; java.lang.ClassCastException: clojure.core.logic.LVar cannot be &lt;span class=&quot;code-keyword&quot;&gt;cast&lt;/span&gt; to clojure.lang.IFn
	at rl.core$drawable_$fn__235$fn__248$fn__249$_inc__250$fn__251.invoke(core.clj:67)
	at clojure.core.logic.Substitutions.bind(logic.clj:211)
	at rl.core$drawable_$fn__235$fn__248$fn__249$_inc__250.invoke(core.clj:65)
	at clojure.core.logic$fn__1056$_inc__1057.invoke(logic.clj:1160)
	at clojure.core.logic$fn__894$_inc__895.invoke(logic.clj:826)
	at clojure.core.logic$fn__1056$_inc__1057.invoke(logic.clj:1160)
	at clojure.core.logic$fn__898$_inc__899.invoke(logic.clj:823)
	at clojure.core.logic$fn__898$_inc__899.invoke(logic.clj:823)
	at clojure.core.logic$fn__898$_inc__899.invoke(logic.clj:823)
	at clojure.core.logic$fn__890$fn__891.invoke(logic.clj:828)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here&apos;s (glyph-) for reference (don&apos;t mind all the extra [], I have a weird key/value thing because of some conveniences for maintaining fact identity in a temporal database):&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;(defna glyph- [Key Val]
	([[Thing] [Glyph]] (thing- [Thing]) (on-fire_ *turn* [Thing]) (== Glyph \&#948;))
	([[Thing] [Glyph]] (thing- [Thing]) (fresh [Type] (type- [Thing] [Type]) (glyph- [Type] [Glyph])))
	([[(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :player)] [Glyph]] (== Glyph \@))
	([[(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)] [Glyph]] (== Glyph \D))
	([[Type] [Glyph]] (== Glyph \?)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and type-enum as a macro:&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 type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; [v] `[:&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :type ~v])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and as a fn:&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 type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; [v] [:&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :type ~v])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I&apos;ll mess around and see if my example works in HEAD.&lt;/p&gt;</comment>
                    <comment id="28998" author="joeosborn" created="Thu, 19 Jul 2012 17:37:36 -0500"  >&lt;p&gt;Same exception with this test case in HEAD (sorry for all the facts):&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;(defrel thing- [Thing])
(defrel type- [Thing] [Type])
(fact thing- [0])
(fact thing- [1])
(fact thing- [2])
(fact type- [0] [:player])
(fact type- [1] [:dragon])
(fact type- [2] [:pig])
(defn type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; [t] [:type t])
(defna drawable- [Key]
  ([[Thing]] (thing- [Thing]) (fresh [Type] (type- [Thing] [Type]) (drawable- [Type])))
  ([[(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :player)]] succeed)
  ([[(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)]] succeed))

(deftest &lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt;-fns-work
	(is (= (run* [q] (drawable- [q])) &apos;(0 1))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now that I look at it, I may be expecting a wrong-format return value, but the point is that I don&apos;t even get that far.&lt;/p&gt;

&lt;p&gt;Using the REPL, I checked out how (defna drawable- . . .) expands (tidied up slightly):&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 drawable- (clojure.core/fn ([Key] 
  (clojure.core.logic/conda 
	  ((clojure.core.logic/fresh [Thing] (clojure.core.logic/== [Thing] Key) (thing- [Thing]) (fresh [Type] (type- [Thing] [Type]) (drawable- [Type])))) 
		((clojure.core.logic/fresh [type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt;] 
		  (clojure.core.logic/== [(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :player)] Key) succeed))
		((clojure.core.logic/fresh [type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt;] 
		  (clojure.core.logic/== [(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)] Key) succeed))))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note the (clojure.core.logic/fresh &lt;span class=&quot;error&quot;&gt;&amp;#91;type-enum&amp;#93;&lt;/span&gt; . . .) forms, which are exactly what I would not want to see in this case.&lt;/p&gt;

&lt;p&gt;I&apos;m not really sure why this doesn&apos;t work here yet works for the matche test case.&lt;/p&gt;</comment>
                    <comment id="28999" author="dnolen" created="Thu, 19 Jul 2012 17:47:23 -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;[(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)]&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This pattern make it seem like you want to match:&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;[[:type :dragon]]&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note extra level of brackets here. Is this the case?&lt;/p&gt;

&lt;p&gt;Even so I agree that the expansion doesn&apos;t look quite right. We should never descend into a seq form like that.&lt;/p&gt;</comment>
                    <comment id="29001" author="joeosborn" created="Thu, 19 Jul 2012 17:57:03 -0500"  >&lt;p&gt;Yes, that&apos;s exactly the desired outcome in this case--a tagged value in my naive interpretation. Is the reason it fails whereas the test on :1230 doesn&apos;t the fact that it&apos;s producing a vector and not a list? Changing the fn to return a list instead of a vector didn&apos;t seem to help.&lt;/p&gt;

&lt;p&gt;My patch, fwiw, doesn&apos;t exhibit that behavior (at least for macros, haven&apos;t tested it with fns).&lt;/p&gt;</comment>
                    <comment id="29002" author="dnolen" created="Thu, 19 Jul 2012 21:11:27 -0500"  >&lt;p&gt;What I mean is don&apos;t you want the following instead?&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;(defna drawable- [Key]
  ([[Thing]] (thing- [Thing]) (fresh [Type] (type- [Thing] [Type]) (drawable- [Type])))
  ([(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :player)] succeed)
  ([(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)] succeed))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that I removed a layer of square brackets.&lt;/p&gt;</comment>
                    <comment id="29005" author="joeosborn" created="Fri, 20 Jul 2012 10:28:39 -0500"  >&lt;p&gt;Nope! I actually want both. I&apos;m doing some temporal logic stuff and I wanted some conveniences for &quot;updating&quot; a fluent, so I wanted to distinguish between the &quot;key part&quot; and the &quot;value part&quot; of the arguments. It looks silly for facts with no &quot;value part&quot;, but it lets me write procedures and fns 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;(defrel heldo Time Fluent)
(defrel &#172;heldo Time Fluent)
(declare fluent-obtainedo) ; most recent &apos;held&apos; not terminated by a &apos;&#172;held&apos;, or fail
(defn alter-fluent [Time Rel Key NewVal]
  ;todo: error check, ensure old != &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt;, old obtains, &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; does not obtain
  (doseq [old-val (run* [old-val] (fluent-obtainedo Time [Rel Key old-val]))]
    (fact &#172;heldo Time [Rel Key old-val]))
  (fact heldo Time [Rel Key NewVal]))
. . .
(fact heldo 0 [&apos;pos [0] [0 0]])
. . .
(alter-fluent 1 &apos;pos [0] [1 1])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And I write all the non-temporal fluents that way too for consistency and to help prevent mistakes.&lt;/p&gt;</comment>
                    <comment id="29009" author="dnolen" created="Fri, 20 Jul 2012 14:58:13 -0500"  >&lt;p&gt;I&apos;ll try to give a closer look at this issue over the weekend.&lt;/p&gt;</comment>
                    <comment id="30787" author="dnolen" created="Sun, 17 Mar 2013 19:05:17 -0500"  >&lt;p&gt;We&apos;re thinking about a more general solution here: &lt;a href=&quot;http://github.com/clojure/core.logic/wiki/Better-syntax-support&quot;&gt;http://github.com/clojure/core.logic/wiki/Better-syntax-support&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11389" name="exstar-macros.patch" size="1931" author="joeosborn" created="Thu, 19 Jul 2012 16:32: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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-297] Eliminate :meta, :vector, :set, and :map ops</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-297</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The attached patch eliminates the :meta, :set, :vector, and :map ops.&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<item>
            <title>[CLJS-294] AST contains munged symbols</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-294</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;All of the symbols in the abstract syntax tree are munged according for use in JavaScript. This is a problem because it means the AST is lossy and new compiler backends may have differing munging rules.&lt;/p&gt;

&lt;p&gt;The attached patch removes all munging from the analysis phase and moves it into the emit phase. The emit phase is backend specific, so it&apos;s an appropriate place for munging.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15504">CLJS-294</key>
            <summary>AST contains munged 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="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Sat, 2 Jun 2012 18:20:49 -0500</created>
                <updated>Sun, 3 Jun 2012 17:12:28 -0500</updated>
                    <resolved>Sun, 3 Jun 2012 17:12:28 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28691" author="dnolen" created="Sun, 3 Jun 2012 09:55:45 -0500"  >&lt;p&gt;It may be better to formalize munging as there are some other bits different backend must do, Raphael Amiard has taken some notes on this here: &lt;a href=&quot;http://github.com/raph-amiard/clojurescript/wiki/How-to-modularize-parse-analyze-phases-in-the-compiler&quot;&gt;http://github.com/raph-amiard/clojurescript/wiki/How-to-modularize-parse-analyze-phases-in-the-compiler&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28695" author="bbloom" created="Sun, 3 Jun 2012 11:33:16 -0500"  >&lt;p&gt;I agree that we&apos;ll eventually want to formalize munging. However, whenever that happens, it should still happen &lt;b&gt;after&lt;/b&gt; the AST is constructed. Munging shouldn&apos;t happen at all if you&apos;re doing refactoring or the like, where you query the AST. Munging is code generation concern.&lt;/p&gt;

&lt;p&gt;Prior to my patch, the AST needs to support both :name and :name-sym keys to get around the fact that the :name key loses fidelity of the original symbol. This complects the Clojure-specific parse phase with target-specific needs. The patch renames :name-sym to replace :name.&lt;/p&gt;

&lt;p&gt;I read Raphael&apos;s notes and he and I have a email thread going on too. With that in mind, this is a step towards untangling the architectural layers of the compiler. By better segregating parse from emit, it will be easier to break the analyzer out from the code generation backend.&lt;/p&gt;</comment>
                    <comment id="28700" author="dnolen" created="Sun, 3 Jun 2012 17:12:28 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/a9d1dc6a043e8a6367492a2cf8622f73f2a947f9&quot;&gt;http://github.com/clojure/clojurescript/commit/a9d1dc6a043e8a6367492a2cf8622f73f2a947f9&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11285" name="emit-munge.patch" size="24104" author="bbloom" created="Sat, 2 Jun 2012 18:20: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>
                                            <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-289] Represent ast :children as a vector of keys</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-289</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;See discussion here: &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/vZLVKmKX0oc/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/vZLVKmKX0oc/discussion&lt;/a&gt;&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;The nodes (expression objects) which make up the ClojureScript AST seems to be really well thought out and I would be careful in making the proposed change.&lt;/p&gt;</comment>
                    <comment id="28719" author="dnolen" created="Tue, 5 Jun 2012 08:09:05 -0500"  >&lt;p&gt;Agreed I think it&apos;s far too early to have a ticket for this. Confluence page first.&lt;/p&gt;</comment>
                    <comment id="29283" author="bbloom" created="Wed, 29 Aug 2012 00:09:12 -0500"  >&lt;p&gt;Design page here: &lt;a href=&quot;http://dev.clojure.org/display/design/AST+children&quot;&gt;http://dev.clojure.org/display/design/AST+children&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11276" name="children-keys.patch" size="8838" author="bbloom" created="Thu, 31 May 2012 17:51:17 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJ-1203] Fallback to hash-based comparison for non-Comparables in Util.compare()</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1203</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;I oftentimes use sorted collections, and my comparator functions usually look like that:&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;(fn [a b]
  (let [x (compare-according-to-my-use-case a b)]
    (if (zero? x)
       (compare a b)
       x)))
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That is, I define the sorting order depending on the requirements of my use-case, and if that doesn&apos;t suffice to make a distinction, I simply fall back to the standard `compare` function in order to get a stable ordering anyhow. I think that&apos;s a widely used idiom, e.g., also used in &quot;Clojure Programming&quot; (for example page 109).&lt;/p&gt;

&lt;p&gt;The problem with this approach is that several data structures don&apos;t implement Comparable, and thus aren&apos;t applicable to `compare` (you&apos;ll get a ClassCastException).  Examples are maps, records, deftypes, and sequences.&lt;/p&gt;

&lt;p&gt;The patch I&apos;m going to attach extends `Util.compare()` with a fallback clause that performs a `hasheq()`-based comparison.  This results in a meaningless but at least stable sorting order which suffices for use-cases like the one  shown above.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16148">CLJ-1203</key>
            <summary>Fallback to hash-based comparison for non-Comparables in Util.compare()</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="tsdh">Tassilo Horn</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                    </labels>
                <created>Wed, 17 Apr 2013 02:42:29 -0500</created>
                <updated>Mon, 29 Apr 2013 02:30:08 -0500</updated>
                    <resolved>Mon, 29 Apr 2013 02:30:08 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="30974" author="jafingerhut" created="Thu, 18 Apr 2013 21:01:21 -0500"  >&lt;p&gt;Patch 0001-Add-hasheq-based-fallback-to-Util.compare.patch dated Apr 17 2013 applies cleanly to latest master, but causes several unit tests in data_structures.clj to fail.  These are the kinds of things you would expect to fail with the change made in the patch, because the failing tests expect an exception to be thrown when comparing objects that don&apos;t implement Comparable, and with this patch&apos;s changes they no longer do.  If this patch&apos;s change is desired, those tests should probably be removed.&lt;/p&gt;</comment>
                    <comment id="30975" author="tsdh" created="Fri, 19 Apr 2013 02:34:51 -0500"  >&lt;p&gt;Thanks Andy, I can&apos;t believe I&apos;ve forgotten to re-run the tests. &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;Anyway, I&apos;m attaching a new version of the patch that deletes the few sorted-set and sorted-set-by invocations that check that an exception is thrown when creating sorted sets containing non-Comparables.&lt;/p&gt;</comment>
                    <comment id="30976" author="tsdh" created="Fri, 19 Apr 2013 02:35:28 -0500"  >&lt;p&gt;New version of the patch.&lt;/p&gt;</comment>
                    <comment id="31003" author="jafingerhut" created="Fri, 26 Apr 2013 14:47:49 -0500"  >&lt;p&gt;Tassilo, you say that one of your use cases is sorted collections.  Note that any compare function that returns 0 for two values will cause sorted sets and maps to treat the two compared values as equal, and at most one of them will get into the ordered set/map, the second treated as a duplicate, even though the values are not equal.  See &lt;a href=&quot;https://github.com/jafingerhut/thalia/blob/master/doc/other-topics/comparators.md#comparators-for-sorted-sets-and-maps-are-easy-to-get-wrong&quot;&gt;https://github.com/jafingerhut/thalia/blob/master/doc/other-topics/comparators.md#comparators-for-sorted-sets-and-maps-are-easy-to-get-wrong&lt;/a&gt; for an example (not based on your modified compare, but on a comparator that returns 0 for non-equal items).&lt;/p&gt;

&lt;p&gt;With your proposed change to compare, this occurrence would become very dependent upon the hash function used.  Probably quite rare, but it would crop up from time to time, and could potentially be very difficult to detect and track down the source.&lt;/p&gt;</comment>
                    <comment id="31019" author="tsdh" created="Mon, 29 Apr 2013 02:29:56 -0500"  >&lt;p&gt;Hi Andy, you are right.  It&apos;s possible to add an explicit equals()-check in cases the hashcodes are the same, but I think there&apos;s nothing you can do in the hashcodes-equal-but-objects-are-not case.  That is, there&apos;s no way to ensure the rule sgn(compare(x, y)) == -sgn(compare(y, x)), the transitivity rule, and the compare(x, y)==0 ==&amp;gt; sgn(compare(x, z))==sgn(compare(y, z)) for all z rule.&lt;/p&gt;

&lt;p&gt;I&apos;m closing that ticket.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11965" name="0001-Add-hasheq-based-fallback-to-Util.compare.patch" size="3032" author="tsdh" created="Fri, 19 Apr 2013 02:35: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>[CLJ-1200] RestFn &amp; ArraySeq performance</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1200</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;I was profiling one of my projects and noticed a hotspot inside functions using rest arguments.&lt;/p&gt;

&lt;p&gt;Most overloads of RestFn.invoke will construct an ArraySeq object. The ArraySeq constructor calls java.lang.Class.getComponentType, which seems to be pretty slow. The array&apos;s component type is cached in a field on the ArraySeq object for the sole purpose of passing it to Reflector.prepRet. I&apos;m not entirely sure of the total utility of prepRet, but it&apos;s clearly a no-op when passed Object.class, such as the case with the non-specialized base class of ArraySeq: the component type of object[] is Object.class.&lt;/p&gt;

&lt;p&gt;The attached patch eliminates the component type field from ArraySeq and passes Object.class to prepRet directly. It may be possible to eliminate calls to prepRet all together, but I&apos;ll assume that&apos;s a different ticket. With this patch, ArraySeq initialization no longer shows up as a hotspot when profiling.&lt;/p&gt;

&lt;p&gt;Before 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;user=&amp;gt; (dotimes [n 10] (time (dotimes [i 5000000] ((fn [&amp;amp; args]) 1 2 3 4))))
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 874.742 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 900.277 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 911.164 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 872.132 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 885.495 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 897.537 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 879.691 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 888.52 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 871.556 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 1088.682 msecs&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After 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;user=&amp;gt; (dotimes [n 10] (time (dotimes [i 5000000] ((fn [&amp;amp; args]) 1 2 3 4))))
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 628.144 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 634.163 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 617.397 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 622.714 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 646.743 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 648.708 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 629.223 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 638.058 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 725.473 msecs&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;Elapsed time: 636.909 msecs&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That&apos;s about a 30% reduction in execution time.&lt;/p&gt;

&lt;p&gt;Granted it only represents a change of 52 nanoseconds per RestFn invoke (181 ns to 129 ns), but this actually was a pretty decent win for a library that makes makes almost exclusively variadic function calls in a tight loop.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16141">CLJ-1200</key>
            <summary>RestFn &amp; ArraySeq performance</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                    </labels>
                <created>Sun, 14 Apr 2013 21:49:05 -0500</created>
                <updated>Thu, 18 Apr 2013 16:03:25 -0500</updated>
                                    <version>Release 1.5</version>
                                                        <due></due>
                    <votes>3</votes>
                        <watches>3</watches>
                                <attachments>
                    <attachment id="11958" name="no-getComponentType--v001.patch" size="3501" author="bbloom" created="Sun, 14 Apr 2013 21:49:05 -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>[CLJ-1165] Forbid varargs defprotocol/definterface method declarations because those cannot be defined anyway</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1165</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Protocol, interface method declarations don&apos;t allow for varags.  Currently, for example&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;  (defprotocol FooBar
    (foo [this &amp;amp; more]))
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;compiles just fine, and &lt;tt&gt;&amp;amp;&lt;/tt&gt; is interpreted as a usual argument that happens to be&lt;br/&gt;
named &lt;tt&gt;&amp;amp;&lt;/tt&gt; without special meaning.  But clearly, the user wanted to specify a&lt;br/&gt;
varags parameter here.  The same applies to &lt;tt&gt;definterface&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;Similarly, providing method implementations via &lt;tt&gt;defrecord&lt;/tt&gt;, &lt;tt&gt;deftype&lt;/tt&gt;, and &lt;tt&gt;reify&lt;/tt&gt;&lt;br/&gt;
don&apos;t allow for varags (but dynamic extensions via &lt;tt&gt;extend&lt;/tt&gt; do).&lt;/p&gt;

&lt;p&gt;So this patch makes &lt;tt&gt;defprotocol&lt;/tt&gt; and &lt;tt&gt;definterface&lt;/tt&gt; throw an&lt;br/&gt;
&lt;tt&gt;IllegalArgumentException&lt;/tt&gt; if a user tries to use varargs in method signatures.&lt;/p&gt;

&lt;p&gt;Similarly, &lt;tt&gt;defrecord&lt;/tt&gt;, &lt;tt&gt;deftype&lt;/tt&gt;, and &lt;tt&gt;reify&lt;/tt&gt; throw an &lt;tt&gt;IllegalArgumentException&lt;/tt&gt; if&lt;br/&gt;
any method implementation arglist contains a varargs argument.&lt;/p&gt;

&lt;p&gt;This patch is a cut-down variant of my patch to &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;&lt;br/&gt;
which has been reverted shortly before Clojure 1.5 was released.  The &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1024&quot; title=&quot;Varargs protococol impls can be defined but not called&quot;&gt;&lt;del&gt;CLJ-1024&lt;/del&gt;&lt;/a&gt; patch&lt;br/&gt;
was the same as this one, but it has also forbidden destructuring in &lt;tt&gt;defprotocol&lt;/tt&gt; and&lt;br/&gt;
&lt;tt&gt;definterface&lt;/tt&gt;.  This was a bit too much, because although destructuring has no&lt;br/&gt;
semantic meaning with method declarations, it still can serve a documentation purpose.&lt;/p&gt;

&lt;p&gt;This has been discussed on the list: &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/qjkW-cv8nog/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/qjkW-cv8nog/discussion&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="16015">CLJ-1165</key>
            <summary>Forbid varargs defprotocol/definterface method declarations because those cannot be defined anyway</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="stu">Stuart Halloway</assignee>
                                <reporter username="tsdh">Tassilo Horn</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                    </labels>
                <created>Fri, 15 Feb 2013 02:13:32 -0600</created>
                <updated>Thu, 4 Apr 2013 19:24:27 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30834" author="stu" created="Fri, 29 Mar 2013 05:27:06 -0500"  >&lt;p&gt;I think that this patch would be much more helpful to users if it reported the problem form (both name and params). &lt;/p&gt;

&lt;p&gt;(And I wonder if we should be using ex-info for all errors going forward.)&lt;/p&gt;</comment>
                    <comment id="30853" author="tsdh" created="Sun, 31 Mar 2013 05:17:34 -0500"  >&lt;p&gt;New version of the patch that mentions both method name and argument vector, and uses ex-info as Stu suggested.&lt;/p&gt;</comment>
                    <comment id="30874" author="jafingerhut" created="Thu, 4 Apr 2013 19:24:27 -0500"  >&lt;p&gt;Presumuptuously changing Approval from Incomplete back to None, since the reason for marking it Incomplete seems to have been addressed with a new patch.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11933" name="0001-Protocol-interface-method-declarations-don-t-allow-f.patch" size="3236" author="tsdh" created="Sun, 31 Mar 2013 05:17: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="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJ-1161] sources jar has bad versions.properties resource</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1161</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The &quot;sources&quot; jar (at least since Clojure 1.4 and including 1.5 RC) has a bad version.properties file in it. The resource clojure/version.properties is literally:&lt;/p&gt;

&lt;p&gt;version=${version}&lt;/p&gt;

&lt;p&gt;The regular Clojure jar has the correct version string in that resource.&lt;/p&gt;

&lt;p&gt;I came across a problem when I was experimenting with the sources jar (as used by IDEs).  I naively added the sources jar to my classpath, and Clojure died on start up.  The bad clojure/versions.properties file was found first, which led to a parse error as the clojure version was being set.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16001">CLJ-1161</key>
            <summary>sources jar has bad versions.properties resource</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="stuart.sierra">Stuart Sierra</assignee>
                                <reporter username="steveminer@gmail.com">Steve Miner</reporter>
                        <labels>
                        <label>patch</label>
                    </labels>
                <created>Mon, 11 Feb 2013 10:03:01 -0600</created>
                <updated>Fri, 12 Apr 2013 09:36:58 -0500</updated>
                                    <version>Release 1.4</version>
                <version>Release 1.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                <fixVersion>Release 1.6</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30577" author="steveminer@gmail.com" created="Mon, 11 Feb 2013 10:04:27 -0600"  >&lt;p&gt;Notes from the dev mailing list:&lt;/p&gt;

&lt;p&gt;The &quot;sources&quot; JAR is generated by another Maven plugin, configured here:&lt;br/&gt;
&lt;a href=&quot;https://github.com/clojure/clojure/blob/clojure-1.5.0-RC15/pom.xml#L169-L181&quot;&gt;https://github.com/clojure/clojure/blob/clojure-1.5.0-RC15/pom.xml#L169-L181&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The simplest solution might be to just exclude the file from the sources jar. It looks like maven-source-plugin has an excludes option which would do the trick:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://maven.apache.org/plugins/maven-source-plugin/jar-mojo.html#excludes&quot;&gt;http://maven.apache.org/plugins/maven-source-plugin/jar-mojo.html#excludes&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11861" name="0001-CLJ-1161-Remove-version.properties-from-sources-JAR.patch" size="1099" author="stuart.sierra" created="Sat, 16 Feb 2013 15:19:33 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10003">Vetted</customfieldvalue>

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

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

<item>
            <title>[CLJ-1112] Var *loading-verbosely* should initialize from a JVM system property</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1112</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;I often find myself adding :verbose to a (require) or (use) clause of my (ns) in order to debug problems (especially macros, or bad namespace declarations). It would be very nice if I could define a JVM system property (say -Dclojure.load-verbosely=true) to default &lt;b&gt;loading-verbosely&lt;/b&gt; to true for a REPL session, or as part of a build. &lt;/p&gt;

&lt;p&gt;Sometimes I just like to see that namespaces load as a measure of progress, when starting an application, or when running a set of tests.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15845">CLJ-1112</key>
            <summary>Var *loading-verbosely* should initialize from a JVM system property</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="hlewisship">Howard Lewis Ship</reporter>
                        <labels>
                        <label>patch</label>
                    </labels>
                <created>Wed, 21 Nov 2012 13:19:20 -0600</created>
                <updated>Thu, 22 Nov 2012 02:14:32 -0600</updated>
                                    <version>Release 1.4</version>
                                                        <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30006" author="tsdh" created="Thu, 22 Nov 2012 02:12:02 -0600"  >&lt;p&gt;This patch implements the suggested feature.&lt;/p&gt;

&lt;p&gt;The new system property is called &lt;tt&gt;clojure.core.loading-verbosely&lt;/tt&gt; in analogy to the existing &lt;tt&gt;clojure.compile.warn-on-reflection&lt;/tt&gt;.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11697" name="0001-Allow-setting-loading-verbosely-by-system-property.patch" size="1456" author="tsdh" created="Thu, 22 Nov 2012 02:12:02 -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>[CLJ-1094] Zero-arity versions of every-pred and some-fn</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1094</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;This patch adds zero-arity versions of every-pred and some-fn with these semantics.&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;(every-pred) === (constantly true)
(some-fn)    === (constantly nil)
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;These variants are useful in situations like the following:&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;;; compute-preds-for may return zero or many predicate fns
(let [preds (compute-preds-for something)]
  (filter (apply every-pred preds) some-coll))
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15780">CLJ-1094</key>
            <summary>Zero-arity versions of every-pred and some-fn</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="tsdh">Tassilo Horn</reporter>
                        <labels>
                        <label>patch</label>
                        <label>test</label>
                    </labels>
                <created>Thu, 25 Oct 2012 07:08:28 -0500</created>
                <updated>Thu, 25 Oct 2012 07:12:35 -0500</updated>
                                                                            <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29799" author="tsdh" created="Thu, 25 Oct 2012 07:12:35 -0500"  >&lt;p&gt;This is the thread where Max Penet suggested to have 0-arity versions of the two fns:&lt;/p&gt;

&lt;p&gt;  &lt;a href=&quot;https://groups.google.com/forum/?fromgroups=#!topic/clojure/IRlN-4LH_U0&quot;&gt;https://groups.google.com/forum/?fromgroups=#!topic/clojure/IRlN-4LH_U0&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11611" name="0001-Add-zero-arity-variants-for-every-pred-and-some-fn.patch" size="3462" author="tsdh" created="Thu, 25 Oct 2012 07:08:28 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJ-1074] Read/print round-trip for +/-Infinity and NaN</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1074</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;A few float-related forms (namely, Double/POSITIVE_INFINITY, Double/NEGATIVE_INFINITY, Double/NaN) are not eval-able after a round-trip via &lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(read-string (binding [*print-dup* &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;] (pr-str f))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;The two options I see are to provide print-method implementations for these and their Float cousins, or to make Infinity, -Infinity, +Infinity, and NaN readable values. Since it sounds like edn may want to provide a spec for these values (see  &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/LeJpOhHxESs/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/LeJpOhHxESs/discussion&lt;/a&gt; and &lt;a href=&quot;https://github.com/edn-format/edn/issues/2&quot;&gt;https://github.com/edn-format/edn/issues/2&lt;/a&gt;), I think making these values directly readable as already printed is preferable. Something like Double/POSITIVE_INFINITY seems too low-level from edn&apos;s perspective, as it would refer to a Java class and constant.&lt;/p&gt;

&lt;p&gt;I&apos;m attaching a patch implementing reader support for Infinity, -Infinity, +Infinity, and NaN.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15714">CLJ-1074</key>
            <summary>Read/print round-trip for +/-Infinity and NaN</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="trptcolin">Colin Jones</reporter>
                        <labels>
                        <label>patch</label>
                    </labels>
                <created>Fri, 21 Sep 2012 19:13:48 -0500</created>
                <updated>Mon, 3 Dec 2012 13:18:40 -0600</updated>
                                    <version>Release 1.4</version>
                                                        <due></due>
                    <votes>2</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30167" author="halgari" created="Mon, 3 Dec 2012 11:34:16 -0600"  >&lt;p&gt;Please bring this up on clojure-dev. We&apos;ll be able to vet this ticket after that. &lt;/p&gt;
</comment>
                    <comment id="30168" author="trptcolin" created="Mon, 3 Dec 2012 13:18:40 -0600"  >&lt;p&gt;Should I respond to my original clojure-dev post about this (linked in the issue description above), or start a new one?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11520" name="0001-Read-Infinity-and-NaN.patch" size="1544" author="trptcolin" created="Fri, 21 Sep 2012 19:13:48 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJ-1073] Make print-sequential interruptible</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1073</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;This allows print-sequential to be interrupted by Thread.interrupt(), rather than requiring clients to resort to Thread.stop(). This is especially helpful when printing very large sequences.&lt;/p&gt;

&lt;p&gt;See also clojure-dev discussion at &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/vs0RNUQXiYE/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/vs0RNUQXiYE/discussion&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15713">CLJ-1073</key>
            <summary>Make print-sequential interruptible</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="trptcolin">Colin Jones</reporter>
                        <labels>
                        <label>patch</label>
                    </labels>
                <created>Fri, 21 Sep 2012 16:10:46 -0500</created>
                <updated>Fri, 1 Mar 2013 10:18:01 -0600</updated>
                                    <version>Release 1.4</version>
                                                        <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29522" author="jafingerhut" created="Fri, 21 Sep 2012 19:04:21 -0500"  >&lt;p&gt;In a quickly hacked up performance test on Mac OS X 10.6.8 + Oracle/Apple JDK 1.6.0_35 which I can attach, I saw about a 9% to 10% slowdown for Colin&apos;s patch in printing large vectors.&lt;/p&gt;

&lt;p&gt;I have a modified patch that only calls Thread/interrupted after every 20 items are printed, and with that version the slowdown versus the original code was about 3% to 4%.&lt;/p&gt;

&lt;p&gt;Colin, would there be any down side to checking Thread/interrupted less often for your purposes?&lt;/p&gt;

&lt;p&gt;To run performance test, edit attachment compile.sh to point at your clojure.jar, put file perftest-print.clj in the same directory, and run ./compile.sh    It should work on Mac or Linux.&lt;/p&gt;</comment>
                    <comment id="29523" author="jafingerhut" created="Sat, 22 Sep 2012 10:47:08 -0500"  >&lt;p&gt;clj-1073-allow-thread-interrupt-in-print-sequential-patch.txt dated Sep 22 2012 is similar to Colin&apos;s patch 0001-Allow-thread-interruption-in-print-sequential.patch dated Sep 21 2012, except it only checks interrupted status every 20 (or maybe 21?) times through the loop in print-sequential.  It is the one that is 3-4% slower than the current latest master Clojure code in my performance test mentioned above, versus Colin&apos;s patch which is about 9-10% slower on that test.&lt;/p&gt;</comment>
                    <comment id="29700" author="stu" created="Fri, 19 Oct 2012 15:31:32 -0500"  >&lt;p&gt;Is this primarily intended for dev-time use? I wouldn&apos;t want to lose performance for this if there is any way to implement it as a dev-time feature.&lt;/p&gt;</comment>
                    <comment id="29701" author="trptcolin" created="Fri, 19 Oct 2012 16:27:09 -0500"  >&lt;p&gt;Andy: The only caveat I can think of with checking Thread/interrupted less often is in the case of deeply nested collections.&lt;/p&gt;

&lt;p&gt;Stu: Dev-time use was the original reason for opening this, yes. But I can imagine it being needed for anytime a thread can be interrupted, whether that&apos;s by ctrl-c or other means.&lt;/p&gt;

&lt;p&gt;My original thinking, performance-wise, was that once we&apos;re already doing IO, we&apos;re probably not too concerned with CPU-bound checks like this, so I didn&apos;t bother with it. I guess with an SSD that&apos;s not as likely to be true.&lt;/p&gt;

&lt;p&gt;Locally (w/ my SSD), I&apos;m seeing that Andy&apos;s benchmark of printing a million numbers is about a second slower than the baseline with my original patch (12.08s -&amp;gt; 13.10s), and about the same with Andy&apos;s patch (12.08s -&amp;gt; 11.75s). Decreasing to a thousand numbers doesn&apos;t really show any difference (every version completes in ~1.3s). Bumping to 2 million adds 2 seconds above the baseline with my patch, and Andy&apos;s is again just a bit faster than the baseline (somehow). Bumping to 5 million runs me out of heap space &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="29913" author="jafingerhut" created="Thu, 8 Nov 2012 16:16:24 -0600"  >&lt;p&gt;clj-1073-add-print-interruptibly-patch-v1.txt dated Nov 8 2012 is the same idea as Colin&apos;s patch 0001-Allow-thread-interruption-in-print-sequential.patch dated Sep 21 2012, except it only checks (Thread/interrupted) if a new var &lt;b&gt;print-interruptibly&lt;/b&gt; is true.  Its default value is false.&lt;/p&gt;

&lt;p&gt;Performance results of the perftest-print.clj program, as driven by the test.sh script, for Clojure 1.5-beta1 and with two different patches.  All run times are elapsed, in seconds, and sorted in increasing order for easier comparison.&lt;/p&gt;

&lt;p&gt;Executive summary: Performance results when &lt;b&gt;print-interruptibly&lt;/b&gt; is left at default false value are pretty much same as today.  With &lt;b&gt;print-interruptibly&lt;/b&gt; bound to true, performance results are slower, as expected, and about the same as with Colin&apos;s patch.&lt;/p&gt;

&lt;p&gt;Original 1.5-beta1 unchanged:&lt;br/&gt;
13.75 13.80 13.83 13.87 13.93&lt;/p&gt;

&lt;p&gt;With this new &lt;b&gt;print-interruptibly&lt;/b&gt; patch, with &lt;b&gt;print-interruptibly&lt;/b&gt;&lt;br/&gt;
at default false value:&lt;br/&gt;
13.86 13.91 14.01 14.08 14.14&lt;/p&gt;

&lt;p&gt;With this new &lt;b&gt;print-interruptibly&lt;/b&gt; patch, with &lt;b&gt;print-interruptibly&lt;/b&gt;&lt;br/&gt;
bound to true while printing (so a slightly modified version of&lt;br/&gt;
perftest-print.clj that does (binding &lt;span class=&quot;error&quot;&gt;&amp;#91;*print-interruptibly* true&amp;#93;&lt;/span&gt;&lt;br/&gt;
...) around the heart of the code):&lt;br/&gt;
15.29 15.44 15.45 15.62 15.63&lt;/p&gt;

&lt;p&gt;With patch 0001-Allow-thread-interruption-in-print-sequential.patch&lt;br/&gt;
applied:&lt;br/&gt;
15.38 15.46 15.48 15.49 15.50&lt;/p&gt;</comment>
                    <comment id="29933" author="trptcolin" created="Mon, 12 Nov 2012 13:37:10 -0600"  >&lt;p&gt;Andy&apos;s latest patch looks good &amp;amp; makes it easy for the REPL and other interruptible scenarios to opt into the &quot;safe&quot; behavior. I would personally have preferred to have the &quot;safe&quot; behavior on by default, but can understand the performance concerns, and this gets me what I really wanted.&lt;/p&gt;</comment>
                    <comment id="30122" author="halgari" created="Fri, 30 Nov 2012 15:09:07 -0600"  >&lt;p&gt;Vetting as it sounds like the performance issues are taken care of. &lt;/p&gt;</comment>
                    <comment id="30580" author="jafingerhut" created="Wed, 13 Feb 2013 00:28:34 -0600"  >&lt;p&gt;clj-1073-add-print-interruptibly-patch-v2.txt dated Feb 12 2013 is identical to clj-1073-add-print-interruptibly-patch-v1.txt dated Nov 8 2012 (soon to be removed) except that it applies cleanly to latest master.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11517" name="0001-Allow-thread-interruption-in-print-sequential.patch" size="1260" author="trptcolin" created="Fri, 21 Sep 2012 16:10:46 -0500" />
                    <attachment id="11850" name="clj-1073-add-print-interruptibly-patch-v2.txt" size="3902" author="jafingerhut" created="Wed, 13 Feb 2013 00:28:34 -0600" />
                    <attachment id="11519" name="perftest-print.clj" size="284" author="jafingerhut" created="Fri, 21 Sep 2012 19:05:46 -0500" />
                    <attachment id="11518" name="test.sh" size="298" author="jafingerhut" created="Fri, 21 Sep 2012 19:05:34 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10003">Vetted</customfieldvalue>

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

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

<item>
            <title>[CLJ-1066] No dependency on jsr166y</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1066</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The Clojure 1.5.0-alpha4 jars that have been deployed to maven.org seem to have been compiled against JDK6 which causes&lt;br/&gt;
an exception if one tries to use reducers/fold.&lt;/p&gt;

&lt;p&gt;&amp;#8212; snip &amp;#8212;&lt;br/&gt;
Setup:&lt;/p&gt;

&lt;p&gt;    user=&amp;gt; (require &apos;&lt;span class=&quot;error&quot;&gt;&amp;#91;clojure.core.reducers :as r&amp;#93;&lt;/span&gt;)&lt;br/&gt;
    nil&lt;br/&gt;
    user=&amp;gt; (def v (vec (range 10000)))&lt;br/&gt;
    #&apos;user/v&lt;/p&gt;

&lt;p&gt;;; JDK7 + clojure 1.5.0-alpha4 from maven.org&lt;br/&gt;
;; &#8594; :dependencies [&lt;span class=&quot;error&quot;&gt;&amp;#91;org.clojure/clojure &amp;quot;1.5.0-alpha4&amp;quot;&amp;#93;&lt;/span&gt;] in project.clj&lt;/p&gt;

&lt;p&gt;    user=&amp;gt; (r/fold + (r/map inc v))&lt;br/&gt;
    ClassNotFoundException jsr166y.ForkJoinTask  java.net.URLClassLoader$1.run (URLClassLoader.java:366)&lt;/p&gt;

&lt;p&gt;;; JDK7 + clojure 1.5.0-alpha4 from maven.org&lt;br/&gt;
;; &#8594; :dependencies [&lt;span class=&quot;error&quot;&gt;&amp;#91;org.clojure/clojure &amp;quot;1.5.0-alpha4&amp;quot;&amp;#93;&lt;/span&gt;&lt;br/&gt;
;;                  &lt;span class=&quot;error&quot;&gt;&amp;#91;org.codehaus.jsr166-mirror/jsr166y &amp;quot;1.7.0&amp;quot;&amp;#93;&lt;/span&gt;]&lt;/p&gt;

&lt;p&gt;    user=&amp;gt; (r/fold + (r/map inc v))&lt;br/&gt;
    50005000&lt;/p&gt;

&lt;p&gt;;; JDK7 + clojure 1.5.0-alpha4 locally compiled (mvn install) against OpenJDK7&lt;br/&gt;
;; &#8594; :dependencies [&lt;span class=&quot;error&quot;&gt;&amp;#91;org.clojure/clojure &amp;quot;1.5.0-alpha4&amp;quot;&amp;#93;&lt;/span&gt;] in project.clj&lt;/p&gt;

&lt;p&gt;    user=&amp;gt; (r/fold + (r/map inc v))&lt;br/&gt;
    5000050000&lt;br/&gt;
&amp;#8212; snip &amp;#8212;&lt;/p&gt;

&lt;p&gt;It would be wonderful if this issue could be fixed before the release of 1.5.0.&lt;/p&gt;

&lt;p&gt;Have a nice day&lt;/p&gt;

&lt;p&gt;    Wolodja&lt;/p&gt;</description>
                <environment>$ java -version&lt;br/&gt;
java version &amp;quot;1.7.0_03&amp;quot;&lt;br/&gt;
OpenJDK Runtime Environment (IcedTea7 2.1.2) (7u3-2.1.2-2)&lt;br/&gt;
OpenJDK 64-Bit Server VM (build 22.0-b10, mixed mode)&lt;br/&gt;
$ lein version&lt;br/&gt;
Leiningen 2.0.0-preview10 on Java 1.7.0_03 OpenJDK 64-Bit Server VM&lt;br/&gt;
</environment>
            <key id="15691">CLJ-1066</key>
            <summary>No dependency on jsr166y</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="1">Completed</resolution>
                                <assignee username="stu">Stuart Halloway</assignee>
                                <reporter username="babilen">Wolodja Wentland</reporter>
                        <labels>
                        <label>patch</label>
                    </labels>
                <created>Tue, 11 Sep 2012 10:21:51 -0500</created>
                <updated>Sat, 20 Oct 2012 09:53:42 -0500</updated>
                    <resolved>Sat, 20 Oct 2012 09:53:42 -0500</resolved>
                            <version>Release 1.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>4</votes>
                        <watches>5</watches>
                        <comments>
                    <comment id="29427" author="tsdh" created="Wed, 12 Sep 2012 09:44:01 -0500"  >&lt;p&gt;That&apos;s really a nasty problem.  I wrote the code that makes it possible to compile clojure with either a JDK7 and native ForkJoin or an older JDK + jsr166y.  Unfortunately, if you build clojure with a JDK7, reducers&apos; fold requires a JDK7 at runtime, and if you build clojure with a JDK &amp;lt;7 + jsr166y, fold also requires jsr166y at runtime.&lt;/p&gt;

&lt;p&gt;The essential problem is that clojure is AOT-compiled to class-files and those are put into the release jars.  Ordinary clojure libraries are distributed as jar files containing clj files that are compiled when loaded.  There, the implemented approach works just fine.  For example, again your example with 1.5.0-alpha4:&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;;; 1.5.0-master4 compiled with JDK6 + jsr166y running on a JDK7
user=&amp;gt; (require &apos;[clojure.core.reducers :as r])
nil
user=&amp;gt; (def v (vec (range 10000)))
#&apos;user/v
user=&amp;gt; (r/fold + (r/map inc v))
ClassNotFoundException jsr166y.ForkJoinTask  java.net.URLClassLoader$1.run (URLClassLoader.java:366)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Now load the reducers.clj source code again, so that it
;; picks the right ForkJoin-impl for the current platform
(load-file &quot;/home/horn/Repos/clj/clojure/src/clj/clojure/core/reducers.clj&quot;)
nil
user=&amp;gt; (r/fold + (r/map inc v))
50005000
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;So IMO, the best thing we can do is to omit AOT-compilation for reducers but to include only its clj file so that it&apos;ll be compiled automatically on the platform it eventually runs.&lt;/p&gt;</comment>
                    <comment id="29428" author="tsdh" created="Wed, 12 Sep 2012 11:55:48 -0500"  >&lt;p&gt;This patch removes the clojure.core.reducers namespace from the namespaces to be AOT compiled.  So now this namespace will be JIT-compiled when being required, and at that point either the JDK7 ForkJoin classes or the jsr166y classes need to be there.&lt;/p&gt;</comment>
                    <comment id="29514" author="stu" created="Fri, 21 Sep 2012 13:31:25 -0500"  >&lt;p&gt;Rich: what is the right approach here?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11493" name="0001-Don-t-AOT-compile-clojure.core.reducers.patch" size="929" author="tsdh" created="Wed, 12 Sep 2012 11:55:48 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10007">Ok</customfieldvalue>

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

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

<item>
            <title>[CLJ-1061] when-first double evaluation</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1061</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The when-first macro will evaluate the xs expression twice.  Admittedly, it does exactly what the doc string says, but that seems undesirable to me.  Even without side effects, there&apos;s a potential performance issue if xs is some expensive operation.&lt;/p&gt;

&lt;p&gt;Patch attached. The main diff is:&lt;/p&gt;

&lt;p&gt;&amp;#45;    `(when (seq ~xs)&lt;br/&gt;
&amp;#45;       (let &lt;span class=&quot;error&quot;&gt;&amp;#91;~x (first ~xs)&amp;#93;&lt;/span&gt;&lt;br/&gt;
&amp;#45;         ~@body))))&lt;br/&gt;
+    `(when-let &lt;a href=&quot;#(seq ~xs)&quot;&gt;xs# (seq ~xs)&lt;/a&gt;&lt;br/&gt;
+       (let &lt;a href=&quot;#)&quot;&gt;~x (first xs#)&lt;/a&gt;&lt;br/&gt;
+         ~@body))))&lt;/p&gt;</description>
                <environment>Mac OS X 10.8.1, Java 1.7.0_06</environment>
            <key id="15674">CLJ-1061</key>
            <summary>when-first double evaluation</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="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="stuart.sierra">Stuart Sierra</assignee>
                                <reporter username="steveminer@gmail.com">Steve Miner</reporter>
                        <labels>
                        <label>patch</label>
                    </labels>
                <created>Tue, 4 Sep 2012 15:14:37 -0500</created>
                <updated>Sat, 20 Oct 2012 09:53:42 -0500</updated>
                    <resolved>Sat, 20 Oct 2012 09:53:42 -0500</resolved>
                            <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29509" author="stuart.sierra" created="Fri, 21 Sep 2012 07:39:03 -0500"  >&lt;p&gt;Screened.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11477" name="0001-avoid-double-evaluation-in-when-first.patch" size="1140" author="steveminer@gmail.com" created="Tue, 4 Sep 2012 15:14:37 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10007">Ok</customfieldvalue>

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

                </customfieldvalues>
            </customfield>
                                                                                    <customfield id="customfield_10003" key="com.atlassian.jira.plugin.system.customfieldtypes:userpicker">
                <customfieldname>Waiting On</customfieldname>
                <customfieldvalues>
                    <customfieldvalue>richhickey</customfieldvalue>
                </customfieldvalues>
            </customfield>
                            </customfields>
    </item>

<item>
            <title>[CLJ-1050] Remove a lock in the common case of  deref of delay</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1050</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Currently, when deref is called in Delay.java, a lock on the Delay is always acquired.&lt;br/&gt;
This is wasteful as most of the time you just want to read the val.&lt;/p&gt;

&lt;p&gt;The attached patch changes this behaviour to the following:&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;val is initialised to a known secret value. (During its constructor so it is visible from any thread).&lt;/li&gt;
	&lt;li&gt;When deref is called, val is checked to the known secret value.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;If it is not the secret value, then it has to be the value computed by the function and we return it.&lt;/li&gt;
	&lt;li&gt;If it is the secret value, then we lock this object and revert to the current behaviour.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;This is faster than what is done currently and can be very much faster if there is contention on the delay.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15645">CLJ-1050</key>
            <summary>Remove a lock in the common case of  deref of delay</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="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="nicolasoury">Nicolas Oury</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                        <label>performance</label>
                    </labels>
                <created>Sun, 26 Aug 2012 13:24:00 -0500</created>
                <updated>Tue, 18 Sep 2012 06:53:01 -0500</updated>
                    <resolved>Tue, 18 Sep 2012 06:53:01 -0500</resolved>
                            <version>Release 1.4</version>
                                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29270" author="nicolasoury" created="Mon, 27 Aug 2012 02:37:12 -0500"  >&lt;p&gt;Please close and reject. The patch is not working if val has non final fields.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11454" name="0001-No-lock-in-the-common-path-for-delays.patch" size="1177" author="nicolasoury" created="Sun, 26 Aug 2012 13:24: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>[CLJ-1042] [PATCH] Allow negative substring indices for (subs)</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1042</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;This adds Python-style negative string indices for (subs), e.g.:&lt;/p&gt;

&lt;p&gt;(subs &quot;foo bar&quot; -3) ;; -&amp;gt; &quot;bar&quot;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15629">CLJ-1042</key>
            <summary>[PATCH] Allow negative substring indices for (subs)</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="ieure">Ian Eure</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                    </labels>
                <created>Tue, 14 Aug 2012 13:11:40 -0500</created>
                <updated>Wed, 19 Sep 2012 13:34:50 -0500</updated>
                    <resolved>Mon, 17 Sep 2012 07:07:57 -0500</resolved>
                            <version>Release 1.5</version>
                                                        <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="29196" author="jafingerhut" created="Thu, 16 Aug 2012 19:17:19 -0500"  >&lt;p&gt;Ian, thanks for the patch.  It is Rich Hickey&apos;s policy only to consider applying patches to Clojure from those who have signed a Clojure contributor agreement: &lt;a href=&quot;http://clojure.org/contributing&quot;&gt;http://clojure.org/contributing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Were you interested in doing so, or perhaps it is already in progress?&lt;/p&gt;</comment>
                    <comment id="29232" author="ieure" created="Mon, 20 Aug 2012 11:44:04 -0500"  >&lt;p&gt;I wasn&apos;t aware that this was necessary. I&apos;m mailing the form in.&lt;/p&gt;</comment>
                    <comment id="29275" author="jafingerhut" created="Mon, 27 Aug 2012 19:56:00 -0500"  >&lt;p&gt;Patch clj-1042-negative-subs-patch2.txt dated Aug 27 2012 is identical to Ian Eure&apos;s negative-subs.patch, except it is in the desired git format.&lt;/p&gt;

&lt;p&gt;Ian, for future reference on creating patches in the desired format, see the instructions under the heading &quot;Development&quot; on this page: &lt;a href=&quot;http://dev.clojure.org/display/design/JIRA+workflow&quot;&gt;http://dev.clojure.org/display/design/JIRA+workflow&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29279" author="ieure" created="Tue, 28 Aug 2012 11:47:43 -0500"  >&lt;p&gt;Thanks, will do.&lt;/p&gt;</comment>
                    <comment id="29358" author="steveminer@gmail.com" created="Tue, 4 Sep 2012 15:53:22 -0500"  >&lt;p&gt;If Clojure decides to support Python-style negative indices, you should also consider adding support to subvec.&lt;/p&gt;</comment>
                    <comment id="29386" author="ieure" created="Thu, 6 Sep 2012 12:17:30 -0500"  >&lt;p&gt;Patch extended to support negative indices on  (subvec) as well.&lt;/p&gt;</comment>
                    <comment id="29396" author="abp" created="Fri, 7 Sep 2012 08:01:17 -0500"  >&lt;p&gt;The arg to rindex should probably be tagged with ^clojure.lang.Counted instead of ^String now.&lt;/p&gt;</comment>
                    <comment id="29401" author="steveminer@gmail.com" created="Fri, 7 Sep 2012 13:31:44 -0500"  >&lt;p&gt;Regarding the previous comment, String is a Java class so it isn&apos;t a clojure.lang.Counted.  Is the type hint necessary?  Maybe it should be on the call rather than the defn.  &lt;/p&gt;

&lt;p&gt;Ignoring the type hinting, I&apos;ll suggest a slightly simpler way to implement the rindex logic:&lt;/p&gt;

&lt;p&gt;(defn rindex &lt;span class=&quot;error&quot;&gt;&amp;#91;coll i&amp;#93;&lt;/span&gt;&lt;br/&gt;
  (if (neg? i) (+ (count coll) i) i))&lt;/p&gt;

&lt;p&gt;In any case, I&apos;m not sure rindex should be public even if you want the subs and subvec enhancements.  Someone needs to make the case for adding a new function to core.&lt;/p&gt;

&lt;p&gt;The Pythonic negative index is a debatable feature since it&apos;s pretty easy to implement for yourself if you want it.&lt;/p&gt;</comment>
                    <comment id="29404" author="abp" created="Fri, 7 Sep 2012 23:05:07 -0500"  >&lt;p&gt;Sorry, the type hint on rindex args isn&apos;t necessary at all. Just looked up in the source, calling count should never be reflective, since (count ..) emits calls to clojure.lang.RT/count.&lt;/p&gt;

&lt;p&gt;Your solution looks good.&lt;/p&gt;</comment>
                    <comment id="29460" author="stu" created="Mon, 17 Sep 2012 07:07:45 -0500"  >&lt;p&gt;Negative indices were considered and rejected a long time ago. (I am merely conveying information--I have no strong opinion on this one.)&lt;/p&gt;</comment>
                    <comment id="29467" author="jafingerhut" created="Mon, 17 Sep 2012 12:07:56 -0500"  >&lt;p&gt;Note: If some people really like negative index behavior as in Perl or Python, it is straightforward to create a library of functions in a different namespace, perhaps with different names, that can do it.  Perhaps a &quot;pythonisms&quot; library?&lt;/p&gt;</comment>
                    <comment id="29485" author="ieure" created="Tue, 18 Sep 2012 12:31:06 -0500"  >&lt;p&gt;Would this be accepted as part of clojure.string instead? I considered putting it there, but thought it would be confusing to have multiple substring functions in different namespaces.&lt;/p&gt;

&lt;p&gt;This is very helpful in practice, and I&apos;d really like to see at least the (subs) stuff in Clojure.&lt;/p&gt;</comment>
                    <comment id="29486" author="jafingerhut" created="Tue, 18 Sep 2012 14:52:23 -0500"  >&lt;p&gt;Disclaimer: I&apos;m no Clojure/core member, so can&apos;t speak authoritatively on whether something would or would not be accepted into clojure.string.&lt;/p&gt;

&lt;p&gt;However, given that clojure.string is distributed with clojure.core, my guess is it would not be accepted.  You&apos;d be able to get things like this out for you and others as a separate library distributed on Clojars.  That would also make it easy to include other Python-like things that you don&apos;t find in Clojure already.&lt;/p&gt;</comment>
                    <comment id="29489" author="ieure" created="Tue, 18 Sep 2012 16:02:24 -0500"  >&lt;p&gt;This isn&apos;t about &quot;python-like things,&quot; this is about a useful feature. Lots of languages support this: Perl, PHP, Ruby, Python, JavaScript, to name a few. Are you really suggesting that I should create a whole package for a version of a function in clojure.core with slightly different semantics? That&apos;s insane.&lt;/p&gt;

&lt;p&gt;Anyway, I&apos;m done wasting my time trying to navigate this hopelessly broken process. Maybe it would have been accepted if I included yet another way to interoperate with Java types.&lt;/p&gt;</comment>
                    <comment id="29490" author="michaelklishin" created="Tue, 18 Sep 2012 17:09:44 -0500"  >&lt;p&gt;Stuart, do you remember why specifically negative indexes were rejected? Developing a separate library for a minor improvement to an existing function sounds unreasonable.&lt;/p&gt;</comment>
                    <comment id="29491" author="holo" created="Tue, 18 Sep 2012 17:10:23 -0500"  >&lt;p&gt;some explanation about this topic was given by Rich Hickey himself here: &lt;a href=&quot;http://news.ycombinator.com/item?id=2053908&quot;&gt;http://news.ycombinator.com/item?id=2053908&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;citation:&lt;br/&gt;
&quot;...Yes, there is a backlog from when it was just me, and it will take a while to whittle down. We have finite resources and have to prioritize. I can assure you we have more important things to concentrate on than your negative index substring enhancement, and are doing so. You&apos;ll just have to be patient. Or, if you insist, I&apos;ll just reject it now because a) IMO it&apos;s goofy, b) you can make your own function that works that way c) we don&apos;t get a free ride from j.l.String, d) it begs the question of negative indices elsewhere...&quot;&lt;/p&gt;

&lt;p&gt;i&apos;ve been following this thread hoping this feature would be included. but whatever the reason was for the rejection, i&apos;m sure it was thoughtful. great thanks for this wonderful language, and thanks Ian Eure for his effort.&lt;/p&gt;</comment>
                    <comment id="29492" author="steveminer@gmail.com" created="Tue, 18 Sep 2012 17:25:41 -0500"  >&lt;p&gt;That HN link eventually leads back to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-688&quot; title=&quot;subs function should count back from the end of the string when given negative offset&quot;&gt;&lt;del&gt;CLJ-688&lt;/del&gt;&lt;/a&gt; which was rejected.&lt;/p&gt;</comment>
                    <comment id="29499" author="stu" created="Wed, 19 Sep 2012 12:03:38 -0500"  >&lt;p&gt;Michael: A proposal for negative indexes would need to be systematic in considering implications for all functions that have index arguments.&lt;/p&gt;

&lt;p&gt;Ian: Clojure is driven by design, not incremental piling of features.&lt;/p&gt;

&lt;p&gt;All: clojure.string is incomplete in more important and fundamental ways than negative indexes. This sucks now, and will suck worse as more code is written in different dialects. I find myself wishing string was a contrib, so we could iterate faster.&lt;/p&gt;</comment>
                    <comment id="29500" author="jafingerhut" created="Wed, 19 Sep 2012 13:34:50 -0500"  >&lt;p&gt;Stuart: Any specific proposals for how you&apos;d like to see clojure.string improve?  If it can be made a contrib, that would be cool, but understood if that would be considered too breaking of a change.  Even if it isn&apos;t made a contrib, having tickets for improvement ideas you are willing to see means patches might get written, and they&apos;ll get in some time.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11480" name="clj-1042-negative-indices-patch3.txt" size="6402" author="ieure" created="Thu, 6 Sep 2012 12:17:30 -0500" />
                    <attachment id="11425" name="negative-subs.patch" size="3266" author="ieure" created="Tue, 14 Aug 2012 13:11:40 -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>[CLJ-1024] Varargs protococol impls can be defined but not called</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1024</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The compiler accepts this:&lt;/p&gt;

&lt;p&gt;(deftype foo []&lt;br/&gt;
  clojure.lang.IFn&lt;br/&gt;
  (invoke &lt;span class=&quot;error&quot;&gt;&amp;#91;this &amp;amp; xs&amp;#93;&lt;/span&gt;))&lt;/p&gt;

&lt;p&gt;However calling ((foo.) :bar) will throw an AbstractMethodError. Wouldn&apos;t some checking be desirable?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15574">CLJ-1024</key>
            <summary>Varargs protococol impls can be defined but not called</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="stu">Stuart Halloway</assignee>
                                <reporter username="vemv">V&#237;ctor M. Valenzuela</reporter>
                        <labels>
                        <label>patch</label>
                    </labels>
                <created>Tue, 10 Jul 2012 10:09:45 -0500</created>
                <updated>Thu, 14 Feb 2013 10:03:07 -0600</updated>
                    <resolved>Wed, 13 Feb 2013 21:22:42 -0600</resolved>
                            <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28971" author="tsdh" created="Wed, 11 Jul 2012 01:20:22 -0500"  >&lt;p&gt;First of all, clojure.lang.IFn is no protocol but an interface.  And it does not declare a&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;  public Object invoke(Object... obs)
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;method.  It has an `invoke` method with 20 Object parameters followed by an Object... parameter, but to give an implementation for that, you have to specify every parameter separately, and the last Object... arg is just a normal argument that must be an Object[].  That&apos;s because Java-varags Type... parameters are just Java syntax sugar, but in the byte-code its simply a Type-array.&lt;/p&gt;

&lt;p&gt;What your example does is provide an `invoke` implementation for the 2-args version, where the first parameter happens to be named `&amp;amp;`, which has no special meaning here.  Take that example:&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;(deftype MyFoo []
  clojure.lang.IFn
  (invoke [this &amp;amp; xs]
    [&amp;amp; xs]))

((MyFoo.) 1 2)
=&amp;gt; [1 2]
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;But you are right in that `deftype`, `defrecord`, `defprotocol`, and `definferface` probably should error if user&apos;s seem to try to use varargs or destructuring.&lt;/p&gt;</comment>
                    <comment id="28972" author="vemv" created="Wed, 11 Jul 2012 01:55:22 -0500"  >&lt;p&gt;Cheers for a most clarifying response.&lt;/p&gt;

&lt;p&gt;The fact that the meaning of &amp;amp; gets &apos;subverted&apos; makes the issue only (slightly) worse, in my opinion.&lt;/p&gt;

&lt;p&gt;Just for the record, destructuring seems to work, at least for interface impls.&lt;/p&gt;</comment>
                    <comment id="28973" author="tsdh" created="Wed, 11 Jul 2012 02:42:33 -0500"  >&lt;p&gt;&amp;gt; The fact that the meaning of &amp;amp; gets &apos;subverted&apos; makes the issue only (slightly) worse, in my opinion.&lt;/p&gt;

&lt;p&gt;I agree.  I&apos;ll attach a patch which checks for those invalid usages soon.&lt;/p&gt;

&lt;p&gt;&amp;gt; Just for the record, destructuring seems to work, at least for interface impls.&lt;/p&gt;

&lt;p&gt;Could you please provide a complete example demonstrating your statement?&lt;/p&gt;

&lt;p&gt;I&apos;m rather sure that varargs and destructuring don&apos;t work for any of defprotocol, definterface, deftype, defrecord, and reify.  But you can use varargs and destructuring when providing dynamic implementations via `extend` (or `extend-protocol`, `extend-type`), because those impls are real functions in contrast to methods.&lt;/p&gt;</comment>
                    <comment id="28974" author="tsdh" created="Wed, 11 Jul 2012 02:43:31 -0500"  >&lt;p&gt;I attached a patch.  Here&apos;s the commit message:&lt;/p&gt;

&lt;p&gt;Check for invalid varags/destrucuring uses.&lt;/p&gt;

&lt;p&gt;Protocol, interface method declarations and implementations don&apos;t allow for&lt;br/&gt;
varags and destructuring support.  Currently, for example&lt;/p&gt;

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

&lt;p&gt;compiles just fine, and &amp;amp; is interpreted as a usual argument that happens to be&lt;br/&gt;
named &amp;amp; without special meaning.  But clearly, the user wanted to specify a&lt;br/&gt;
varags parameter here.  The same applies to definterface.&lt;/p&gt;

&lt;p&gt;Similarly, providing method implementations via defrecord, deftype, and reify&lt;br/&gt;
don&apos;t allow for destructuring and varags (but dynamic extenions via extend do).&lt;/p&gt;

&lt;p&gt;So this patch makes defprotocol, definterface, defrecord, deftype, and reify&lt;br/&gt;
throw an IllegalArgumentException if any argument vector contains a&lt;br/&gt;
destructuring form or varargs argument.&lt;/p&gt;</comment>
                    <comment id="28975" author="vemv" created="Thu, 12 Jul 2012 03:13:58 -0500"  >&lt;p&gt;Glad you&apos;ve considered my request.&lt;/p&gt;

&lt;p&gt;As for destructuring, I was speaking after this example, which may or may not work like it looks like - I don&apos;t know.&lt;/p&gt;

&lt;p&gt;(deftype foo []&lt;br/&gt;
  clojure.lang.IFn&lt;br/&gt;
  (invoke [this &lt;span class=&quot;error&quot;&gt;&amp;#91;a b&amp;#93;&lt;/span&gt; c] (println a b c)))&lt;/p&gt;

&lt;p&gt;((foo.) &lt;span class=&quot;error&quot;&gt;&amp;#91;1 2&amp;#93;&lt;/span&gt; 3)&lt;/p&gt;</comment>
                    <comment id="28978" author="tsdh" created="Thu, 12 Jul 2012 08:22:47 -0500"  >&lt;p&gt;Indeed, descructuring seems to work for method implementations.  I&apos;ll adapt my patch...&lt;/p&gt;</comment>
                    <comment id="28979" author="tsdh" created="Thu, 12 Jul 2012 08:42:32 -0500"  >&lt;p&gt;Revamped patch.  Here&apos;s the commit message:&lt;/p&gt;

&lt;p&gt;Protocol, interface method declarations don&apos;t allow for varags and&lt;br/&gt;
destructuring support.  Currently, for example&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;  (defprotocol FooBar
    (foo [this &amp;amp; more]))
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;compiles just fine, and &amp;amp; is interpreted as a usual argument that happens to be&lt;br/&gt;
named &amp;amp; without special meaning.  But clearly, the user wanted to specify a&lt;br/&gt;
varags parameter here.  The same applies to definterface.&lt;/p&gt;

&lt;p&gt;Similarly, providing method implementations via defrecord, deftype, and reify&lt;br/&gt;
don&apos;t allow for varags (but dynamic extenions via extend do).&lt;/p&gt;

&lt;p&gt;So this patch makes defprotocol and definterface throw an&lt;br/&gt;
IllegalArgumentException if a user tries to use varargs and destructuring in&lt;br/&gt;
method signatures.&lt;/p&gt;

&lt;p&gt;Similarly, defrecord, deftype, and reify throw an IllegalArgumentException if&lt;br/&gt;
any method implementation arglist contains a varargs argument.&lt;/p&gt;</comment>
                    <comment id="28983" author="jafingerhut" created="Thu, 12 Jul 2012 15:43:58 -0500"  >&lt;p&gt;Tassilo, with your patch 0001-&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1024&quot; title=&quot;Varargs protococol impls can be defined but not called&quot;&gt;&lt;del&gt;CLJ-1024&lt;/del&gt;&lt;/a&gt;-Check-for-invalid-varags-destrucuring-uses.patch dated July 12, 2012, I get the following error message while testing, apparently because some metadata is missing on the new functions your patch adds to core:&lt;/p&gt;

&lt;p&gt;     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt; Testing clojure.test-clojure.metadata&lt;br/&gt;
     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt; &lt;br/&gt;
     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt; FAIL in (public-vars-with-docstrings-have-added) (metadata.clj:45)&lt;br/&gt;
     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt; expected: (= [] (remove (comp :added meta) public-vars-with-docstrin&lt;br/&gt;
gs-not-generated))&lt;br/&gt;
     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt;   actual: (not (= [] (#&apos;clojure.core/throw-on-varargs-and-destr #&apos;cl&lt;br/&gt;
ojure.core/throw-on-varargs)))&lt;/p&gt;</comment>
                    <comment id="28984" author="tsdh" created="Fri, 13 Jul 2012 02:10:35 -0500"  >&lt;p&gt;Hi Andy, this updated patch declares the two new checking fns private which makes the tests pass again.&lt;/p&gt;

&lt;p&gt;Stupid mistake by me:  Of course, I&apos;ve tested the last version, too, but afterwards I decided it wouldn&apos;t be bad to add some docstrings, and of course, adding docstrings cannot break anything. &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="29145" author="aaron" created="Tue, 14 Aug 2012 19:58:32 -0500"  >&lt;p&gt;Patch applies cleanly against 4004d267e124f12b65b0d7fb6522f32a75e3c4fb. Submitter confirmed as a CA signer. &lt;/p&gt;</comment>
                    <comment id="29146" author="aaron" created="Tue, 14 Aug 2012 20:02:17 -0500"  >&lt;p&gt;This looks ok to me, but it seems like a fair amount of duplication to accomplish the task. It seems like we should just be able to ask if it is ok to proceed, instead of having to pick which function needs to be called in what case.&lt;/p&gt;</comment>
                    <comment id="29160" author="tsdh" created="Wed, 15 Aug 2012 01:23:49 -0500"  >&lt;p&gt;Aaron, can you please elaborate?  I don&apos;t get what you mean with duplication and asking if it is ok to proceed.&lt;/p&gt;</comment>
                    <comment id="29311" author="tsdh" created="Fri, 31 Aug 2012 01:40:51 -0500"  >&lt;p&gt;Rebased to apply cleanly on master again.&lt;/p&gt;</comment>
                    <comment id="29313" author="vemv" created="Fri, 31 Aug 2012 07:11:55 -0500"  >&lt;p&gt;Pardon the silly contribution, but the added methods&apos; usage of double-negations (when-not ...) seems unnecessary.&lt;/p&gt;</comment>
                    <comment id="29314" author="tsdh" created="Fri, 31 Aug 2012 08:03:25 -0500"  >&lt;p&gt;Hi Victor, this revamped patch removes the double-negation and is more concise and clearer as a result.  So your comment wasn&apos;t as silly as you thought. &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="30594" author="tsdh" created="Thu, 14 Feb 2013 01:36:12 -0600"  >&lt;p&gt;Hey Stu, do you mind to explain why you&apos;ve declined the patch?&lt;/p&gt;</comment>
                    <comment id="30595" author="mnicky" created="Thu, 14 Feb 2013 08:52:03 -0600"  >&lt;p&gt;@Tassilo: &lt;a href=&quot;https://groups.google.com/forum/#!topic/clojure-dev/qjkW-cv8nog&quot;&gt;https://groups.google.com/forum/#!topic/clojure-dev/qjkW-cv8nog&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30597" author="tsdh" created="Thu, 14 Feb 2013 10:03:07 -0600"  >&lt;p&gt;@Marek, Stu: Thanks, I&apos;ve left a reply there: &lt;a href=&quot;https://groups.google.com/d/msg/clojure-dev/qjkW-cv8nog/rMNFqbjNj-EJ&quot;&gt;https://groups.google.com/d/msg/clojure-dev/qjkW-cv8nog/rMNFqbjNj-EJ&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11463" name="0001-CLJ-1024-Check-for-invalid-varags-destrucuring-uses.patch" size="3640" author="tsdh" created="Fri, 31 Aug 2012 08:03:25 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10008">Not Approved</customfieldvalue>

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

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

<item>
            <title>[CLJ-1018] range&apos;s behavior is inconsistent</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1018</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Problem statement: The current behavior of range is inconsistent. (range 0 9 0) has always produced (). (range 0 9 -1) has always produced (). (range 9 0 1) has always produced (). However, (range 9 0 0) produces (9 9 9 9 ...), and (range 0 0 0) produces &apos;(0 0 0 0 ...)&lt;/p&gt;

&lt;p&gt;Proposal: Make the behavior of range consistent when using a step of 0 to make it produce an empty list.&lt;/p&gt;

&lt;p&gt;Please see attached code and patch.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15557">CLJ-1018</key>
            <summary>range&apos;s behavior is inconsistent</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="devn">Devin Walters</reporter>
                        <labels>
                        <label>patch</label>
                        <label>range</label>
                    </labels>
                <created>Fri, 29 Jun 2012 16:25:03 -0500</created>
                <updated>Fri, 12 Apr 2013 09:59:12 -0500</updated>
                                    <version>Release 1.1</version>
                <version>Release 1.2</version>
                <version>Release 1.3</version>
                <version>Release 1.4</version>
                <version>Release 1.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                <fixVersion>Release 1.6</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28925" author="mikera" created="Sun, 1 Jul 2012 04:08:00 -0500"  >&lt;p&gt;Agree it is good to fix the inconsistency, but I think an infinite sequence of zeros is the correct result, as implied by the current docstring definition.&lt;/p&gt;

&lt;p&gt;It&apos;s also mathematically cleanest: range should produce an arithmetic progression until the end value is equalled or exceeded.&lt;/p&gt;

&lt;p&gt;Empty lists only seem to make sense as a return value when start &amp;gt;= end.&lt;/p&gt;</comment>
                    <comment id="28928" author="devn" created="Sun, 1 Jul 2012 12:36:08 -0500"  >&lt;p&gt;Hi Mike,&lt;/p&gt;

&lt;p&gt;Could you explain how you think the docstring definition implies this behavior? Maybe I&apos;m missing something, but I was surprised. For instance, in the case of (range 3 9 0), if start were truly inclusive as the docstring says, the result would be (3), not ().&lt;/p&gt;

&lt;p&gt;You mentioned that you think the infinite sequence of 0&apos;s is consistent and in keeping with the definition of range. I&apos;m not sure I agree. (0,0] is an empty set of length zero, and [0,0) is an empty set of length zero.&lt;/p&gt;

&lt;p&gt;You state that empty list only makes sense for start &amp;gt;= end, except this is not the current behavior. Could you help me understand what you believe the appropriate behavior would be in each of the following three cases? (range 0 10 0), (range 10 0 0), and (range 0 0 0)?&lt;/p&gt;

&lt;p&gt;A few options to consider:&lt;br/&gt;
1) Fix the docstring to reflect the actual behavior of range.&lt;br/&gt;
2) Handle the case of (range 9 3 0) =&amp;gt; (9 9 9 ...) to make it consistent with the behavior of (range 3 9 0) =&amp;gt; ()&lt;br/&gt;
3) Stop allowing a step of zero altogether.&lt;/p&gt;

&lt;p&gt;Editing to Add (Note: I don&apos;t think the way someone else did something is always the right way, just wanted to do some digging on how other people have handled this in the past):&lt;br/&gt;
&lt;a href=&quot;http://docs.python.org/library/functions.html#range&quot;&gt;http://docs.python.org/library/functions.html#range&lt;/a&gt; (0 step returns ValueError)&lt;br/&gt;
&lt;a href=&quot;http://www2.tcl.tk/10797&quot;&gt;http://www2.tcl.tk/10797&lt;/a&gt; (range returns empty list for a zero step)&lt;br/&gt;
&lt;a href=&quot;http://www.scala-lang.org/api/2.7.7/scala/Range.html&quot;&gt;http://www.scala-lang.org/api/2.7.7/scala/Range.html&lt;/a&gt; (zero step is not allowed)&lt;/p&gt;</comment>
                    <comment id="28956" author="jimpil" created="Thu, 5 Jul 2012 16:13:22 -0500"  >&lt;p&gt;It does make sense NOT to allow a step of zero (at least to me)... I wasn&apos;t going to say anything about this but if other popular languages do not allow 0, then I guess it makes more sense than I originally gave myself credit for... However, if we want to be mathematically correct then the answer would be to return an infinte seq with the start value like below. After all, what  is a step of 0? does it  make any difference how many steps you take if with every step you cover 0 distance? obviously not...you start from x and you stay at x forever...we do have repeat for this sort of thing though... &lt;/p&gt;

&lt;p&gt;(take 5 (range 3 9 0)) =&amp;gt; (3 3 3 3 3)&lt;/p&gt;

&lt;p&gt;+1 for not allowing 0 step&lt;/p&gt;</comment>
                    <comment id="28958" author="mikera" created="Sun, 8 Jul 2012 08:49:11 -0500"  >&lt;p&gt;@Devin quite simple: a lazy sequence of nums starting from x with step 0.0 until it reaches an end value of y (where y &amp;gt; x) is an infinite sequence of x.&lt;/p&gt;

&lt;p&gt;Consider the case where start is 0 and end is infinity (the default), you would expect sequences to go as follows:&lt;/p&gt;

&lt;p&gt;step +2 : 0  2  4  6  8....&lt;br/&gt;
step +1 : 0  1  2  3  4....&lt;br/&gt;
step +0 : 0  0  0  0  0....&lt;/p&gt;

&lt;p&gt;It would be inconsistent to make 0 a special case, all of these are valid arithmetic progressions. And all of these are consistent with the current docstring.&lt;/p&gt;

&lt;p&gt;If you make 0 a special case, then people will need to write special case code to handle it. Consider the code to create a multiplication table for example:&lt;/p&gt;

&lt;p&gt;(for &lt;span class=&quot;error&quot;&gt;&amp;#91;x (range 10)&amp;#93;&lt;/span&gt;&lt;br/&gt;
     (take 10 (range 0 Long/MAX_VALUE x)))&lt;/p&gt;

&lt;p&gt;This works fine if you produce an infinite sequence of zeros for step 0, but fails if you create an empty list as a special case for step 0.&lt;/p&gt;

&lt;p&gt;As a related issue, I&apos;d personally also favour negative step sizes also producing an infinite sequence. If we don&apos;t want to allow this though, then at least the docstring should be changed to say &quot;a lazy seq of non-decreasing nums&quot; and a negative step should throw an error.&lt;/p&gt;</comment>
                    <comment id="28959" author="devn" created="Mon, 9 Jul 2012 19:09:16 -0500"  >&lt;p&gt;Carrying over a message from the clojure-dev list by Stuart Sierra:&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;I called the ticket a defect. Does that seem reasonable?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;yes&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;Does anyone actually use the 0 step behavior in their programs?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;not if they have any sense&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;Has anyone been bitten by this in the past?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;not me&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;Is this behavior intentional for some historical reason I don&apos;t know about or understand?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I doubt it.&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;Has this been brought up before? I couldn&apos;t find any reference to it via Google.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Not that I know of.&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;Are there performance implications to my patch?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I doubt it. Lazy seqs are not ideal for high-performance code anyway.&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;Am I addressing a symptom rather than the problem?&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I think the &lt;b&gt;problem&lt;/b&gt; is that the result of `range` with a step of 0 was never specified. Don&apos;t assume that the tests are specifications. Many of the tests in Clojure were written by over-eager volunteers who defined the tests based on whatever the behavior happened to be. The only specification from the language designer is the docstring. By my reading, that means that `range` with a step of 0 should return an infinite seq of the start value, unless the start and end values are equal.&lt;/p&gt;

&lt;p&gt;-S&lt;/p&gt;</comment>
                    <comment id="28960" author="devn" created="Mon, 9 Jul 2012 19:10:24 -0500"  >&lt;p&gt;Carrying over a message by Michal Marczyk:&lt;/p&gt;

&lt;p&gt;With a negative step, the comparison is reversed, so that e.g.&lt;/p&gt;

&lt;p&gt;(range 3 0 -1)&lt;/p&gt;

&lt;p&gt;evaluates to&lt;/p&gt;

&lt;p&gt;(3 2 1)&lt;/p&gt;

&lt;p&gt;I think this is the useful behaviour; the docstring should perhaps be&lt;br/&gt;
adjusted to match it.&lt;/p&gt;

&lt;p&gt;Agreed on zero step.&lt;/p&gt;

&lt;p&gt;Cheers,&lt;br/&gt;
Micha&#322;&lt;/p&gt;</comment>
                    <comment id="29014" author="devn" created="Fri, 20 Jul 2012 17:10:19 -0500"  >&lt;p&gt;Adding a new patch after hearing comments. This patch makes (range 9 3 0) =&amp;gt; (9 9 9 9 ...), (range 3 9 0) =&amp;gt; (3 3 3 3 ...), and () will be returned when (= start end). Also updated the docstring.&lt;/p&gt;</comment>
                    <comment id="30065" author="halgari" created="Tue, 27 Nov 2012 15:01:11 -0600"  >&lt;p&gt;Marking as vetted&lt;/p&gt;</comment>
                    <comment id="30066" author="halgari" created="Tue, 27 Nov 2012 15:04:24 -0600"  >&lt;p&gt;Patch applies cleanly. We&apos;ve discussed this issue to death (for as simple as it is). I think it&apos;s time to mark it as screened. &lt;/p&gt;</comment>
                    <comment id="30067" author="halgari" created="Tue, 27 Nov 2012 15:06:27 -0600"  >&lt;p&gt;For some reason I&apos;m not allowed to edit the attachments list. When you apply the patch, please apply inconsistent_range_fix.diff as that is the most recent version of the fix. &lt;/p&gt;</comment>
                    <comment id="30194" author="richhickey" created="Sun, 9 Dec 2012 06:44:10 -0600"  >&lt;p&gt;As someone who has to read these tickets, I&apos;d really appreciate it if you could keep the description up to date and accurate, with examples of the current and intended behavior and the strategy to be used in fixing. I can&apos;t follow every thread to see what the latest thinking is, especially on a patch like this where the original mission was changed.&lt;/p&gt;

&lt;p&gt;Thanks&lt;/p&gt;</comment>
                    <comment id="30207" author="devn" created="Mon, 10 Dec 2012 15:53:31 -0600"  >&lt;p&gt;@Tim: I&apos;ve removed the other attachments.&lt;/p&gt;

&lt;p&gt;@Rich: Understood. I will update the description this evening.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11393" name="inconsistent_range_fix.diff" size="1944" author="devn" created="Fri, 20 Jul 2012 17:10:19 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10007">Ok</customfieldvalue>

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

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

<item>
            <title>[CLJ-1011] clojure.data/diff should cope with null and false values in maps</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1011</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Current behaviour of clojure.data/diff:&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; (diff {:a &lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;} {:a &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;})
(nil {:a &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;} nil)
=&amp;gt; (diff {:a &lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;} {:a nil})
(nil nil nil)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Proposed 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;=&amp;gt; (diff {:a &lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;} {:a &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;})
({:a &lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;} {:a &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;} nil)
=&amp;gt; (diff {:a &lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;} {:a nil})
({:a &lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;} {:a nil} nil)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15527">CLJ-1011</key>
            <summary>clojure.data/diff should cope with null and false values in maps</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="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="phiipa">Philip Aston</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                    </labels>
                <created>Tue, 12 Jun 2012 05:04:16 -0500</created>
                <updated>Sat, 18 Aug 2012 07:12:52 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:12:52 -0500</resolved>
                            <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28779" author="phiipa" created="Tue, 12 Jun 2012 05:04:58 -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; 
From e03a8060214d122ea2ebadf9e8a368f7f593d9f4 Mon Sep 17 00:00:00 2001
From: Philip Aston &amp;lt;philipa@mail.com&amp;gt;
Date: Sun, 10 Jun 2012 13:11:36 +0100
Subject: [PATCH] clojure.data/diff: cope with falsey values in maps

---
 src/clj/clojure/data.clj           |   18 +++++++++++++++++-
 test/clojure/test_clojure/data.clj |    3 ++-
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/clj/clojure/data.clj b/src/clj/clojure/data.clj
index 6e8dbcf..345b234 100644
--- a/src/clj/clojure/data.clj
+++ b/src/clj/clojure/data.clj
@@ -30,6 +30,22 @@
      (vec (repeat (apply max (keys m))  nil))
      m)))
 
+(defn- diff-associative-key
+  &quot;Diff associative things a and b, comparing only the key k.&quot;
+  [a b k]
+  (let [va (get a k)
+        vb (get b k)
+        [a* b* ab] (diff va vb)
+        in-a (contains? a k)
+        in-b (contains? b k)
+        same (and in-a in-b
+                  (or (not (nil? ab))
+                      (and (nil? va) (nil? vb))))]
+    [(when (and in-a (or (not (nil? a*)) (not same))) {k a*})
+     (when (and in-b (or (not (nil? b*)) (not same))) {k b*})
+     (when same {k ab})
+     ]))
+
 (defn- diff-associative
   &quot;Diff associative things a and b, comparing only keys in ks.&quot;
   [a b ks]
@@ -38,7 +54,7 @@
      (doall (map merge diff1 diff2)))
    [nil nil nil]
    (map
-    (fn [k] (map #(when % {k %}) (diff (get a k) (get b k))))
+    (partial diff-associative-key a b)
     ks)))
 
 (defn- diff-sequential
diff --git a/test/clojure/test_clojure/data.clj b/test/clojure/test_clojure/data.clj
index 9bab766..5a241e0 100644
--- a/test/clojure/test_clojure/data.clj
+++ b/test/clojure/test_clojure/data.clj
@@ -27,5 +27,6 @@
        [#{1} #{3} #{2}] (HashSet. [1 2]) (HashSet. [2 3])
        [nil nil [1 2]] [1 2] (into-array [1 2])
        [nil nil [1 2]] (into-array [1 2]) [1 2]
-       [{:a {:c [1]}} {:a {:c [0]}} {:a {:c [nil 2] :b 1}}] {:a {:b 1 :c [1 2]}} {:a {:b 1 :c [0 2]}}))
+       [{:a {:c [1]}} {:a {:c [0]}} {:a {:c [nil 2] :b 1}}] {:a {:b 1 :c [1 2]}} {:a {:b 1 :c [0 2]}}
+       [{:a nil} {:a false} {:b nil :c false}] {:a nil :b nil :c false} {:a false :b nil :c false}))
 
-- 
1.7.9.5
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; 
</comment>
                    <comment id="28782" author="jafingerhut" created="Tue, 12 Jun 2012 12:43:02 -0500"  >&lt;p&gt;Philip, thanks for writing that patch.  Could you please attach it as a file to this ticket, instead of copying and pasting it into a comment?  Instructions are under the heading &quot;Adding patches&quot; on this page:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/display/design/JIRA+workflow&quot;&gt;http://dev.clojure.org/display/design/JIRA+workflow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rich Hickey&apos;s policy is only to include code in Clojure that is written by those who have signed a contributor agreement.  You can find out more at &lt;a href=&quot;http://clojure.org/contributing&quot;&gt;http://clojure.org/contributing&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28783" author="phiipa" created="Tue, 12 Jun 2012 14:51:07 -0500"  >&lt;p&gt;Thanks Andy. Patch attached: &lt;/p&gt;

&lt;p&gt;0001-clojure.data-diff-cope-with-falsey-values-in-maps.patch&lt;/p&gt;

&lt;p&gt;I&apos;ll send in a CA.&lt;/p&gt;</comment>
                    <comment id="28828" author="phiipa" created="Sat, 16 Jun 2012 05:27:29 -0500"  >&lt;p&gt;CA snail-mailed yesterday, I guess it will take a week to arrive.&lt;/p&gt;</comment>
                    <comment id="28891" author="phiipa" created="Sat, 23 Jun 2012 05:00:17 -0500"  >&lt;p&gt;I now have a CA in place.&lt;/p&gt;</comment>
                    <comment id="29013" author="stu" created="Fri, 20 Jul 2012 16:51:32 -0500"  >&lt;p&gt;Yeah, this should be fixed.&lt;/p&gt;</comment>
                    <comment id="29158" author="aaron" created="Tue, 14 Aug 2012 21:42:01 -0500"  >&lt;p&gt;Patch applies cleanly against 4004d267e124f12b65b0d7fb6522f32a75e3c4fb. Submitter is a confirmed CA signer.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11311" name="0001-clojure.data-diff-cope-with-falsey-values-in-maps.patch" size="2164" author="phiipa" created="Tue, 12 Jun 2012 14:48:44 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10007">Ok</customfieldvalue>

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

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

<item>
            <title>[CLJ-1010] A left-to-right-variant of `comp`</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1010</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The function composition function `comp` is quite inefficient in cases like `(apply comp large-seq-of-fns)`, because its arity-greater-than-3 version reverses the seq.&lt;/p&gt;

&lt;p&gt;I would be great if there was an alternative `comp*` (or whatever) function which is just like `comp` but composes left-to-right.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15524">CLJ-1010</key>
            <summary>A left-to-right-variant of `comp`</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="tsdh">Tassilo Horn</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                    </labels>
                <created>Mon, 11 Jun 2012 04:57:55 -0500</created>
                <updated>Thu, 14 Jun 2012 18:27:23 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28772" author="tsdh" created="Mon, 11 Jun 2012 05:16:50 -0500"  >&lt;p&gt;Here&apos;s an implementation.&lt;/p&gt;</comment>
                    <comment id="28776" author="tsdh" created="Mon, 11 Jun 2012 12:41:07 -0500"  >&lt;p&gt;There&apos;s something strange with my patch.  The creation of a composition of a huge seq of functions is much faster with `comp*` than with `comp`, which is expected, because the seq doesn&apos;t need to be reversed.&lt;/p&gt;

&lt;p&gt;The strange thing however is that the compositions created with `comp` evaluate about 10-20% faster than those created with `comp*` although the arbitrary-arity version of `comp` is defined in terms of `comp*`: `(apply comp* (reverse (list* f1 f2 f3 fs)))`.&lt;/p&gt;

&lt;p&gt;For some benchmarking details, see: &lt;a href=&quot;https://groups.google.com/d/msg/clojure/MizwTxHwLE4/hGLrMfetlP8J&quot;&gt;https://groups.google.com/d/msg/clojure/MizwTxHwLE4/hGLrMfetlP8J&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28802" author="tsdh" created="Thu, 14 Jun 2012 02:32:38 -0500"  >&lt;p&gt;Here&apos;s some benchmark:&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;user&amp;gt; (use &apos;criterium.core)
nil
user&amp;gt; (let [coll (doall (take 1000000 (repeat inc)))
	   f1 (apply comp* coll) 
	   f2 (apply comp coll)] 
	   (bench (f1 0) :verbose) 
	   (println &quot;---------------------------------------&quot;)
	   (bench (f2 0) :verbose))
amd64 Linux 3.4.2-gentoo 2 cpu(s)
OpenJDK 64-Bit Server VM 22.0-b10
Runtime arguments: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n -XX:+TieredCompilation -Xmx1G -Dclojure.compile.path=/home/horn/Repos/clj/testi/target/classes -Dtesti.version=0.1.0-SNAPSHOT -Dclojure.debug=false
Evaluation count             : 600
             Execution time mean : 112.324465 ms  95.0% CI: (112.247218 ms, 112.380682 ms)
    Execution time std-deviation : 6.513809 ms  95.0% CI: (6.477450 ms, 6.553029 ms)
         Execution time lower ci : 105.609401 ms  95.0% CI: (105.609401 ms, 105.622918 ms)
         Execution time upper ci : 122.353763 ms  95.0% CI: (122.353763 ms, 122.405315 ms)
---------------------------------------
amd64 Linux 3.4.2-gentoo 2 cpu(s)
OpenJDK 64-Bit Server VM 22.0-b10
Runtime arguments: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n -XX:+TieredCompilation -Xmx1G -Dclojure.compile.path=/home/horn/Repos/clj/testi/target/classes -Dtesti.version=0.1.0-SNAPSHOT -Dclojure.debug=false
Evaluation count             : 1440
             Execution time mean : 43.519663 ms  95.0% CI: (43.516732 ms, 43.524062 ms)
    Execution time std-deviation : 492.299089 us  95.0% CI: (490.829889 us, 494.198137 us)
         Execution time lower ci : 42.781398 ms  95.0% CI: (42.781398 ms, 42.781398 ms)
         Execution time upper ci : 44.157311 ms  95.0% CI: (44.157311 ms, 44.158513 ms)
nil
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="28803" author="tsdh" created="Thu, 14 Jun 2012 03:40:08 -0500"  >&lt;p&gt;Ok, I&apos;ve tracked down the performance difference.  This comes from the fact that `reverse` creates a clojure.lang.PersistentList which can be iterated much faster than a (fully realized) LazySeq.  If you provide your fncoll in `(apply comp* fncoll)` as vector or list, the application of the created composition is as fast as for `comp`.&lt;/p&gt;

&lt;p&gt;So for me, the patch is good and makes sense.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11307" name="0001-CLJ-1010-Add-a-left-to-right-version-of-comp-comp.patch" size="2569" author="tsdh" created="Mon, 11 Jun 2012 05:16: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>[CLJ-991] partition-by reducer</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-991</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description></description>
                <environment></environment>
            <key id="15428">CLJ-991</key>
            <summary>partition-by reducer</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="hiredman">Kevin Downey</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Thu, 10 May 2012 20:08:20 -0500</created>
                <updated>Mon, 4 Mar 2013 14:49:42 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29140" author="richhickey" created="Tue, 14 Aug 2012 13:52:39 -0500"  >&lt;p&gt;I&apos;d like to see something much faster than this.&lt;/p&gt;</comment>
                    <comment id="29161" author="hiredman" created="Wed, 15 Aug 2012 01:58:59 -0500"  >&lt;p&gt;For reference here is a benchmark of a non-reducers (seq based) process that uses partition-by&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;user=&amp;gt; (def x (vec (range 1e6)))
#&apos;user/x
user=&amp;gt; (bench (reduce + (map count (partition-by #(or (zero? (mod % 3)) (zero? (mod % 5))) x))))
Evaluation count             : 60
             Execution time mean : 1.072157 sec  95.0% CI: (1.070606 sec, 1.073381 sec)
    Execution time std-deviation : 165.818282 ms  95.0% CI: (163.873585 ms, 168.271261 ms)
         Execution time lower ci : 972.562000 ms  95.0% CI: (972.562000 ms, 973.301850 ms)
         Execution time upper ci : 1.419148 sec  95.0% CI: (1.419148 sec, 1.419148 sec)

Found 7 outliers in 60 samples (11.6667 %)
	low-severe	 2 (3.3333 %)
	low-mild	 5 (8.3333 %)
 Variance from outliers : 85.8489 % Variance is severely inflated by outliers
nil
user=&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Same again using r/partition-by from reducer-partition-by.diff&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;user=&amp;gt; (bench (r/reduce + (r/map count (r/partition-by #(or (zero? (mod % 3)) (zero? (mod % 5))) x))))
Evaluation count             : 60
             Execution time mean : 1.418350 sec  95.0% CI: (1.417738 sec, 1.418948 sec)
    Execution time std-deviation : 66.736477 ms  95.0% CI: (66.186568 ms, 67.610777 ms)
         Execution time lower ci : 1.370419 sec  95.0% CI: (1.370419 sec, 1.370419 sec)
         Execution time upper ci : 1.544151 sec  95.0% CI: (1.544151 sec, 1.544156 sec)

Found 10 outliers in 60 samples (16.6667 %)
	low-severe	 2 (3.3333 %)
	low-mild	 8 (13.3333 %)
 Variance from outliers : 33.5591 % Variance is moderately inflated by outliers
nil
user=&amp;gt; 
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;(using &lt;a href=&quot;https://github.com/hugoduncan/criterium&quot;&gt;https://github.com/hugoduncan/criterium&lt;/a&gt; for benchmarking)&lt;/p&gt;</comment>
                    <comment id="29163" author="hiredman" created="Wed, 15 Aug 2012 02:17:20 -0500"  >&lt;p&gt;same again for r/partition-by from reducers-partition-by2.diff&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;user=&amp;gt; (bench (r/reduce + (r/map count (r/partition-by #(or (zero? (mod % 3)) (zero? (mod % 5))) x))))
Evaluation count             : 180
             Execution time mean : 307.596806 ms  95.0% CI: (307.271339 ms, 307.961550 ms)
    Execution time std-deviation : 34.060809 ms  95.0% CI: (33.613169 ms, 34.416837 ms)
         Execution time lower ci : 285.339333 ms  95.0% CI: (285.339333 ms, 285.339333 ms)
         Execution time upper ci : 385.087950 ms  95.0% CI: (385.087950 ms, 385.087950 ms)

Found 10 outliers in 60 samples (16.6667 %)
	low-severe	 4 (6.6667 %)
	low-mild	 6 (10.0000 %)
 Variance from outliers : 73.8053 % Variance is severely inflated by outliers
nil
user=&amp;gt; 
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;same again driven using r/fold (for grins) instead of r/reduce&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;user=&amp;gt; (bench (r/fold + (r/map count (r/partition-by #(or (zero? (mod % 3)) (zero? (mod % 5))) x))))
Evaluation count             : 360
             Execution time mean : 215.214486 ms  95.0% CI: (214.915417 ms, 215.664236 ms)
    Execution time std-deviation : 36.588464 ms  95.0% CI: (36.305548 ms, 36.847846 ms)
         Execution time lower ci : 185.575000 ms  95.0% CI: (185.575000 ms, 185.575000 ms)
         Execution time upper ci : 287.605175 ms  95.0% CI: (286.547833 ms, 287.605175 ms)

Found 6 outliers in 60 samples (10.0000 %)
	low-severe	 3 (5.0000 %)
	low-mild	 3 (5.0000 %)
 Variance from outliers : 87.6303 % Variance is severely inflated by outliers
nil
user=&amp;gt; 
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;reducers-partition-by2.diff is faster, but I am not wild about introducing a type and a protocol. also not sure about the CollFold impl.&lt;/p&gt;</comment>
                    <comment id="29167" author="richhickey" created="Wed, 15 Aug 2012 06:58:45 -0500"  >&lt;p&gt;Let&apos;s leave fold out for this first patch, please.&lt;/p&gt;</comment>
                    <comment id="29184" author="hiredman" created="Wed, 15 Aug 2012 14:34:40 -0500"  >&lt;p&gt;reducer-partition-by3.diff is a cleaned up version of reducer-partition-by2.diff without fold&lt;/p&gt;</comment>
                    <comment id="29736" author="devn" created="Sat, 20 Oct 2012 19:07:00 -0500"  >&lt;p&gt;Per Andy Fingerhut&apos;s email reducer-partition-by3.diff was failing to apply. This patch should apply cleanly to current master.&lt;/p&gt;</comment>
                    <comment id="29886" author="jafingerhut" created="Thu, 1 Nov 2012 18:59:50 -0500"  >&lt;p&gt;Presumptuously changing Approval from Incomplete to None, since the reason for its being marked Incomplete seems to have been addressed with the latest patch.&lt;/p&gt;</comment>
                    <comment id="30697" author="hiredman" created="Mon, 4 Mar 2013 14:49:42 -0600"  >&lt;p&gt;should this be assigned to someone?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11427" name="reducer-partition-by2.diff" size="3061" author="hiredman" created="Wed, 15 Aug 2012 02:11:03 -0500" />
                    <attachment id="11435" name="reducer-partition-by3.diff" size="2636" author="hiredman" created="Wed, 15 Aug 2012 14:34:40 -0500" />
                    <attachment id="11591" name="reducer-partition-by4.diff" size="2647" author="devn" created="Sat, 20 Oct 2012 19:07:00 -0500" />
                    <attachment id="11190" name="reducer-partition-by.diff" size="2657" author="hiredman" created="Thu, 10 May 2012 20:08:20 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJ-990] Implement clojure.core.reducers/mapcat and some initial reducers tests</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-990</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The first patch implements a reducers equivalent of &lt;tt&gt;clojure.core/mapcat&lt;/tt&gt;, and the second patch adds a new &lt;tt&gt;reducers.clj&lt;/tt&gt; to the clojure tests that checks that &lt;tt&gt;map&lt;/tt&gt;, &lt;tt&gt;mapcat&lt;/tt&gt;, &lt;tt&gt;filter&lt;/tt&gt;, and &lt;tt&gt;reduce&lt;/tt&gt; are equivalent in &lt;tt&gt;clojure.core&lt;/tt&gt; and &lt;tt&gt;clojure.core.reducers&lt;/tt&gt;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15426">CLJ-990</key>
            <summary>Implement clojure.core.reducers/mapcat and some initial reducers tests</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="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tsdh">Tassilo Horn</reporter>
                        <labels>
                        <label>patch</label>
                        <label>test</label>
                    </labels>
                <created>Thu, 10 May 2012 13:02:20 -0500</created>
                <updated>Fri, 1 Mar 2013 09:49:21 -0600</updated>
                    <resolved>Thu, 10 May 2012 19:45:01 -0500</resolved>
                            <version>Release 1.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28433" author="richhickey" created="Thu, 10 May 2012 19:44:32 -0500"  >&lt;p&gt;applied - thanks!&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11185" name="0001-Implement-clojure.core.reducers-mapcat.patch" size="1356" author="tsdh" created="Thu, 10 May 2012 13:02:20 -0500" />
                    <attachment id="11186" name="0002-Add-initial-reducers-tests.patch" size="2400" author="tsdh" created="Thu, 10 May 2012 13:02:20 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJ-987] pprint doesn&apos;t flush the underlying stream</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-987</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Unlike prn, pprint doesn&apos;t flush the underlying stream.&lt;/p&gt;

&lt;p&gt;pretty_writer currently overrides .flush with behaviour that pushes its own data, but does not flush the underlying stream.&lt;/p&gt;

&lt;p&gt;pprint should behave similarly to prn with respect to flushing the underlying stream.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15416">CLJ-987</key>
            <summary>pprint doesn&apos;t flush the underlying stream</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="1">Completed</resolution>
                                <assignee username="djpowell">David Powell</assignee>
                                <reporter username="djpowell">David Powell</reporter>
                        <labels>
                        <label>patch</label>
                    </labels>
                <created>Mon, 7 May 2012 09:18:18 -0500</created>
                <updated>Fri, 1 Mar 2013 09:49:20 -0600</updated>
                    <resolved>Wed, 14 Nov 2012 09:23:02 -0600</resolved>
                            <version>Release 1.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28405" author="djpowell" created="Mon, 7 May 2012 09:43:25 -0500"  >&lt;p&gt;Test included.&lt;br/&gt;
Patch should ensure that flushing happens after pprint, without introducing any additional unnecessary flushes.&lt;/p&gt;</comment>
                    <comment id="28754" author="stu" created="Fri, 8 Jun 2012 15:11:02 -0500"  >&lt;p&gt;I am confused by the tests &amp;#8211; they all seem to call prn, though some claim to be calling pprint.&lt;/p&gt;</comment>
                    <comment id="28762" author="djpowell" created="Sat, 9 Jun 2012 06:16:02 -0500"  >&lt;p&gt;Ah, sorry.  I&apos;d tried to remove duplicate tests before committing them, but removed the wrong ones.&lt;br/&gt;
Replacement patch attached:&lt;/p&gt;

&lt;p&gt;0002-pprint-now-flushes-the-underlying-stream-similarly-t.patch&lt;/p&gt;</comment>
                    <comment id="28887" author="jafingerhut" created="Thu, 21 Jun 2012 17:27:07 -0500"  >&lt;p&gt;Tempting fate once again by changing Approval from Incomplete to None after the reason it was marked as incomplete seems to have been addressed.&lt;/p&gt;</comment>
                    <comment id="29928" author="stuart.sierra" created="Fri, 9 Nov 2012 16:07:39 -0600"  >&lt;p&gt;Screened.&lt;/p&gt;</comment>
                    <comment id="29942" author="stuart.sierra" created="Wed, 14 Nov 2012 09:23:02 -0600"  >&lt;p&gt;Pushed in commit 1588ff3f70e864d9817bc565bd2c30b08189bc6e&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11306" name="0002-pprint-now-flushes-the-underlying-stream-similarly-t.patch" size="5960" author="djpowell" created="Sat, 9 Jun 2012 06:16:02 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10007">Ok</customfieldvalue>

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

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

<item>
            <title>[CLJ-982] Implement an interface? predicate to balance class?</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-982</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;clojure.core implements a class? predicate to detect if a thing is an instance of java.lang.Class. The attached patch implements interface? to further distinguish classes that are also interfaces. This gives us Clojure api for e.g., enumerating all interfaces a thing&apos;s base class implements; as in, (filter #(interface? %) (supers (class my-thing))).&lt;/p&gt;</description>
                <environment>Any</environment>
            <key id="15407">CLJ-982</key>
            <summary>Implement an interface? predicate to balance class?</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="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="davidrupp">David Rupp</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                        <label>test</label>
                    </labels>
                <created>Fri, 4 May 2012 21:16:07 -0500</created>
                <updated>Sat, 9 Jun 2012 09:08:46 -0500</updated>
                    <resolved>Fri, 8 Jun 2012 12:29:30 -0500</resolved>
                            <version>Release 1.5</version>
                                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28748" author="stu" created="Fri, 8 Jun 2012 12:28:58 -0500"  >&lt;p&gt;I would prefer to see this, and other interop/reflective items, in a separate contrib lib.&lt;/p&gt;</comment>
                    <comment id="28763" author="davidrupp" created="Sat, 9 Jun 2012 09:08:46 -0500"  >&lt;p&gt;Thanks for the feedback, Stu. Is there an existing contrib lib for stuff like this? Or should I create one?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11170" name="drupp-add-interface-predicate.diff" size="1433" author="davidrupp" created="Fri, 4 May 2012 21:16: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>[CLJ-960] Capture :column metadata (needed for ClojureScript source maps)</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-960</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;I&apos;ve begun working on implementing SourceMaps for ClojureScript. For an overview of SourceMaps, see: &lt;a href=&quot;http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/&quot;&gt;http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/&lt;/a&gt; For discussion of the feature in ClojureScript, see: &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/zgmXO2iM1JQ/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/zgmXO2iM1JQ/discussion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to produce accurate source maps, I need column information in addition to line information from the Clojure reader.&lt;/p&gt;

&lt;p&gt;I&apos;ve made the necessary enhancement to LispReader, etc. but have some cleanup and testing left to do. I&apos;d also like a sanity check from the core team before attaching a formal patch. You can find my work in progress here: &lt;a href=&quot;https://github.com/brandonbloom/clojure/compare/columns&quot;&gt;https://github.com/brandonbloom/clojure/compare/columns&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15297">CLJ-960</key>
            <summary>Capture :column metadata (needed for ClojureScript source maps)</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                    </labels>
                <created>Tue, 27 Mar 2012 00:56:10 -0500</created>
                <updated>Sat, 20 Oct 2012 09:53:42 -0500</updated>
                    <resolved>Sat, 20 Oct 2012 09:53:42 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>2</votes>
                        <watches>4</watches>
                        <comments>
                    <comment id="28132" author="dnolen" created="Fri, 13 Apr 2012 08:29:54 -0500"  >&lt;p&gt;You need to attach a patch so this can be assessed. Thanks!&lt;/p&gt;</comment>
                    <comment id="28670" author="bbloom" created="Thu, 31 May 2012 18:09:32 -0500"  >&lt;p&gt;Sorry David! I added a patch a while ago but forgot to add the patch label(s?) as well as leave a comment.&lt;/p&gt;

&lt;p&gt;The patch may be out of date now, but I haven&apos;t checked. Hopefully the prescreening process will pick it up automatically run the tests.&lt;/p&gt;</comment>
                    <comment id="28671" author="jafingerhut" created="Thu, 31 May 2012 18:32:31 -0500"  >&lt;p&gt;Yes, Brandon, your patch has been on the list of prescreened patches since April 15.  It has always applied and built cleanly during that time.  That patch label is nice to have for certain JIRA report filters, but isn&apos;t necessary for the prescreening process to pick it up.&lt;/p&gt;</comment>
                    <comment id="29052" author="jszakmeister" created="Fri, 27 Jul 2012 05:32:07 -0500"  >&lt;p&gt;v2 now applies against the current master (191b05f1).  The original patch seemed to be broken from a whitespace perspective, which was making it difficult to apply--even in a 3-way merge.  The only real conflict was in Compiler.java where a &quot;final int line&quot; was added to CompilerException.  All the tests passed.&lt;/p&gt;</comment>
                    <comment id="29055" author="bbloom" created="Fri, 27 Jul 2012 19:33:52 -0500"  >&lt;p&gt;It looks like the line field was added to CompilerException in commit 89245c68, but that commit doesn&apos;t use it for anything. Maybe a later commit uses it? Also, if we want to keep that field, can we also add a column field for patch v3?&lt;/p&gt;</comment>
                    <comment id="29056" author="dnolen" created="Fri, 27 Jul 2012 19:36:42 -0500"  >&lt;p&gt;This patch is an enhancement. In order for this one to make any movement I believe it will need a design page outlining the problem, what this solves / alternatives.&lt;/p&gt;</comment>
                    <comment id="29268" author="bbloom" created="Sat, 25 Aug 2012 21:38:40 -0500"  >&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/display/design/Compiler+tracking+of+columns&quot;&gt;http://dev.clojure.org/display/design/Compiler+tracking+of+columns&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I added a design page, but it seems like overkill. This is a straightforward enhancement...&lt;/p&gt;</comment>
                    <comment id="29595" author="richhickey" created="Thu, 4 Oct 2012 08:51:23 -0500"  >&lt;p&gt;I&apos;ve applied the v2 patch (thanks!), but before we close the ticket can we please get a patch comprising some tests?&lt;/p&gt;</comment>
                    <comment id="29690" author="cemerick" created="Fri, 19 Oct 2012 11:45:30 -0500"  >&lt;p&gt;Attached &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-960&quot; title=&quot;Capture :column metadata (needed for ClojureScript source maps)&quot;&gt;&lt;del&gt;CLJ-960&lt;/del&gt;&lt;/a&gt;-tests.diff to verify &lt;tt&gt;:line&lt;/tt&gt; and &lt;tt&gt;:column&lt;/tt&gt; metadata as now provided by &lt;tt&gt;LineNumberingPushbackReader&lt;/tt&gt;.&lt;/p&gt;</comment>
                    <comment id="29698" author="stu" created="Fri, 19 Oct 2012 15:02:41 -0500"  >&lt;p&gt;The tests are a little fragile (exact map comparison) and so will break if the reader ever does more things. In library and app projects I write tests like this using core.match, but that isn&apos;t available as a build dependency here. &lt;/p&gt;

&lt;p&gt;Marking screened anyway.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11579" name="CLJ-960-tests.diff" size="2466" author="cemerick" created="Fri, 19 Oct 2012 11:45:30 -0500" />
                    <attachment id="11050" name="columns-1.patch" size="41013" author="bbloom" created="Sat, 14 Apr 2012 18:43:42 -0500" />
                    <attachment id="11401" name="columns-1-v2.patch" size="40939" author="jszakmeister" created="Fri, 27 Jul 2012 05:32:07 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10007">Ok</customfieldvalue>

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

                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>
</channel>
</rss>