<!--
RSS generated by JIRA (4.4#649-r158309) at Wed Jun 19 09:52:26 CDT 2013

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary add field=key&field=summary to the URL of your request.
For example:
http://dev.clojure.org/jira/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?jqlQuery=project+%3D+CLJ+AND+fixVersion+%3D+%22Release+1.5%22+ORDER+BY+updated+DESC%2C+priority+DESC%2C+created+ASC&tempMax=1000&field=key&field=summary
-->
<!-- If you wish to do custom client-side styling of RSS, uncomment this:
<?xml-stylesheet href="http://dev.clojure.org/jira/styles/jiraxml2html.xsl" type="text/xsl"?>
-->
<rss version="0.92">
    <channel>
        <title>Clojure JIRA</title>
        <link>http://dev.clojure.org/jira/secure/IssueNavigator.jspa?reset=true&amp;jqlQuery=project+%3D+CLJ+AND+fixVersion+%3D+%22Release+1.5%22+ORDER+BY+updated+DESC%2C+priority+DESC%2C+created+ASC</link>
        <description>An XML representation of a search request</description>
                <language>en-us</language>
                        <issue start="0" end="78" total="78"/>
                <build-info>
            <version>4.4</version>
            <build-number>649</build-number>
            <build-date>25-07-2011</build-date>
        </build-info>
<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;Summary: patch leaves version.properties file out of sources JAR, where it causes problems for tools.&lt;/p&gt;

&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="stu">Stuart Halloway</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, 24 May 2013 11:13:59 -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="10004">Screened</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-944] compiler makes different concrete maps then the reader</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-944</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;I (Stu) agree with Nicola&apos;s assessment in the comments: the single real problem here is that the compiler&apos;s MapExpr parser emits maps differently from other map-makers, e.g. RT&apos;s factory functions. &lt;/p&gt;

&lt;p&gt;Patch clj944-plus-tests does three things:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;has the compiler emit map types consistent with the reader (like the previous &quot;0002&quot; patch)&lt;/li&gt;
	&lt;li&gt;adds tests&lt;/li&gt;
	&lt;li&gt;removes broken tests&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Original report follows:&lt;/p&gt;

&lt;p&gt;Hi guys, I am getting the following exception:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(.containsKey {:one 1} :one)
;=&amp;gt; ClassCastException clojure.lang.PersistentArrayMap cannot be &lt;span class=&quot;code-keyword&quot;&gt;cast&lt;/span&gt; to clojure.lang.PersistentHashMap&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; 

&lt;p&gt;The map is a clojure.lang.PersistentArrayMap, which obviously has a containsKey method (&lt;a href=&quot;https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentArrayMap.java#L95&quot;&gt;https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentArrayMap.java#L95&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;Casting it works fine though:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(.containsKey ^clojure.lang.PersistentArrayMap {:one 1} :one)
;=&amp;gt; &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; 

&lt;p&gt;The mailing list suggest that the compiler injects an incorrect cast to clojure.lang.PersistentHashMap. In this case it should probably be cast to a clojure.lang.Associative, the highest common interface having the .containsKey method.&lt;/p&gt;

&lt;p&gt;The problem is not present in Clojure 1.2.1.&lt;/p&gt;</description>
                <environment>Clojure 1.3 om Mac OS 10.7, Clojure 1.5.0 alpha1 on Linux x86_64 (OpenJDK 1.7.0 b147)</environment>
            <key id="15259">CLJ-944</key>
            <summary>compiler makes different concrete maps then the reader</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="stoyle">Alf Kristian St&#248;yle</reporter>
                        <labels>
                    </labels>
                <created>Sun, 4 Mar 2012 02:45:09 -0600</created>
                <updated>Fri, 24 May 2013 09:03:46 -0500</updated>
                                    <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>2</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="29873" author="bronsa" created="Tue, 30 Oct 2012 17:02:10 -0500"  >&lt;p&gt;The attached patch fixes the issue, by emitting IPersistentMap instead of Persistent{Hash|Array}Map as class type for maps literals&lt;/p&gt;</comment>
                    <comment id="29885" author="bronsa" created="Thu, 1 Nov 2012 15:48:45 -0500"  >&lt;p&gt;I uploaded another patch fixing the same problem in a different way.&lt;br/&gt;
While 0001-Fix-for-&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-944&quot; title=&quot;compiler makes different concrete maps then the reader&quot;&gt;CLJ-944&lt;/a&gt;.patch makes clojure.lang.Complier.ConstantExpr#getJavaClass return clojure.lang.IPersistentMap for both clojure.lang.PersistentHashMap and clojure.lang.PersistentArrayMap, 0002-Fix-for-&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-944&quot; title=&quot;compiler makes different concrete maps then the reader&quot;&gt;CLJ-944&lt;/a&gt;.patch makes clojure.lang.Compiler.MapExpr#parse return a PersistentArrayMap if the length is &amp;lt;= HASHTABLE_THRESHOLD, instead of always returning a PersistentHashMap.&lt;/p&gt;

&lt;p&gt;This approach is more consistent, making the type of the compiler&apos;s internal representation of a map literal equal to the one of the reader.&lt;/p&gt;

&lt;p&gt;Note that this second approach while being more consistent, breaks some tests that assume some operations on maps (specifically `seq` and `print`) to be order dependent, and written with the hash-map return order implementation in mind.&lt;/p&gt;

&lt;p&gt;That should not be the case and if the second patch is preferred over the first one, I&apos;ll gladly fix those tests.&lt;/p&gt;</comment>
                    <comment id="30678" author="stu" created="Fri, 1 Mar 2013 12:09:44 -0600"  >&lt;p&gt;Approach #2, relying on consistent choice of concrete map class by size throughout, feels quite fragile.&lt;/p&gt;

&lt;p&gt;Approach #1 seems to abuse the method name getJavaClass(), now having it return &quot;get the base type I would need for cast&quot;.&lt;/p&gt;

&lt;p&gt;Maybe there needs to be a different thing entirely?&lt;/p&gt;</comment>
                    <comment id="30684" author="bronsa" created="Fri, 1 Mar 2013 14:17:09 -0600"  >&lt;p&gt;Patch #2 should get merged (IMHO) regardless of the fragility of its approach to fixing this ticket&apos;s bug, since it fixes another bug:&lt;/p&gt;

&lt;p&gt;prior to the patch:&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (class {:a 1})&lt;br/&gt;
clojure.lang.PersistentArrayMap&lt;br/&gt;
user=&amp;gt; (def a {:a 1})&lt;br/&gt;
#&apos;user/a&lt;br/&gt;
user=&amp;gt; (class a)&lt;br/&gt;
clojure.lang.PersistentHashMap&lt;/p&gt;

&lt;p&gt;after the patch:&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (class {:a 1})&lt;br/&gt;
clojure.lang.PersistentArrayMap&lt;br/&gt;
user=&amp;gt; (def a {:a 1})&lt;br/&gt;
#&apos;user/a&lt;br/&gt;
user=&amp;gt; (class a)&lt;br/&gt;
clojure.lang.PersistentArrayMap&lt;/p&gt;

&lt;p&gt;This should also lead to some &lt;b&gt;minor&lt;/b&gt; performance enhancement since prior to this moment, every map def&apos;ed would be a HashMap instead of an ArrayMap&lt;/p&gt;

&lt;p&gt;So, I think patch #2 should be applied if not for this ticket&apos;s bug, at least for the reason stated above.&lt;br/&gt;
If somebody has any proposal for making this patch more solid regarding this ticket&apos;s bug, any help is welcome&lt;/p&gt;</comment>
                    <comment id="30949" author="richhickey" created="Sat, 13 Apr 2013 09:41:58 -0500"  >&lt;p&gt;This should not have passed screening. There are two issues, should be separate. I have no idea what has been screened nor what will be applied should it be approved. There&apos;s contention in the discussion but no resolution.&lt;/p&gt;</comment>
                    <comment id="30950" author="bronsa" created="Sat, 13 Apr 2013 12:06:35 -0500"  >&lt;p&gt;I don&apos;t think that there are two issues here.&lt;br/&gt;
The issue is only one: the compiler doesn&apos;t emit maps in a way consistent with what the reader returns and with how the compiler itself uses maps.&lt;br/&gt;
The symptoms are two: some interop calls fail, and def&apos;ed vars with a literal map as value never use a PersistentArrayMap.&lt;/p&gt;

&lt;p&gt;The underlying cause of those two symtoms is fixed by the patch 002 that i submitted (incorporated in Stu&apos;s clj944-plus-tests patch.&lt;/p&gt;

&lt;p&gt;Stuart said that this approach feels fragile but the bug is caused by the fact that everywhere else clojure returns a PersistentArrayMap when the element count is &amp;lt;= than the PersistentHashMap threshold, and when emitting maps, it doesn&apos;t.&lt;/p&gt;

&lt;p&gt;Making clojure emit maps consistently with how clojure does internally everywhere else looks to me like the only solution, and I don&apos;t really see how making clojure consistent is a fragile approach.&lt;/p&gt;

&lt;p&gt;But again, if somebody can suggest a better solution to this problem, I&apos;ll gladly submit another patch.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11644" name="0001-Fix-for-CLJ-944.patch" size="879" author="bronsa" created="Tue, 30 Oct 2012 17:02:10 -0500" />
                    <attachment id="11655" name="0002-Fix-for-CLJ-944.patch" size="1094" author="bronsa" created="Thu, 1 Nov 2012 15:48:45 -0500" />
                    <attachment id="11955" name="clj944-plus-tests.patch" size="4827" author="stu" created="Fri, 12 Apr 2013 15:57:36 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10004">Screened</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-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="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="devn">Devin Walters</reporter>
                        <labels>
                        <label>patch</label>
                        <label>range</label>
                    </labels>
                <created>Fri, 29 Jun 2012 16:25:03 -0500</created>
                <updated>Fri, 24 May 2013 07:34:58 -0500</updated>
                    <resolved>Fri, 24 May 2013 07:34:58 -0500</resolved>
                            <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-1154] Compile.java closes out preventing java from reporting exceptions</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1154</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;I was trying to compile a project that has some native dependencies.  I am using clojure-maven-plugin version 1.3.13 with Maven 2.0.  I forgot to set java.library.path properly so that the native library could be found, and only got an error of&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;[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Clojure failed.
[INFO] ------------------------------------------------------------------------
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I traced this down to Compile.java, where it is flushing and closing &lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;out&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; in the finally block.  The JVM uses out to write out a stack trace for any uncaught exceptions.  When out is closed it is unable to write out the stack trace for the UnsatisfiedLinkError that was being thrown.  This made it very difficult to debug what was happening.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15983">CLJ-1154</key>
            <summary>Compile.java closes out preventing java from reporting exceptions</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="revans2">Robert (Bobby) Evans</reporter>
                        <labels>
                    </labels>
                <created>Thu, 31 Jan 2013 13:04:08 -0600</created>
                <updated>Fri, 12 Apr 2013 09:31:03 -0500</updated>
                                    <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                <fixVersion>Release 1.6</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30677" author="stu" created="Fri, 1 Mar 2013 10:45:51 -0600"  >&lt;p&gt;I have encountered this problem as well.  Did not verify the explanation, but sounds reasonable.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </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>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJ-927] default tagged literal reader</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-927</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;With data reader support, it&apos;s impossible to write a program to read an arbitrary stream of Clojure forms.  For example, the following code will fail with the current 1.4.0-beta1 tagged literal support:&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;#point [0 2]
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It might be enough to require that the read side define a reader for &lt;tt&gt;point&lt;/tt&gt;, but what if we do not wish to require that both sides of the conversation know about the &lt;tt&gt;#point&lt;/tt&gt; tag beforehand?  Using the &lt;tt&gt;identity&lt;/tt&gt; function as a default allows the reader to handle the literal form as is even when it doesn&apos;t recognize a tag (or even care to translate it).&lt;/p&gt;

&lt;p&gt;The change from the current behavior is that missing tagged literal parsers are no longer error conditions.&lt;/p&gt;

</description>
                <environment></environment>
            <key id="15206">CLJ-927</key>
            <summary>default tagged literal reader</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="fogus">Fogus</reporter>
                        <labels>
                        <label>clojure</label>
                        <label>reader</label>
                    </labels>
                <created>Mon, 6 Feb 2012 15:45:06 -0600</created>
                <updated>Fri, 1 Mar 2013 09:49:21 -0600</updated>
                    <resolved>Fri, 9 Nov 2012 08:26:05 -0600</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="27708" author="steveminer@gmail.com" created="Sun, 12 Feb 2012 10:30:52 -0600"  >&lt;p&gt;I&apos;d like to preserve the unknown literal tag as well as the value.  That would allow a program to recreate the printed representation.  A map would work as the value. You&apos;d get something like: {:unknown-literal point :value &lt;span class=&quot;error&quot;&gt;&amp;#91;0 2&amp;#93;&lt;/span&gt;}.  If you needed to pass that on to some other process, you could easily write it in the original literal form.  Perhaps the key for literal tag should be namespace qualified to avoid possible confusion with user data.  Another benefit of returning a map for an unknown literal tag is that equality tests still seem reasonable:  (not= #foo &quot;abc&quot; #bar &quot;abc&quot;).&lt;/p&gt;</comment>
                    <comment id="29483" author="steveminer@gmail.com" created="Tue, 18 Sep 2012 11:01:38 -0500"  >&lt;p&gt;It would be convenient if I could handle unknown tags using some sort of catch-all key in &amp;#42;data-readers* (say &apos;default).  The associated function should take two arguments: the tag and the literal value.  If there is no &apos;default key in &amp;#42;data-readers*, then an error would be thrown (same as Clojure 1.4).  &lt;/p&gt;

&lt;p&gt;I think it&apos;s a simple way to allow the programmer to take control without having to add new API or data types.  It&apos;s just one distinguished key (&apos;default, :default something like that) and one additional line of doc.&lt;/p&gt;

&lt;p&gt;I can provide a patch.&lt;/p&gt;</comment>
                    <comment id="29513" author="richhickey" created="Fri, 21 Sep 2012 09:17:03 -0500"  >&lt;p&gt;This needs to be addressed. We should follow the advice given in the &lt;a href=&quot;https://github.com/edn-format/edn&quot;&gt;edn&lt;/a&gt; docs:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;If a reader encounters a tag for which no handler is registered, the implementation can either report an error, call a designated &apos;unknown element&apos; handler, or create a well-known generic representation that contains both the tag and the tagged element, as it sees fit. Note that the non-error strategies allow for readers which are capable of reading any and all edn, in spite of being unaware of the details of any extensions present.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;We can get both of the latter by having a preinstalled default unknown element handler that returns the generic representation. &quot;identity&quot; is out since it loses the tag. Using a map with namespaced keys is somewhat subtle. An TaggedElement record type is also possible.&lt;/p&gt;

&lt;p&gt;Issues are - what happens when more than one library tries to supply a default? If the system supplies one, perhaps it&apos;s best to only allow dynamic rebinding and not static installation. Or error on conflicting default handlers, or first/last one wins (but first/&apos;last&apos; might be difficult to predict).&lt;/p&gt;</comment>
                    <comment id="29672" author="steveminer@gmail.com" created="Wed, 17 Oct 2012 12:49:16 -0500"  >&lt;p&gt;Everyone agrees that identity is not an appropriate default so I changed the Summary field.&lt;/p&gt;</comment>
                    <comment id="29683" author="steveminer@gmail.com" created="Thu, 18 Oct 2012 20:54:29 -0500"  >&lt;p&gt;Minimal patch that adds support for a default data reader in &amp;#42;data-readers*.  If an unknown tag is read, we look up the &apos;default reader in &amp;#42;data-readers and call it with two arguments: the tag and the value.  By default, there is no default reader and you get an exception as in Clojure 1.4.&lt;/p&gt;</comment>
                    <comment id="29684" author="steveminer@gmail.com" created="Thu, 18 Oct 2012 20:57:47 -0500"  >&lt;p&gt;An alternative patch that establishes a default data reader to handle the case of an unknown tag.  The default reader returns a map with metadata to define the :unknown-tag.  This preserves the information for the unknown data literal, but keeps a simple and convenient format.&lt;/p&gt;</comment>
                    <comment id="29685" author="stu" created="Fri, 19 Oct 2012 05:27:54 -0500"  >&lt;p&gt;Steve,&lt;/p&gt;

&lt;p&gt;I am guessing that you consider these two patches alternatives, not cumulative. I am marking as screened the &quot;default-in-data-readers&quot; patch, which allows users to specify a &apos;default handler.&lt;/p&gt;

&lt;p&gt;The other patch &quot;unknown-data-reader&quot;, which specifies a built-in Clojure handler for unknown tags, is &lt;b&gt;not&lt;/b&gt; screened. It specifies a default handler that returns a metadata-annotated map.  If there is to be a default handler, I think it would need to return something disjoint from data, e.g. a tagged interface of some kind (or at least a namespaced name in the map.)&lt;/p&gt;

&lt;p&gt;It would be a great help to have a little discussion along with the patches.&lt;/p&gt;</comment>
                    <comment id="29686" author="steveminer@gmail.com" created="Fri, 19 Oct 2012 08:01:06 -0500"  >&lt;p&gt;Yes, the two patches are separate alternatives.  The &quot;default-in-data-readers&quot; patch just adds the special treatment for the &apos;default key in &amp;#42;data-readers* without providing a system default.  This allows the application programmer to provide a catch-all handler for unknown data literal tags.  Libraries should be discouraged from setting a &apos;default handler.  Conflicts with the &apos;default key in data_readers.clj are handled just like other keys so it would be a bad thing for multiple libraries to try to take over the &apos;default data reader.  Libraries can instead provide implementations and let the application programmer do the actual setting of the &apos;default key.&lt;/p&gt;

&lt;p&gt;The second patch (&quot;unknown-data-reader&quot;) implements &apos;default similarly, but also provides for a &apos;default reader in default-data-readers.  My unknown-data-reader returns a map.  I found it safer and simpler to deal with keywords instead of symbols for unknown tag &amp;#8211; Clojure doesn&apos;t like symbols for unknown packages and you never know what you might get in data literal tags.  After experimenting with with my original idea of having a map with two keys (essentially :tag and :value), I decided that I preferred the single entry map with the key derived from the tag and the value preserved as read.  Adding the metadata to define the :unknown-tag provides enough information for the application programmer to deal with the maps unambiguously.  I think the single entry maps are easier to read.&lt;/p&gt;

&lt;p&gt;The alternative that I did not pursue would be to use a new record type as the default data type.  My second patch could be used as a basis for that approach.  We just need to replace my unknown-data-reader function with one that creates a record (TaggedElement).&lt;/p&gt;</comment>
                    <comment id="29706" author="richhickey" created="Fri, 19 Oct 2012 17:43:54 -0500"  >&lt;p&gt;I don&apos;t like the &apos;default entry, especially if it is usually wrong for a library to set it. &lt;/p&gt;

&lt;p&gt;Having no bindable var default makes editing data_readers.clj an outstanding chore for everyone. &lt;/p&gt;

&lt;p&gt;It is unlikely a single special override in data_readers.clj is suitable for every reading situation, even in the same app.&lt;/p&gt;

&lt;p&gt;If there is a known TaggedElement type, then people need only be able to opt out of that. &lt;br/&gt;
So if there were a &lt;b&gt;default-tagged-reader&lt;/b&gt; function of (tag read-element) that built a TaggedElement (or, alternatively, threw, if people prefer), people could just rebind that in a particular reading context.&lt;/p&gt;

&lt;p&gt;There&apos;s no perfect default, but in most situations getting unknown data is an error. I personally would default to that, and provide a read-tagged-element fn people could bind in when trying to implement read-anything.&lt;/p&gt;</comment>
                    <comment id="29727" author="steveminer@gmail.com" created="Sat, 20 Oct 2012 10:03:35 -0500"  >&lt;p&gt;old patches deleted.  This revised patch introduces a var &amp;#42;default-data-reader-fn* which can be used to handle unknown tags.  By default it is nil and an exception is thrown for the unknown tag as in Clojure 1.4.  If it&apos;s non-nil, the function is called with the tag and value.  I chose the name so that it contained &apos;data-reader&apos;, which makes it search friendly.  I wanted to commit this separately from any attempt to provide a built-in catch-all reader and new record type as that might be more contentious.&lt;/p&gt;</comment>
                    <comment id="29891" author="steveminer@gmail.com" created="Fri, 2 Nov 2012 09:42:10 -0500"  >&lt;p&gt;The patch for &amp;#42;default-data-reader-fn* was committed for Clojure 1.5 beta1.  The programmer can now specify a catch-all reader, which solves the main issue.  However, there is no built-in default reader so unknown tags still cause exceptions to be thrown as in Clojure 1.4.  &lt;/p&gt;

&lt;p&gt;I think this bug can be closed.  Default reader implementations could be provided by a contrib library.  Or someone can open a new bug if you want the language to provide a built-in default reader.&lt;/p&gt;</comment>
                    <comment id="29892" author="bronsa" created="Fri, 2 Nov 2012 13:24:46 -0500"  >&lt;p&gt;what about adding &lt;b&gt;default-tagged-reader-fn&lt;/b&gt; to clojure.main/with-bindings to make it set!able?&lt;/p&gt;</comment>
                    <comment id="29897" author="steveminer@gmail.com" created="Sat, 3 Nov 2012 09:29:54 -0500"  >&lt;p&gt;Good point about making it set!-able.  I filed that issue as a separate bug: &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1101&quot; title=&quot;*default-data-reader-fn* should be set!-able in REPL&quot;&gt;&lt;del&gt;CLJ-1101&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;</comment>
                    <comment id="29914" author="stuart.sierra" created="Fri, 9 Nov 2012 08:26:05 -0600"  >&lt;p&gt;Resolved.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11586" name="CLJ-927-default-data-reader-fn-for-unknown-tags.patch" size="5278" author="steveminer@gmail.com" created="Sat, 20 Oct 2012 10:03:35 -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-1000] Performance drop in PersistentHashMap.valAt(...) in v.1.4 -- Util.hasheq(...) ?</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1000</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;It seems there is a 30-40% performance degradation of PersistentHashMap.valAt(...) in Clojure 1.4.&lt;br/&gt;
Possibly due to references to new CPU-hungry implementation of Util.hasheq(...).&lt;/p&gt;

&lt;p&gt;I have created a demo project with more details and some profiling information here:&lt;br/&gt;
&lt;a href=&quot;https://github.com/oshyshko/clj-perf&quot;&gt;https://github.com/oshyshko/clj-perf&lt;/a&gt;&lt;/p&gt;</description>
                <environment>Java(TM) SE Runtime Environment (build 1.7.0_04-b21)&lt;br/&gt;
Java HotSpot(TM) 64-Bit Server VM (build 23.0-b21, mixed mode)</environment>
            <key id="15462">CLJ-1000</key>
            <summary>Performance drop in PersistentHashMap.valAt(...) in v.1.4 -- Util.hasheq(...) ?</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="halgari">Timothy Baldridge</assignee>
                                <reporter username="oshyshko">Oleksandr Shyshko</reporter>
                        <labels>
                        <label>performance</label>
                    </labels>
                <created>Mon, 21 May 2012 22:06:54 -0500</created>
                <updated>Fri, 1 Mar 2013 09:49:21 -0600</updated>
                    <resolved>Tue, 11 Dec 2012 11:14:49 -0600</resolved>
                            <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30047" author="cgrand" created="Tue, 27 Nov 2012 08:30:26 -0600"  >&lt;p&gt;I added a patch consisting of three commits:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;one which adds caching to seqs, sets, maps, vectors and queues&lt;/li&gt;
	&lt;li&gt;one that aligns the shape of Util/hasheq on the one Util/equiv (to have a consistent behavior from the JIT compiler: without that deoptimization was more penalizing for hasheq than for equiv)&lt;/li&gt;
	&lt;li&gt;one that fix hasheq on records (which was non consistent with its equiv impl.) &amp;#8211; and this commit relies on a static method introduced in the &quot;caching hasheq&quot; commit&lt;/li&gt;
&lt;/ul&gt;
</comment>
                    <comment id="30112" author="halgari" created="Fri, 30 Nov 2012 12:10:26 -0600"  >&lt;p&gt;In the process of screening this, I&apos;m not seeing much of a performance difference after applying the patch. &lt;/p&gt;

&lt;p&gt;before patch:&lt;br/&gt;
user=&amp;gt; (-main)&lt;/p&gt;

&lt;p&gt;Version:  1.5.0-master-SNAPSHOT&lt;br/&gt;
&quot;Elapsed time: 6373.752 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 6578.037 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 6476.399 msecs&quot;&lt;/p&gt;


&lt;p&gt;after patch:&lt;br/&gt;
user=&amp;gt; (-main)&lt;/p&gt;

&lt;p&gt;Version:  1.5.0-master-SNAPSHOT&lt;br/&gt;
&quot;Elapsed time: 6182.699 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 6548.086 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 6496.711 msecs&quot;&lt;/p&gt;


&lt;p&gt;clojure 1.4:&lt;br/&gt;
user=&amp;gt; (-main)&lt;/p&gt;

&lt;p&gt;Version:  1.4.0&lt;br/&gt;
&quot;Elapsed time: 6484.234 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 6243.672 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 6248.898 msecs&quot;&lt;/p&gt;

&lt;p&gt;clojure 1.3&lt;br/&gt;
user=&amp;gt; (-main)&lt;/p&gt;

&lt;p&gt;Version:  1.3.0&lt;br/&gt;
&quot;Elapsed time: 3584.966 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 3618.189 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 3372.979 msecs&quot;&lt;/p&gt;


&lt;p&gt;I blew away my local clojure repo and re-applied the patch just to make sure, but the results are the same. Does this fix not optimize the case given in the original test project? &lt;/p&gt;

&lt;p&gt;For reference I&apos;m running this code:&lt;/p&gt;

&lt;p&gt;(defn -main&lt;br/&gt;
  &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;amp; args&amp;#93;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;  (println)&lt;br/&gt;
  (println &quot;Version: &quot; (clojure-version))&lt;/p&gt;

&lt;p&gt;  (def mm 10000)&lt;/p&gt;

&lt;p&gt;  (def str-keys (map str (range mm)))&lt;br/&gt;
  (def m (zipmap str-keys (range mm)))&lt;br/&gt;
  (time (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;i mm&amp;#93;&lt;/span&gt; (doseq &lt;span class=&quot;error&quot;&gt;&amp;#91;k str-keys&amp;#93;&lt;/span&gt; (m k))))&lt;/p&gt;

&lt;p&gt;  (def kw-keys (map #(keyword (str %)) (range mm)))&lt;br/&gt;
  (def m (zipmap kw-keys (range mm)))&lt;br/&gt;
  (time (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;i mm&amp;#93;&lt;/span&gt; (doseq &lt;span class=&quot;error&quot;&gt;&amp;#91;k kw-keys&amp;#93;&lt;/span&gt; (m k))))&lt;/p&gt;

&lt;p&gt;  (def sym-keys (map #(symbol (str %)) (range mm)))&lt;br/&gt;
  (def m (zipmap sym-keys (range mm)))&lt;br/&gt;
  (time (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;i mm&amp;#93;&lt;/span&gt; (doseq &lt;span class=&quot;error&quot;&gt;&amp;#91;k sym-keys&amp;#93;&lt;/span&gt; (m k))))&lt;/p&gt;

&lt;p&gt;  (println))&lt;/p&gt;</comment>
                    <comment id="30116" author="cgrand" created="Fri, 30 Nov 2012 14:10:19 -0600"  >&lt;p&gt;Sorry, I was too quick to react on the ML (someone said it was related to hasheq caching and since I had the patch almost ready: on a project I noticed too much time spent computing hasheq on vectors).&lt;br/&gt;
So no, my patch doesn&apos;t improve anything with kws, syms or strs as keys. However when keys are collections, it fares better.&lt;/p&gt;

&lt;p&gt;In 1.4, for a &quot;regular&quot; object, it must fails two instanceof tests before calling .hashCode().&lt;br/&gt;
If we make keywords and symbols implement IHashEq and reverse the test order (first IHashEq, then Number) it should improve the performance of the above benchmark &amp;#8211; except for Strings.&lt;/p&gt;</comment>
                    <comment id="30117" author="halgari" created="Fri, 30 Nov 2012 14:16:42 -0600"  >&lt;p&gt;Marking as incomplete, should we also delete the patch as it seems like it should be in a different ticket?&lt;/p&gt;</comment>
                    <comment id="30153" author="cgrand" created="Mon, 3 Dec 2012 10:00:07 -0600"  >&lt;p&gt;In 1.3, #&apos;hash was going through Object.hashCode and thus was simple and fast. Plus collections hashes were cached.&lt;br/&gt;
In 1.4 and master, #&apos;hash goes now through two instanceof test (Number and IHasheq in this order) before trying Object.hashCode in last resort. Plus collections hashes are not cached.&lt;br/&gt;
As such I&apos;m not sure Util.hasheq inherent slowness (compared to Util.hash) and hasheq caching should be separated in two issues.&lt;/p&gt;

&lt;p&gt;The caching-hasheq-v2.diff patchset reintroduces hashes caching for collections/hasheq and reorders the instanceof tests (to test for IHashEq before Number) and makes Keyword and Symbol implement IHashEq to branch fast in Util.hasheq.&lt;/p&gt;

&lt;p&gt;I recommend adding a collection test to the current benchmark:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defn -main
[&amp;amp; args]

(println)
(println &lt;span class=&quot;code-quote&quot;&gt;&quot;Version: &quot;&lt;/span&gt; (clojure-version))

(def mm 10000)

(def str-keys (map str (range mm)))
(def m (zipmap str-keys (range mm)))
(time (dotimes [i mm] (doseq [k str-keys] (m k))))

(def kw-keys (map #(keyword (str %)) (range mm)))
(def m (zipmap kw-keys (range mm)))
(time (dotimes [i mm] (doseq [k kw-keys] (m k))))

(def sym-keys (map #(symbol (str %)) (range mm)))
(def m (zipmap sym-keys (range mm)))
(time (dotimes [i mm] (doseq [k sym-keys] (m k))))

(def vec-keys (map (comp (juxt keyword symbol identity) str) (range mm)))
(def m (zipmap vec-keys (range mm)))
(time (dotimes [i mm] (doseq [k vec-keys] (m k))))

(println))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="30158" author="halgari" created="Mon, 3 Dec 2012 10:38:45 -0600"  >&lt;p&gt;For some reason I can&apos;t get v2 to build against master. It applies cleanly, but fails to build.&lt;/p&gt;</comment>
                    <comment id="30165" author="cgrand" created="Mon, 3 Dec 2012 11:30:04 -0600"  >&lt;p&gt;Timothy: I inadvertently deleted a &quot;public&quot; modifier before commiting... fixed in caching-hasheq-v3.diff&lt;/p&gt;</comment>
                    <comment id="30203" author="halgari" created="Mon, 10 Dec 2012 11:00:29 -0600"  >&lt;p&gt;I now get the following results:&lt;/p&gt;

&lt;p&gt;Version:  1.4.0&lt;br/&gt;
&quot;Elapsed time: 6281.345 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 6344.321 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 6108.55 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 36172.135 msecs&quot;&lt;/p&gt;

&lt;p&gt;Version:  1.5.0-master-SNAPSHOT (pre-patch)&lt;br/&gt;
&quot;Elapsed time: 6126.337 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 6320.857 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 6237.251 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 18167.05 msecs&quot;&lt;/p&gt;

&lt;p&gt;Version:  1.5.0-master-SNAPSHOT (post-patch)&lt;br/&gt;
&quot;Elapsed time: 6501.929 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 3861.987 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 3871.557 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 5049.067 msecs&quot;&lt;/p&gt;


&lt;p&gt;Marking as screened&lt;/p&gt;</comment>
                    <comment id="30206" author="oshyshko" created="Mon, 10 Dec 2012 15:53:06 -0600"  >&lt;p&gt;Please, could you add as a comment the bench result using 1.3 vs 1.5-master-post-patch?&lt;/p&gt;</comment>
                    <comment id="30217" author="oshyshko" created="Tue, 11 Dec 2012 14:13:31 -0600"  >&lt;p&gt;The performance with 1.5-master is now very close to 1.3 for 3/4 of the benchmark.&lt;/p&gt;

&lt;p&gt;However, this code is still showing 43% performance drop (3411 ms VS 6030 ms &amp;#8211; 1.3 VS 1.5-master):&lt;/p&gt;

&lt;p&gt;(def str-keys (map str (range mm)))&lt;br/&gt;
(def m (zipmap str-keys (range mm)))&lt;br/&gt;
(time (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;i mm&amp;#93;&lt;/span&gt; (doseq &lt;span class=&quot;error&quot;&gt;&amp;#91;k str-keys&amp;#93;&lt;/span&gt; (m k))))&lt;/p&gt;


&lt;p&gt;Version:  1.3.0&lt;br/&gt;
&quot;Elapsed time: 3411.353 msecs&quot;  &amp;lt;---&lt;br/&gt;
&quot;Elapsed time: 3459.992 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 3365.182 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 3813.637 msecs&quot;&lt;/p&gt;

&lt;p&gt;Version:  1.4.0&lt;br/&gt;
&quot;Elapsed time: 5710.073 msecs&quot; &amp;lt;---&lt;br/&gt;
&quot;Elapsed time: 5817.356 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 5774.856 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 18754.482 msecs&quot;&lt;/p&gt;

&lt;p&gt;Version:  1.5.0-master-SNAPSHOT&lt;br/&gt;
&quot;Elapsed time: 6030.247 msecs&quot; &amp;lt;---&lt;br/&gt;
&quot;Elapsed time: 3372.637 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 3267.481 msecs&quot;&lt;br/&gt;
&quot;Elapsed time: 3852.927 msecs&quot;&lt;/p&gt;


&lt;p&gt;To reproduce:&lt;br/&gt;
$ git clone &lt;a href=&quot;https://github.com/clojure/clojure.git&quot;&gt;https://github.com/clojure/clojure.git&lt;/a&gt;&lt;br/&gt;
$ cd clojure&lt;br/&gt;
$ mvn install -Dmaven.test.skip=true&lt;/p&gt;

&lt;p&gt;$ cd ..&lt;/p&gt;

&lt;p&gt;$ git clone &lt;a href=&quot;https://github.com/oshyshko/clj-perf.git&quot;&gt;https://github.com/oshyshko/clj-perf.git&lt;/a&gt;&lt;br/&gt;
$ cd clj-perf&lt;br/&gt;
$ lein run-all&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11743" name="caching-hasheq-v3.diff" size="10183" author="cgrand" created="Mon, 3 Dec 2012 11:30:04 -0600" />
                    <attachment id="11240" name="clj_13.png" size="139196" author="oshyshko" created="Mon, 21 May 2012 22:06:54 -0500" />
                    <attachment id="11241" name="clj_14.png" size="143427" author="oshyshko" created="Mon, 21 May 2012 22:06:54 -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-1032] seque leaks threads from the send-off pool</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1032</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Because a new (fill) action is created every time an item is (drain)ed, the LBQ gets loaded up with piles of EOS markers. If the output seq is consumed faster than the input sequence can produce items, then the original agent action does all of the filling in a single action, while the agent&apos;s queue continues to back up with (fill) actions. Eventually the entire sequence is consumed, and each queued action does a blocking .put of an EOS marker; once the queue has filled up, one of these actions blocks forever, since nobody will ever .take from the queue again.&lt;/p&gt;

&lt;p&gt;The attached patch does two things: &lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;Make sure to put exactly one EOS marker in the stream, by setting the agent&apos;s state to nil if and only if a .offer of EOS has been accepted.&lt;/li&gt;
	&lt;li&gt;Replace all occurrences of .put with .offer (and appropriate checking of the return value). This is necessary because if .put ever blocks, it&apos;s possible for the system to remain in that state forever (say, because the client stops consuming the queue), thus leading to the same leaked-thread scenario.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;The diff is a little bit inconvenient to read because of indentation changes; &lt;a href=&quot;https://gist.github.com/b7ecd4395a0d3d473de6&quot;&gt;https://gist.github.com/b7ecd4395a0d3d473de6&lt;/a&gt; is an ignore-whitespace view of the patch for convenience.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15598">CLJ-1032</key>
            <summary>seque leaks threads from the send-off pool</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="-1">Unassigned</assignee>
                                <reporter username="amalloy">Alan Malloy</reporter>
                        <labels>
                    </labels>
                <created>Wed, 25 Jul 2012 18:03:50 -0500</created>
                <updated>Fri, 1 Mar 2013 09:49:21 -0600</updated>
                    <resolved>Sun, 19 Aug 2012 20:11:44 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>5</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29046" author="jafingerhut" created="Thu, 26 Jul 2012 03:50:14 -0500"  >&lt;p&gt;Sorry for me just triggering on the function &quot;seque&quot; without a deep understanding, but is this by any chance the same issue as described in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-823&quot; title=&quot;Piping seque into seque can deadlock&quot;&gt;CLJ-823&lt;/a&gt;?  If so, since this one has a patch and that one doesn&apos;t, might be nice to mark &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-823&quot; title=&quot;Piping seque into seque can deadlock&quot;&gt;CLJ-823&lt;/a&gt; as a duplicate of this one.&lt;/p&gt;</comment>
                    <comment id="29047" author="amalloy" created="Thu, 26 Jul 2012 04:48:35 -0500"  >&lt;p&gt;No, these are separate issues. &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-823&quot; title=&quot;Piping seque into seque can deadlock&quot;&gt;CLJ-823&lt;/a&gt; is just a special case of the general problem that seque is not usable from within an agent action. I have an implementation of seque using futures instead of agents so that this isn&apos;t a problem, but that has other problems of its own, specifically if you don&apos;t fully consume the seque you wind up leaking a future object.&lt;/p&gt;</comment>
                    <comment id="29231" author="amalloy" created="Sun, 19 Aug 2012 20:11:44 -0500"  >&lt;p&gt;Marking as resolved since the patch has been applied in master.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11398" name="seque.patch" size="3525" author="amalloy" created="Wed, 25 Jul 2012 18:03:51 -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-1048] add test.generative to Clojure&apos;s tests</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1048</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The 0.1.5 release of test generative includes data generators and specs based on data generation, plus a runner that can run both c.t and c.t.g. tests under the same umbrella.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15640">CLJ-1048</key>
            <summary>add test.generative to Clojure&apos;s tests</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="stu">Stuart Halloway</reporter>
                        <labels>
                    </labels>
                <created>Tue, 21 Aug 2012 22:23:34 -0500</created>
                <updated>Fri, 1 Mar 2013 09:49:21 -0600</updated>
                    <resolved>Fri, 7 Sep 2012 11:34:35 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29250" author="stu" created="Tue, 21 Aug 2012 22:26:07 -0500"  >&lt;p&gt;Note that this patch also removes the cyclic load tests. Those tests relied on leaving broken code on the test classpath, which is very hostile to tooling (in this case the test runner&apos;s ability to walk the code in the test directory.)  &lt;/p&gt;

&lt;p&gt;I believe such tests are an antipattern, and should be implemented differently or e.g. placed in an ancillary test suite.&lt;/p&gt;
</comment>
                    <comment id="29252" author="fogus" created="Wed, 22 Aug 2012 10:32:12 -0500"  >&lt;p&gt;I agree with you position on the cyclic load tests.  The patch looks sane to me and ran without hitch. A couple points of note:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;This requires one to re-run &lt;tt&gt;antsetup&lt;/tt&gt; &amp;#8211; not a problem, but it might trip a few people&lt;/li&gt;
	&lt;li&gt;The final output of the test run is different than before.  In the case of a successful run we now see only the generative success stats. Is the regular clojure.test stats included?  It&apos;s not clear to me, but I don&apos;t think they are.  In the fail case we see something like the following.  I actually like the map output better, but one advantage to the stack trace output was that it sometimes helped identify code bugs.  In any case, it would be nice to see an aggregate score at the end.  This is a test.generative feature request I know.&lt;/li&gt;
&lt;/ul&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;
     [java] {:clojure.test/vars (test-equality),
     [java]  :thread/name &quot;main&quot;,
     [java]  :pid 8682,
     [java]  :thread 1,
     [java]  :type :assert/fail,
     [java]  :level :warn,
     [java]  :test/actual (not (not true)),
     [java]  :test/expected (not (= nil nil)),
     [java]  :line 28,
     [java]  :tstamp 1345649256308,
     [java]  :file &quot;data_structures.clj&quot;}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In all, I like this! Now we need to start thinking up more specs.&lt;/p&gt;</comment>
                    <comment id="29253" author="stu" created="Wed, 22 Aug 2012 11:51:33 -0500"  >&lt;p&gt;The stats reports are aggregate, i.e. they rollup both the generative and clojure.test stats. It would be straightforward to separate these in the report. I will look at doing that in the next drop of c.t.g.&lt;/p&gt;

&lt;p&gt;The output already includes stack traces for errors, but not for test failures. I thought this was consistent with clojure.test, but maybe I missed something.&lt;/p&gt;</comment>
                    <comment id="29254" author="fogus" created="Wed, 22 Aug 2012 12:59:47 -0500"  >&lt;p&gt;Thanks for the clarification Stu. You&apos;re right that the exception behavior is consistent, the confusion was my own.&lt;/p&gt;</comment>
                    <comment id="29400" author="stuart.sierra" created="Fri, 7 Sep 2012 11:34:35 -0500"  >&lt;p&gt;Patches have been applied as of September 1, 2012.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11452" name="add-test-generative.patch" size="17914" author="stu" created="Tue, 21 Aug 2012 22:23:34 -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-1106] Broken equality for sets</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1106</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Equality for sets is not consistent with other persistent collections when the hashCode differs:&lt;/p&gt;

&lt;p&gt;(= {(Integer. -1) :foo} {(Long. -1) :foo})&lt;br/&gt;
=&amp;gt; true&lt;/p&gt;

&lt;p&gt;(= &lt;span class=&quot;error&quot;&gt;&amp;#91;(Integer. -1)&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;(Long. -1)&amp;#93;&lt;/span&gt;)&lt;br/&gt;
=&amp;gt; true&lt;/p&gt;

&lt;p&gt;(= #{(Integer. -1)} #{(Long. -1)})&lt;br/&gt;
=&amp;gt; false&lt;/p&gt;

&lt;p&gt;Attached is what I believe to be a basic fix. It removes a hashCode check from APersistentSet.equals. A similar check was removed from APersistentMap in the following commit:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/clojure/clojure/commit/b5f5ba2e15dc2f20e14e05141f7de7c6a3d91179&quot;&gt;https://github.com/clojure/clojure/commit/b5f5ba2e15dc2f20e14e05141f7de7c6a3d91179&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this patch, set equality works as expected and all tests pass.&lt;/p&gt;

&lt;p&gt;My understanding of the implications of this change are limited, so someone more knowledgeable would need to chime in about its correctness.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15818">CLJ-1106</key>
            <summary>Broken equality for sets</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="aaron">Aaron Bedra</assignee>
                                <reporter username="jkkramer">Justin Kramer</reporter>
                        <labels>
                    </labels>
                <created>Fri, 9 Nov 2012 09:42:48 -0600</created>
                <updated>Fri, 1 Mar 2013 09:49:21 -0600</updated>
                    <resolved>Fri, 8 Feb 2013 07:31:35 -0600</resolved>
                            <version>Release 1.4</version>
                <version>Release 1.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>4</votes>
                        <watches>6</watches>
                        <comments>
                    <comment id="29926" author="jafingerhut" created="Fri, 9 Nov 2012 09:48:32 -0600"  >&lt;p&gt;Can you add some unit tests that fail with the current code but succeed with the change?&lt;/p&gt;</comment>
                    <comment id="29927" author="jkkramer" created="Fri, 9 Nov 2012 10:24:55 -0600"  >&lt;p&gt;Revised patch with unit test that fails in master and succeeds with patch&lt;/p&gt;</comment>
                    <comment id="30150" author="halgari" created="Mon, 3 Dec 2012 09:04:02 -0600"  >&lt;p&gt;vetting&lt;/p&gt;</comment>
                    <comment id="30508" author="gfredericks" created="Tue, 29 Jan 2013 17:32:14 -0600"  >&lt;p&gt;This came up when we were trying to diff two datasets by putting them in sets and comparing. We had Integers because they came back from JDBC that way.&lt;/p&gt;</comment>
                    <comment id="30509" author="aaron" created="Tue, 29 Jan 2013 17:35:36 -0600"  >&lt;p&gt;I&apos;m going to take a look and try to get this shipped. It hit us and I would love to to see it in 1.5&lt;/p&gt;</comment>
                    <comment id="30510" author="pjstadig" created="Tue, 29 Jan 2013 19:14:37 -0600"  >&lt;p&gt;I applied the patch on master (ca465d6d) and it applied cleanly and fixes the issue.&lt;/p&gt;</comment>
                    <comment id="30515" author="bjeanes" created="Wed, 30 Jan 2013 11:19:41 -0600"  >&lt;p&gt;Instead of removing &lt;tt&gt;m.hashCode() != hashCode()&lt;/tt&gt;, perhaps we should use `Util.hasheq()` instead. It already seems to special case numbers (&lt;a href=&quot;https://github.com/clojure/clojure/blob/f48d024e97/src/jvm/clojure/lang/Util.java#L164-L172&quot;&gt;https://github.com/clojure/clojure/blob/f48d024e97/src/jvm/clojure/lang/Util.java#L164-L172&lt;/a&gt;) and won&apos;t have the potential performance impact that skipping hashCode checks could bring.&lt;/p&gt;</comment>
                    <comment id="30516" author="bjeanes" created="Wed, 30 Jan 2013 11:39:30 -0600"  >&lt;p&gt;Attaching a patch with an alternate fix for this issue that does not skip hashCode checking.&lt;/p&gt;

&lt;p&gt;It passes all existing tests and fixes this issue.&lt;/p&gt;

&lt;p&gt;I want to benchmark the difference, too.&lt;/p&gt;</comment>
                    <comment id="30517" author="bjeanes" created="Wed, 30 Jan 2013 13:32:08 -0600"  >&lt;p&gt;On further thought and comparison to &lt;tt&gt;APersistentMap&lt;/tt&gt;, I&apos;m not sure if that&apos;s the best use of &lt;tt&gt;Util.hasheq()&lt;/tt&gt;. I can&apos;t find good reference on the semantic differences and am not familiar enough with the Clojure source to infer it, yet.&lt;/p&gt;</comment>
                    <comment id="30529" author="aaron" created="Sat, 2 Feb 2013 12:33:12 -0600"  >&lt;p&gt;Bo, I don&apos;t see you listed on the contributors list. Did you send in a CA?&lt;/p&gt;</comment>
                    <comment id="30530" author="aaron" created="Sat, 2 Feb 2013 13:36:27 -0600"  >&lt;p&gt;Both of the patches above are not complete. APersistentSet equiv calls equals. APersistentMap has two separate ways of handling this. This is the path that the fix should take.&lt;/p&gt;</comment>
                    <comment id="30531" author="aaron" created="Sat, 2 Feb 2013 14:37:29 -0600"  >&lt;p&gt;This patch addresses the difference between equals and equiv.&lt;/p&gt;</comment>
                    <comment id="30549" author="stu" created="Mon, 4 Feb 2013 21:55:56 -0600"  >&lt;p&gt;The Set equality code currently in Clojure uses .hashCode to quickly bail out of comparisons in both .equals and .equiv. This feels wrong since .equals and .equiv presume different hashes. The map equality code avoids the problem by not checking any hash.&lt;/p&gt;

&lt;p&gt;Aaron&apos;s 2/13 patch makes set equality work like map equality, not checking the hash. (I think a much shorter patch that accomplishes the same thing merely drops the call to hash.)&lt;/p&gt;

&lt;p&gt;It seems to me a separate problem that both hash and set are broken for Java .equals rules, because of the equiv-based handling of their keys.&lt;/p&gt;

&lt;p&gt;I think this needs more consideration.&lt;/p&gt;</comment>
                    <comment id="30552" author="stu" created="Tue, 5 Feb 2013 08:57:10 -0600"  >&lt;p&gt;Notes from discussion with Rich:&lt;/p&gt;

&lt;p&gt;1. Aaron&apos;s 2/2/13 patch, which mimics map logic into set, is the preferred approach.&lt;/p&gt;

&lt;p&gt;2. The broader issue I was worried about is the semantic collision between Map&apos;s containsKey and Associative&apos;s containsKey. This is out of scope here, and perhaps ever.&lt;/p&gt;</comment>
                    <comment id="30553" author="aaron" created="Tue, 5 Feb 2013 09:38:48 -0600"  >&lt;p&gt;Any chance this will make 1.5?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11825" name="0001-CLJ-1106-Use-Util.hasheq-in-hashCode-for-persistent-.patch" size="772" author="bjeanes" created="Wed, 30 Jan 2013 11:39:30 -0600" />
                    <attachment id="11829" name="0001-Fixing-set-equality.patch" size="2640" author="aaron" created="Sat, 2 Feb 2013 14:37:29 -0600" />
                    <attachment id="11669" name="setequals.diff" size="1672" author="jkkramer" created="Fri, 9 Nov 2012 10:24:55 -0600" />
                </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-1116] More REPL-friendly &apos;ns macro</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1116</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The &apos;ns macro is not as dynamic as it could be.&lt;br/&gt;
For instance, the following line typed in a repl (ns a)(ns b (:require a)) currently (1.4, 1.3, etc.) fails with an exception because the (:require a) call tries to reach the filesystem for file a.clj or a__init.class.&lt;/p&gt;

&lt;p&gt;The attached patch ( dynamic-ns-patch2.diff ) allows a successful call to (ns a) behave the same as a successful call to (require &apos;a), adding namespace a to the list of &lt;b&gt;loaded-libs&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Discussion on googlegroup&apos;s mailing list: &lt;a href=&quot;http://groups.google.com/group/clojure-dev/browse_thread/thread/fb231e6fab4a5ad&quot;&gt;http://groups.google.com/group/clojure-dev/browse_thread/thread/fb231e6fab4a5ad&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15863">CLJ-1116</key>
            <summary>More REPL-friendly &apos;ns macro</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="-1">Unassigned</assignee>
                                <reporter username="laurentpetit">Laurent Petit</reporter>
                        <labels>
                    </labels>
                <created>Thu, 29 Nov 2012 09:18:58 -0600</created>
                <updated>Fri, 1 Mar 2013 09:49:21 -0600</updated>
                    <resolved>Tue, 11 Dec 2012 11:14:05 -0600</resolved>
                            <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>3</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="30084" author="richhickey" created="Thu, 29 Nov 2012 09:31:08 -0600"  >&lt;p&gt;screeners, please make sure this has tests before passing on&lt;/p&gt;</comment>
                    <comment id="30088" author="laurentpetit" created="Thu, 29 Nov 2012 10:41:25 -0600"  >&lt;p&gt;Tests added&lt;/p&gt;</comment>
                    <comment id="30110" author="halgari" created="Fri, 30 Nov 2012 11:35:58 -0600"  >&lt;p&gt;Patch applies, fixes the bug. All tests pass. &lt;/p&gt;

&lt;p&gt;Screened&lt;/p&gt;</comment>
                    <comment id="30148" author="bendlas" created="Mon, 3 Dec 2012 07:52:30 -0600"  >&lt;p&gt;I see this has already been screened, but FWIW I tested the repl with this patch and the behavior works for me.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11725" name="dynamic-ns-patch2.diff" size="2012" author="laurentpetit" created="Thu, 29 Nov 2012 10:40:33 -0600" />
                </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-1140] {:as x} destructuring with an empty list raises exception</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1140</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&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; (clojure-version)
&quot;1.4.0&quot;
user=&amp;gt; (let [{:as x} &apos;()] x)
{}

...

user=&amp;gt; (clojure-version)
&quot;1.5.0-RC1&quot;
user=&amp;gt; (let [{:as x} &apos;()] x)
IllegalArgumentException No value supplied for key: null  clojure.lang.PersistentHashMap.create (PersistentHashMap.java:77)
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The bug was introduced by a change&lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt; to support duplicate keys in map&lt;br/&gt;
destructuring. Using PersistentHashMap/create here introduces the above&lt;br/&gt;
bug, since it does not properly handle empty lists.&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt;: &lt;a href=&quot;https://github.com/clojure/clojure/commit/93c795fe10ee5c92a36b6ec6373b3c80a31135c4&quot;&gt;https://github.com/clojure/clojure/commit/93c795fe10ee5c92a36b6ec6373b3c80a31135c4&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15932">CLJ-1140</key>
            <summary>{:as x} destructuring with an empty list raises exception</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="-1">Unassigned</assignee>
                                <reporter username="tcrawley">Toby Crawley</reporter>
                        <labels>
                    </labels>
                <created>Sun, 30 Dec 2012 13:35:52 -0600</created>
                <updated>Fri, 1 Mar 2013 09:49:21 -0600</updated>
                    <resolved>Fri, 1 Feb 2013 13:12:17 -0600</resolved>
                            <version>Release 1.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>3</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="30357" author="tcrawley" created="Wed, 2 Jan 2013 11:02:40 -0600"  >&lt;p&gt;There&apos;s been some discussion on clojure-dev around this issue: &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/qdDRNfEVfQ8/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/qdDRNfEVfQ8/discussion&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30522" author="tcrawley" created="Fri, 1 Feb 2013 10:05:07 -0600"  >&lt;p&gt;An issue I brought up in the email thread is consistency: vector binding works with anything nthable, map binding works with anything associative. With my current patch (empty-list-destructuring-&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1140&quot; title=&quot;{:as x} destructuring with an empty list raises exception&quot;&gt;&lt;del&gt;CLJ-1140&lt;/del&gt;&lt;/a&gt;-12.30.12.diff), only ISeqs are supported for kwarg map binding. &lt;/p&gt;

&lt;p&gt;I&apos;d prefer it work with anything seqable, and can provide a patch that does that. I would go ahead and do so, but now that this ticket is now Approval: OK, I didn&apos;t want to alter what had been OK&apos;ed. Let me know if you want a patch that adds support for anything seqable.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11782" name="empty-list-destructuring-CLJ-1140-12.30.12.diff" size="1645" author="tcrawley" created="Sun, 30 Dec 2012 13:40:54 -0600" />
                </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-157] Need better error report when omitting parameter list from (fn) or (defn)</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-157</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Somehow I just forgot to define parameters for my zero argument function and it took me a long time to notice it, mostly because I had been working with a lot of macros but especially because I didn&apos;t get an error that said &quot;You must provide a list of parameter names&quot;, but instead: &quot;Don&apos;t know how to create ISeq from: Symbol&quot;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="13554">CLJ-157</key>
            <summary>Need better error report when omitting parameter list from (fn) or (defn)</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="stuart.sierra">Stuart Sierra</assignee>
                                <reporter username="ambrosebs">Ambrose Bonnaire-Sergeant</reporter>
                        <labels>
                    </labels>
                <created>Mon, 20 Jul 2009 10:33:00 -0500</created>
                <updated>Fri, 1 Mar 2013 09:49:21 -0600</updated>
                    <resolved>Fri, 24 Aug 2012 08:34:50 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>7</votes>
                        <watches>5</watches>
                        <comments>
                    <comment id="23025" author="importer" created="Tue, 24 Aug 2010 06:58:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/157&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/157&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="26031" author="alexmiller" created="Wed, 15 Dec 2010 09:40:27 -0600"  >&lt;p&gt;I have hit this several times. Would be very nice (esp for newbs) to have a guard-rail here that detected this as a possible issue.&lt;/p&gt;</comment>
                    <comment id="26547" author="soofaloofa" created="Thu, 30 Jun 2011 09:32:12 -0500"  >&lt;p&gt;I&apos;ve came across this as well and would welcome a more user friendly error message.&lt;/p&gt;</comment>
                    <comment id="26761" author="stuart.sierra" created="Mon, 5 Sep 2011 01:38:00 -0500"  >&lt;p&gt;This is an easy mistake to make - I do it myself quite often. Better error messages for this common case would be good for new users.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-157&quot; title=&quot;Need better error report when omitting parameter list from (fn) or (defn)&quot;&gt;&lt;del&gt;CLJ-157&lt;/del&gt;&lt;/a&gt; could probably be subsumed into a more general patch improving error messages about the expected arguments to &lt;tt&gt;fn&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;defn&lt;/tt&gt; is a macro which expands to &lt;tt&gt;fn&lt;/tt&gt;, so a patch to &lt;tt&gt;fn&lt;/tt&gt; should fix both.&lt;/p&gt;</comment>
                    <comment id="26767" author="ambrosebs" created="Mon, 5 Sep 2011 23:43:04 -0500"  >&lt;p&gt;I&apos;m working a patch for this.&lt;/p&gt;</comment>
                    <comment id="26772" author="ambrosebs" created="Wed, 7 Sep 2011 07:31:22 -0500"  >&lt;p&gt;Is it ok to break the behavior of these two cases?&lt;/p&gt;

&lt;p&gt;(fn a)&lt;br/&gt;
(fn)&lt;/p&gt;

&lt;p&gt;So far I am throwing an error &quot;Parameter list missing&quot; instead of silently returning a function with AFAICT undefined behavior.&lt;/p&gt;</comment>
                    <comment id="26778" author="ambrosebs" created="Fri, 9 Sep 2011 05:23:44 -0500"  >&lt;p&gt;I&apos;ve attached a patch. There are some breaking changes for undefined behavior, I have detailed them in the commit message.&lt;/p&gt;</comment>
                    <comment id="26917" author="stu" created="Mon, 10 Oct 2011 07:10:05 -0500"  >&lt;p&gt;The trickiest thing with this kind of error reporting is guessing what the programmer was trying to do:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The greater the probability a random string is a valid program, the harder it is to report errors well.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;#8211; &lt;a href=&quot;http://www.paulgraham.com/redund.html&quot;&gt;http://www.paulgraham.com/redund.html&lt;/a&gt;&lt;br/&gt;
An 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;(defn add (a b) (+ a b))
IllegalArgumentException Parameter declaration a should be a vector  clojure.core/assert-valid-fdecl
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Here the error message is based on a guess that I was trying to use the multi-arity syntax, but I was probably using the single-arity syntax with the wrong brackets. You might split these cases out by counting the top-level forms first.&lt;/p&gt;

&lt;p&gt;I think I am cool with the change to &lt;tt&gt;(fn)&lt;/tt&gt; and &lt;tt&gt;(fn a)&lt;/tt&gt;, but I can imagine a code generator relying on this behavior as a sentinel to avoid explicit coding for a corner case. What do others think?&lt;/p&gt;

&lt;p&gt;One small thing in the code. Why the redundant boolean work here?&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;(if (instance? clojure.lang.Symbol name) false true)
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="26918" author="ambrosebs" created="Mon, 10 Oct 2011 07:48:33 -0500"  >&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; (instance? clojure.lang.Symbol name) &lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It&apos;s so early in the bootstrap that both `not` and `symbol?` are not defined. That line is in the definition of `defn`. I added a comment documenting this.&lt;/p&gt;</comment>
                    <comment id="26919" author="trptcolin" created="Mon, 10 Oct 2011 09:19:49 -0500"  >&lt;p&gt;I run into this all the time too - thanks for doing this, Ambrose!&lt;/p&gt;

&lt;p&gt;Stuart&apos;s example is an interesting one - that could have meant at least one other thing in addition to multi-arity syntax and single-arity syntax with accidentally-list params: single-arity syntax with missing param list, and two successive body forms (where a and b are free variables). I think the error message here would still be an improvement over &quot;Don&apos;t know how to create ISeq from: Symbol&quot;, but maybe it tries to be too specific in talking about &quot;a&quot;. I&apos;d tend toward being more generic and just saying &quot;Parameter declaration should be a vector&quot;, which I think would be helpful and correct in all the intended cases we&apos;ve imagined for this particular example.&lt;/p&gt;

&lt;p&gt;I think breaking (fn) / (fn a) makes sense - if there&apos;s a valid use for those I&apos;d be interested in seeing it. Relying on ArityException in code generation seems fairly error-prone to me, but I could easily be missing something here.&lt;/p&gt;

&lt;p&gt;To the boolean point, I tend to agree with Stuart and would prefer reversing the if/else clauses to avoid it:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-none&quot;&gt;(if (instance? clojure.lang.Symbol name)
  nil      
  (throw (IllegalArgumentException. &quot;First argument to defn must be a symbol&quot;)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="26921" author="ambrosebs" created="Mon, 10 Oct 2011 09:45:24 -0500"  >&lt;p&gt;Doh, of course Colin&apos;s suggestion is preferable.&lt;/p&gt;</comment>
                    <comment id="27271" author="ambrosebs" created="Tue, 8 Nov 2011 15:29:51 -0600"  >&lt;p&gt;Added a second patch to fix redundant conditional&lt;/p&gt;</comment>
                    <comment id="27272" author="ambrosebs" created="Tue, 8 Nov 2011 18:32:23 -0600"  >&lt;p&gt;Another breaking change to undefined behavior I didn&apos;t realize. (defn a) now throws an exception, instead of silently returning a function.&lt;/p&gt;</comment>
                    <comment id="27349" author="carinmeier" created="Sun, 27 Nov 2011 14:54:27 -0600"  >&lt;p&gt;I checked out the changes and tried it out successfully.  I think it is a great improvement.  My only comment is regarding the text of the error message for &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; (defn [x])
IllegalArgumentException First argument to defn must be a symbol  clojure.core/defn (core.clj:273)
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It might be helpful to newcomers to mention that the parameter is the name.  Something like, &quot;Name argument to defn must be a symbol&quot;.&lt;/p&gt;</comment>
                    <comment id="27358" author="stuart.sierra" created="Mon, 28 Nov 2011 16:28:13 -0600"  >&lt;p&gt;Vetted. Moving to &quot;Approved Backlog&quot; because it&apos;s an enhancement we would like to have in the next release.&lt;/p&gt;</comment>
                    <comment id="27359" author="stuart.sierra" created="Mon, 28 Nov 2011 16:28:30 -0600"  >&lt;p&gt;Changing priority to &quot;Minor&quot;&lt;/p&gt;</comment>
                    <comment id="27910" author="jafingerhut" created="Wed, 7 Mar 2012 19:49:51 -0600"  >&lt;p&gt;clj-157-better-err-msgs-for-defn-fn-syntax-errors-patch2.txt has no substantive changes from Ambrose&apos;s two patches.  It does combine them into one commit, and unlike the older ones applies cleanly to latest master as of March 7, 2012.&lt;/p&gt;</comment>
                    <comment id="29215" author="stuart.sierra" created="Fri, 17 Aug 2012 15:12:49 -0500"  >&lt;p&gt;Screened.&lt;/p&gt;</comment>
                    <comment id="29262" author="stuart.sierra" created="Fri, 24 Aug 2012 08:34:50 -0500"  >&lt;p&gt;Patch applied.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10334" name="0001-Better-error-messages-for-syntax-errors-w-defn-and-f.patch" size="9744" author="ambrosebs" created="Fri, 9 Sep 2011 05:23:44 -0500" />
                    <attachment id="10690" name="0002-Fix-redundant-conditional.patch" size="1136" author="ambrosebs" created="Tue, 8 Nov 2011 15:29:51 -0600" />
                    <attachment id="10983" name="clj-157-better-err-msgs-for-defn-fn-syntax-errors-patch2.txt" size="9698" author="jafingerhut" created="Wed, 7 Mar 2012 19:49:51 -0600" />
                </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-779] Document clojure.org differences between 1.2 and 1.3</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-779</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Documentation at &lt;a href=&quot;http://clojure.org&quot;&gt;http://clojure.org&lt;/a&gt; should always represent the latest release version. When we ship Release.next, we need to update the documentation there to reflect the latest changes.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14405">CLJ-779</key>
            <summary>Document clojure.org differences between 1.2 and 1.3</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="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="redinger">Christopher Redinger</reporter>
                        <labels>
                    </labels>
                <created>Tue, 26 Apr 2011 22:12:37 -0500</created>
                <updated>Fri, 1 Mar 2013 09:49:21 -0600</updated>
                    <resolved>Fri, 9 Nov 2012 08:35:55 -0600</resolved>
                            <version>Release 1.3</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="29916" author="stuart.sierra" created="Fri, 9 Nov 2012 08:35:55 -0600"  >&lt;p&gt;This work has been done.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </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>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJ-936] Improve docs about argument destructuring at clojure.org</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-936</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;What:&lt;br/&gt;
Make the description of argument destructuring more visible at &lt;a href=&quot;http://clojure.org/special_forms&quot;&gt;http://clojure.org/special_forms&lt;/a&gt;, namely:&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;add a heading such as &quot;&amp;lt;h4&amp;gt;Binding Forms (Argument Destructuring)&amp;lt;/h4&amp;gt;&quot; to the section describing it&lt;/li&gt;
	&lt;li&gt;make all occurences of &quot;binding-form&quot; a link to that heading, especially under the let and fn headings&lt;/li&gt;
	&lt;li&gt;for (fn ..) add a new second paragraph like &quot;Regarding binding forms, also known as argument destructuring, &amp;lt;a href=#thea-new-heading&amp;gt;read more in the binding forms section&amp;lt;/a&amp;gt; under the let special form.&quot;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Why:&lt;br/&gt;
It was always surprisingly difficult for me to google out the explanation of destructuring in Clojure and only today have I discovered that it is described pretty well under the let special form. Thus it should be made more visible to the readers (and preferably also search engines). (Even though Google has returned the page as one of the first matches, I had problems seeing it there - partly due to usually mistyping destructuring e.g. as deconstruction).&lt;/p&gt;

&lt;p&gt;Thanks a lot!&lt;/p&gt;

&lt;p&gt;PS: I haven&apos;t found a better way to report this, such as a commenting capability on the page itself.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15238">CLJ-936</key>
            <summary>Improve docs about argument destructuring at clojure.org</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="jakubholynet">Jakub Holy</reporter>
                        <labels>
                        <label>documentation</label>
                        <label>web</label>
                    </labels>
                <created>Tue, 21 Feb 2012 15:13:26 -0600</created>
                <updated>Fri, 1 Mar 2013 09:49:21 -0600</updated>
                    <resolved>Tue, 27 Nov 2012 17:28:12 -0600</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27936" author="jafingerhut" created="Mon, 12 Mar 2012 18:03:25 -0500"  >&lt;p&gt;Jakub, I don&apos;t think I have authorization to edit those web pages in the way you suggest.  I did want to comment that the most recent version of the Clojure cheatsheet at &lt;a href=&quot;http://clojure.org/cheatsheet&quot;&gt;http://clojure.org/cheatsheet&lt;/a&gt; now has a link called &quot;examples&quot; in the &quot;Special Forms&quot; section that links to the &apos;let&apos; section of the special forms documentation page.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10005">Accepted</customfieldvalue>

                </customfieldvalues>
            </customfield>
                                                                                    <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </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-1098] Extend CollFold and IKVReduce to nil</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1098</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Currently, reduce-kv and fold throw when used on nil, because their respective protocols don&apos;t extend to nil. This seems strange, since Clojure tends to handle nils gracefully where possible, especially in places where collections are expected.&lt;/p&gt;

&lt;p&gt;See thread &lt;a href=&quot;https://groups.google.com/d/topic/clojure/tGI8sIKQoh0/discussion&quot;&gt;https://groups.google.com/d/topic/clojure/tGI8sIKQoh0/discussion&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15808">CLJ-1098</key>
            <summary>Extend CollFold and IKVReduce to nil</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="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="bendlas">Herwig Hochleitner</reporter>
                        <labels>
                    </labels>
                <created>Wed, 31 Oct 2012 13:24:54 -0500</created>
                <updated>Fri, 1 Mar 2013 09:49:21 -0600</updated>
                    <resolved>Fri, 25 Jan 2013 07:40:32 -0600</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>3</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29882" author="bendlas" created="Wed, 31 Oct 2012 20:44:29 -0500"  >&lt;p&gt;Attached patch with tests&lt;/p&gt;</comment>
                    <comment id="30436" author="jafingerhut" created="Mon, 14 Jan 2013 11:04:24 -0600"  >&lt;p&gt;Another discussion thread: &lt;a href=&quot;https://groups.google.com/forum/?fromgroups=#!topic/clojure/xPDDybYGvmc&quot;&gt;https://groups.google.com/forum/?fromgroups=#!topic/clojure/xPDDybYGvmc&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11648" name="0001-CLJ-1098-Implement-IKVReduce-and-CollFold-for-nil.patch" size="1739" author="bendlas" created="Wed, 31 Oct 2012 20:44:29 -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-1062] CLJ-940 breaks compilation of namespaces that don&apos;t have any public functions</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1062</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-940&quot; title=&quot;Passing a non-sequence to refer :only results in uninformative exception&quot;&gt;&lt;del&gt;CLJ-940&lt;/del&gt;&lt;/a&gt; that was recently committed to master break compilation of namespaces that don&apos;t have any public functions in them&lt;br/&gt;
(for example, like &lt;a href=&quot;https://github.com/michaelklishin/monger/blob/master/src/clojure/monger/json.clj&quot;&gt;https://github.com/michaelklishin/monger/blob/master/src/clojure/monger/json.clj&lt;/a&gt; that only extends&lt;br/&gt;
a protocol).&lt;/p&gt;

&lt;p&gt;This affects several of clojurewerkz.org projects that no longer can compile with 1.5.0-master-SNAPSHOT.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15677">CLJ-1062</key>
            <summary>CLJ-940 breaks compilation of namespaces that don&apos;t have any public functions</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="2" iconUrl="http://dev.clojure.org/jira/images/icons/priority_critical.gif">Critical</priority>
                    <status id="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="michaelklishin">Michael Klishin</reporter>
                        <labels>
                    </labels>
                <created>Wed, 5 Sep 2012 20:36:29 -0500</created>
                <updated>Fri, 1 Mar 2013 09:49:20 -0600</updated>
                    <resolved>Fri, 21 Sep 2012 08:28:35 -0500</resolved>
                            <version>Release 1.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>4</watches>
                        <comments>
                    <comment id="29383" author="michaelklishin" created="Wed, 5 Sep 2012 20:39:06 -0500"  >&lt;p&gt;To be more correct: it breaks compilation of namespaces that require/load such ns without any public functions.&lt;/p&gt;</comment>
                    <comment id="29384" author="michaelklishin" created="Wed, 5 Sep 2012 20:46:19 -0500"  >&lt;p&gt;An example project that reproduces the issue (see in the README):&lt;br/&gt;
&lt;a href=&quot;https://github.com/michaelklishin/clj1062&quot;&gt;https://github.com/michaelklishin/clj1062&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29512" author="stuart.sierra" created="Fri, 21 Sep 2012 08:28:35 -0500"  >&lt;p&gt;Patch applied.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11484" name="0001-CLJ-1062-fix-require-1.patch" size="954" author="stuart.sierra" created="Fri, 7 Sep 2012 11:43:53 -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-985] make jsr166 available at build time</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-985</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;but no runtime requirement.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15413">CLJ-985</key>
            <summary>make jsr166 available at build time</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="stu">Stuart Halloway</assignee>
                                <reporter username="stu">Stuart Halloway</reporter>
                        <labels>
                    </labels>
                <created>Sun, 6 May 2012 19:07:04 -0500</created>
                <updated>Fri, 1 Mar 2013 09:49:20 -0600</updated>
                    <resolved>Fri, 18 May 2012 20:16:21 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28401" author="hiredman" created="Mon, 7 May 2012 00:46:29 -0500"  >&lt;p&gt;antsetup.sh seems to be missing?&lt;/p&gt;</comment>
                    <comment id="28402" author="stu" created="Mon, 7 May 2012 08:01:08 -0500"  >&lt;p&gt;and now, a patch with antsetup included&lt;/p&gt;</comment>
                    <comment id="28426" author="sw1nn" created="Thu, 10 May 2012 14:05:28 -0500"  >&lt;p&gt;You say you don&apos;t want a runtime requirement, but presumably you&apos;ll want to, at some point, run tests as part of the build so some element of runtime is required?&lt;/p&gt;</comment>
                    <comment id="28529" author="stu" created="Fri, 18 May 2012 20:15:21 -0500"  >&lt;p&gt;Neale: the maven &quot;provided&quot; scope allows use during build without runtime requirement.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11175" name="build-with-jsr166-antsetup.patch" size="2985" author="stu" created="Mon, 7 May 2012 08:01:08 -0500" />
                    <attachment id="11174" name="build-with-jsr166.patch" size="2590" author="stu" created="Sun, 6 May 2012 19:07:04 -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-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-1150] Make some PersistentVector, SubVector internals public</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1150</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;This should help with RRBT-PV interop.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15968">CLJ-1150</key>
            <summary>Make some PersistentVector, SubVector internals public</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="michalmarczyk">Micha&#322; Marczyk</assignee>
                                <reporter username="michalmarczyk">Micha&#322; Marczyk</reporter>
                        <labels>
                    </labels>
                <created>Sat, 19 Jan 2013 21:54:13 -0600</created>
                <updated>Fri, 1 Mar 2013 09:49:20 -0600</updated>
                    <resolved>Mon, 4 Feb 2013 20:01:24 -0600</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                                <attachments>
                    <attachment id="11806" name="0001-Make-some-PersistentVector-s-and-APersistentVector.S.patch" size="2650" author="michalmarczyk" created="Sat, 19 Jan 2013 21:54:13 -0600" />
                </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-902] doc macro broken for namespaces</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-902</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;Clojure 1.3.0&lt;br/&gt;
user=&amp;gt; (doc clojure.pprint)&lt;br/&gt;
ClassNotFoundException clojure.pprint  java.net.URLClassLoader$1.run (URLClassLoader.java:366)&lt;/p&gt;

&lt;p&gt;It appears it is not safe to call resolve on a symbol representing a namespace; you get the error above. FWIW, I seem to have resolved the problem (see attached diff) by moving the find-ns clause above the resolve clause (in the cond); also the reference to namespace-doc needs to be var-quoted since namespace-doc is private. &lt;/p&gt;</description>
                <environment></environment>
            <key id="15088">CLJ-902</key>
            <summary>doc macro broken for namespaces</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="glchapman">Greg Chapman</reporter>
                        <labels>
                    </labels>
                <created>Wed, 28 Dec 2011 17:35:22 -0600</created>
                <updated>Fri, 1 Mar 2013 09:49:20 -0600</updated>
                    <resolved>Sun, 12 Aug 2012 15:48:09 -0500</resolved>
                            <version>Release 1.3</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27732" author="jafingerhut" created="Fri, 17 Feb 2012 00:43:30 -0600"  >&lt;p&gt;Verified there is a bug, and that this change fixes it.  New patch is in proper format, and includes a new unit test that would have caught the bug.&lt;/p&gt;</comment>
                    <comment id="29090" author="stuart.sierra" created="Wed, 8 Aug 2012 09:52:32 -0500"  >&lt;p&gt;Screened. Ready for approval.&lt;/p&gt;</comment>
                    <comment id="29117" author="stuart.sierra" created="Sun, 12 Aug 2012 15:48:10 -0500"  >&lt;p&gt;Patch applied.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10916" name="clj-902-doc-on-namespaces-patch.txt" size="2028" author="jafingerhut" created="Fri, 17 Feb 2012 00:43:30 -0600" />
                    <attachment id="10755" name="repl.diff" size="595" author="glchapman" created="Wed, 28 Dec 2011 17:35:22 -0600" />
                </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-945] clojure.string/capitalize can give wrong result if first char is supplementary</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-945</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;When the first unicode code point of a string is supplementary (i.e. requires two 16-bit Java chars to represent in UTF-16), and that first code point is changed by converting it to upper case, clojure.string/capitalize gives the wrong answer.&lt;/p&gt;</description>
                <environment>all</environment>
            <key id="15262">CLJ-945</key>
            <summary>clojure.string/capitalize can give wrong result if first char is supplementary</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="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="jafingerhut">Andy Fingerhut</reporter>
                        <labels>
                    </labels>
                <created>Mon, 5 Mar 2012 11:33:02 -0600</created>
                <updated>Fri, 1 Mar 2013 09:43:19 -0600</updated>
                    <resolved>Fri, 1 Mar 2013 09:43:19 -0600</resolved>
                            <version>Release 1.2</version>
                <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29004" author="richhickey" created="Fri, 20 Jul 2012 07:43:37 -0500"  >&lt;p&gt;Isn&apos;t this a Java bug?&lt;/p&gt;</comment>
                    <comment id="29006" author="jafingerhut" created="Fri, 20 Jul 2012 12:36:53 -0500"  >&lt;p&gt;If using UTF-16 to encode Unicode strings, and making every UTF-16 code unit (i.e. Java char) individually indexable as a separate entity in strings, is such a bad design choice that you consider it a bug, then yes, this is a Java bug (and a bug in all the other systems that use UTF-16 in this way).&lt;/p&gt;

&lt;p&gt;clojure.string/capitalize isn&apos;t using some Java capitalization method that has a bug, though.  By calling (.toUpperCase (subs s 0 1)) it is not giving enough information to .toUpperCase for &lt;em&gt;any&lt;/em&gt; implementation, Java or otherwise, to do the job correctly.  It is analogous to calling toupper on the least significant 4 bits of the ASCII encoding of a letter and expecting it to return the correct answer.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10978" name="capitalize-for-supplementary-chars-patch.txt" size="1586" author="jafingerhut" created="Mon, 5 Mar 2012 11:33:02 -0600" />
                </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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJ-967] java.io/do-copy can still garble multibyte characters on IBM JDK 1.5 and 1.6</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-967</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Same issue as &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-886&quot; title=&quot;java.io/do-copy can garble multibyte characters&quot;&gt;&lt;del&gt;CLJ-886&lt;/del&gt;&lt;/a&gt;, but while the patch applied for that issue fixes the problem for many OS/JDK combos, there appear to be differences in how surrogate pair characters are handled in some OS/JDK combos.  In particular, at least Linux + IBM JDK 1.5 and Linux + IBM JDK 1.6 still fail the tests checked in for do-copy.&lt;/p&gt;</description>
                <environment>At least Linux + IBM JDK 1.5, and Linux + IBM JDK 1.6</environment>
            <key id="15318">CLJ-967</key>
            <summary>java.io/do-copy can still garble multibyte characters on IBM JDK 1.5 and 1.6</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="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="jafingerhut">Andy Fingerhut</reporter>
                        <labels>
                    </labels>
                <created>Sat, 7 Apr 2012 09:25:55 -0500</created>
                <updated>Fri, 1 Mar 2013 09:43:02 -0600</updated>
                    <resolved>Fri, 1 Mar 2013 09:43:02 -0600</resolved>
                            <version>Release 1.2</version>
                <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28085" author="jafingerhut" created="Sat, 7 Apr 2012 09:32:23 -0500"  >&lt;p&gt;clj-886-improved-fix-for-ibm-jdks-patch2.txt dated Apr 7 2012 makes the tests pass with Linux + IBM JDK 1.5, as well as these other combos tested:&lt;/p&gt;

&lt;p&gt;Linux + Oracle JDK 1.7&lt;br/&gt;
Linux + IBM JDK 1.5&lt;br/&gt;
Mac OS X 10.6.8 + Oracle/Apple JDK 1.6&lt;/p&gt;

&lt;p&gt;There are still failing tests for Linux + IBM JDK 1.6.  This patch currently skips the failing tests whenever the java.vendor is &quot;IBM Corporation&quot; and java.version is &quot;1.6.0&quot;, so that &quot;ant&quot; succeeds.  It is easy enough to modify the patch so that the failing tests are kept as a bright shining reminder.  Let me know if that would be preferred &amp;#8211; it just involves removing the function ibm-jdk16, and simplifying where it is called after replacing it with false.&lt;/p&gt;</comment>
                    <comment id="28522" author="stu" created="Fri, 18 May 2012 09:30:52 -0500"  >&lt;p&gt;Not sure if we should be in the business of building JDK-specific workarounds into our IO library, but marking this as screened.&lt;/p&gt;

&lt;p&gt;Option B is to leave the code as-is and only disable the tests. Rich?&lt;/p&gt;</comment>
                    <comment id="28524" author="richhickey" created="Fri, 18 May 2012 14:42:13 -0500"  >&lt;p&gt;Please disable the tests. We shouldn&apos;t be doing such workarounds.&lt;/p&gt;</comment>
                    <comment id="28536" author="jafingerhut" created="Sat, 19 May 2012 02:50:22 -0500"  >&lt;p&gt;clj-967-disable-failing-io-copy-tests-on-ibm-jdk-16-patch1.txt dated May 19, 2012 disables tests of clojure.java.io/copy that fail with IBM JDK 1.6.0.  It makes minor changes to the clojure.java.io code file, but these are only to eliminate uses of reflection, and to make a few of the versions of do-copy share more of their implementation code.&lt;/p&gt;

&lt;p&gt;Tested that all results are good on Mac OS X 10.6.8 + Oracle/Apple JDK 1.6.0 and Ubuntu 11.10 + Oracle JDK 1.7.0, including that the number of tests run are identical to before this patch.  Only 2 tests are disabled on IBM JDK 1.6.0, and all of the rest pass before and after these changes.&lt;/p&gt;</comment>
                    <comment id="28537" author="jafingerhut" created="Sat, 19 May 2012 03:22:04 -0500"  >&lt;p&gt;Hoping that I&apos;m not out of line changing approval from Incomplete to None after attaching a patch that should address the reason it was marked incomplete.  The only other way to get a ticket out of Incomplete state is for a core team member to do it for me, which seems like busy-work.&lt;/p&gt;</comment>
                    <comment id="29302" author="jafingerhut" created="Thu, 30 Aug 2012 14:13:56 -0500"  >&lt;p&gt;Any comments from Rich or other screeners on the status of this one?  Just curious, since it seemed to have been screened, and then quietly tossed back into the unscreened pile.  Is it considered undesirable to disable selected tests for a particular JDK as the patch clj-967-disable-failing-io-copy-tests-on-ibm-jdk-16-patch1.txt does?  My motivation was to selectively disable only the tests that fail, and only on the JDK where they fail, leaving all passing tests to continue to run wherever possible.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11030" name="clj-886-improved-fix-for-ibm-jdks-patch2.txt" size="7827" author="jafingerhut" created="Sat, 7 Apr 2012 09:32:23 -0500" />
                    <attachment id="11233" name="clj-967-disable-failing-io-copy-tests-on-ibm-jdk-16-patch1.txt" size="5564" author="jafingerhut" created="Sat, 19 May 2012 02:50:22 -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="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-1135] Add previous changelog items back to changes.md</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1135</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description></description>
                <environment></environment>
            <key id="15909">CLJ-1135</key>
            <summary>Add previous changelog items back to changes.md</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="1">Completed</resolution>
                                <assignee username="stu">Stuart Halloway</assignee>
                                <reporter username="cosmin">Cosmin Stejerean</reporter>
                        <labels>
                    </labels>
                <created>Wed, 19 Dec 2012 13:24:08 -0600</created>
                <updated>Sat, 2 Feb 2013 16:32:09 -0600</updated>
                    <resolved>Sat, 2 Feb 2013 16:32:09 -0600</resolved>
                            <version>Release 1.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                                <attachments>
                    <attachment id="11768" name="add-changelog-items.patch" size="29895" author="cosmin" created="Wed, 19 Dec 2012 13:24:08 -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-1111] Loops returning primtives are boxed even in return position</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1111</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Reported here: &lt;a href=&quot;https://groups.google.com/d/topic/clojure/atoFzbyuyos/discussion&quot;&gt;https://groups.google.com/d/topic/clojure/atoFzbyuyos/discussion&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;(defn first-bit?
  {:inline (fn [n] `(== 1 (clojure.lang.Numbers/and ~n, 1)) )}
  [^long n]
  (== 1 (clojure.lang.Numbers/and n, 1)))

(defn exp-int
  ^double [^double x, ^long c]
  (loop [result 1.0, factor x, c c]
    (if (&amp;gt; c 0)
        (recur
         (if (first-bit? c)
           (* result factor)
           result),
         (* factor factor),
         (bit-shift-right c 1))
      result)))
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Last lines of the Java bytecode of `exp-int`:&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;59 dload 5;               /* result */
61 invokestatic 40;       /* java.lang.Double java.lang.Double.valueOf(double c) */
64 checkcast 85;          /* java.lang.Number */
67 invokevirtual 89;      /* double doubleValue() */
70 dreturn;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The compiler doesn&apos;t currently infer the primitive type as soon as there is a recur:&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;(use &apos;[clojure.contrib.repl-utils :only [expression-info]])
(expression-info &apos;(loop [a 1] a))
;=&amp;gt; {:class long, :primitive? true}
(expression-info &apos;(loop [a 1] (if true a (recur a)))
;=&amp;gt; nil
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Patch attached.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15841">CLJ-1111</key>
            <summary>Loops returning primtives are boxed even in return position</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="cgrand">Christophe Grand</assignee>
                                <reporter username="cgrand">Christophe Grand</reporter>
                        <labels>
                    </labels>
                <created>Wed, 21 Nov 2012 05:17:11 -0600</created>
                <updated>Sat, 22 Dec 2012 09:53:50 -0600</updated>
                    <resolved>Sat, 22 Dec 2012 09:53:50 -0600</resolved>
                            <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>3</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="30033" author="stu" created="Sun, 25 Nov 2012 19:12:19 -0600"  >&lt;p&gt;Tests pass, code looks reasonable. Would appreciate additional review.&lt;/p&gt;</comment>
                    <comment id="30036" author="halgari" created="Mon, 26 Nov 2012 10:59:59 -0600"  >&lt;p&gt;Tests also pass here. Looked through the code and played with a patched version of Clojure. I can&apos;t see a problem with it. &lt;/p&gt;</comment>
                    <comment id="30046" author="cgrand" created="Tue, 27 Nov 2012 04:40:05 -0600"  >&lt;p&gt;FYI, gvec.clj has two loops which return primitives and thus was formerly boxed.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11693" name="prim-loop.diff" size="3083" author="cgrand" created="Wed, 21 Nov 2012 05:17:11 -0600" />
                </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-1092] New function re-quote-replacement has incorrect :added metadata</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1092</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;I created the patch for &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-870&quot; title=&quot;clojure.string/replace behaves unexpectedly when \ or $ are part of the result string&quot;&gt;&lt;del&gt;CLJ-870&lt;/del&gt;&lt;/a&gt; that added the function re-quote-replacement before Clojure 1.4 was released, and I was apparently hoping it would get into that release.  It is in now, but incorrectly states that fn re-quote-replacement was added in 1.4.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15770">CLJ-1092</key>
            <summary>New function re-quote-replacement has incorrect :added metadata</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="jafingerhut">Andy Fingerhut</reporter>
                        <labels>
                    </labels>
                <created>Mon, 22 Oct 2012 20:42:38 -0500</created>
                <updated>Sat, 22 Dec 2012 09:53:50 -0600</updated>
                    <resolved>Sat, 22 Dec 2012 09:53:50 -0600</resolved>
                            <version>Release 1.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29771" author="jafingerhut" created="Mon, 22 Oct 2012 21:01:29 -0500"  >&lt;p&gt;And before creating this patch, I did a diff between Clojure 1.4 and 1.5-beta1 source code, and verified that every other function with :added metadata that has been added since 1.4 says &quot;1.5&quot;.  Only re-quote-replacement was mislabeled in this way.&lt;/p&gt;</comment>
                    <comment id="30068" author="redinger" created="Tue, 27 Nov 2012 15:42:07 -0600"  >&lt;p&gt;As you&apos;d expect, this patch applies cleanly and improves the correctness of the documentation.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11603" name="fix-added-metadata-for-re-quote-replacement.txt" size="893" author="jafingerhut" created="Mon, 22 Oct 2012 20:42:38 -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-1091] update changes.md to include 1.5 changes</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1091</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description></description>
                <environment></environment>
            <key id="15769">CLJ-1091</key>
            <summary>update changes.md to include 1.5 changes</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="halgari">Timothy Baldridge</assignee>
                                <reporter username="stu">Stuart Halloway</reporter>
                        <labels>
                    </labels>
                <created>Mon, 22 Oct 2012 19:50:19 -0500</created>
                <updated>Tue, 11 Dec 2012 13:09:08 -0600</updated>
                    <resolved>Tue, 11 Dec 2012 13:09:08 -0600</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29953" author="jafingerhut" created="Thu, 15 Nov 2012 11:01:27 -0600"  >&lt;p&gt;changes-draft-v1.md is not a patch, but an outline of a proposed new changes.md file for Clojure 1.5 with some of the content fleshed out.  It still has lots of occurrences of &quot;TBD&quot; for &quot;To Be Documented&quot; in it.&lt;/p&gt;

&lt;p&gt;It does mention every ticket that had a patch committed since Clojure 1.4.0 until Nov 15 2012.&lt;/p&gt;

&lt;p&gt;I am hoping someone who is more knowledgeable of the &quot;TBD&quot; parts takes this and runs with it.&lt;/p&gt;</comment>
                    <comment id="30008" author="jafingerhut" created="Thu, 22 Nov 2012 19:16:57 -0600"  >&lt;p&gt;changes-draft-v2.md is very similar to the earlier changes-draft-v1.md described above, but has a few additions.&lt;/p&gt;</comment>
                    <comment id="30040" author="halgari" created="Mon, 26 Nov 2012 14:41:58 -0600"  >&lt;p&gt;V3 of the draft...should be almost good to go. Someone with more info on reducers should take a look at that section as have yet to actually use them much. &lt;/p&gt;</comment>
                    <comment id="30044" author="jafingerhut" created="Mon, 26 Nov 2012 20:47:24 -0600"  >&lt;p&gt;Removed V2 of the draft as Timothy&apos;s V3 had all of it and more.&lt;/p&gt;</comment>
                    <comment id="30049" author="halgari" created="Tue, 27 Nov 2012 08:52:19 -0600"  >&lt;p&gt;Fleshed out the reducers section a bit. &lt;/p&gt;</comment>
                    <comment id="30050" author="halgari" created="Tue, 27 Nov 2012 08:53:33 -0600"  >&lt;p&gt;Alright, I think this is ready for a final review by someone besides me. &lt;/p&gt;</comment>
                    <comment id="30077" author="redinger" created="Wed, 28 Nov 2012 12:48:22 -0600"  >&lt;p&gt;Editorial cleanup&lt;/p&gt;</comment>
                    <comment id="30078" author="jafingerhut" created="Wed, 28 Nov 2012 12:56:01 -0600"  >&lt;p&gt;Christopher, isn&apos;t this file intended to be in Markdown format, not HTML?&lt;/p&gt;</comment>
                    <comment id="30079" author="redinger" created="Wed, 28 Nov 2012 12:58:30 -0600"  >&lt;p&gt;uploading the correct md file&lt;/p&gt;</comment>
                    <comment id="30080" author="jafingerhut" created="Wed, 28 Nov 2012 13:12:00 -0600"  >&lt;p&gt;changes-draft-v6.md same as v5, except for a couple of spelling corrections.&lt;/p&gt;</comment>
                    <comment id="30083" author="halgari" created="Thu, 29 Nov 2012 08:38:52 -0600"  >&lt;p&gt;Missing desc on when-&amp;gt;. Fixed in v7 of the doc&lt;/p&gt;</comment>
                    <comment id="30143" author="richhickey" created="Sun, 2 Dec 2012 18:37:58 -0600"  >&lt;p&gt;&quot;1.1 Clojure 1.5 requires Java 1.6 or later&quot;&lt;/p&gt;

&lt;p&gt;did you mean &quot;building Clojure 1.5&quot;?&lt;/p&gt;

&lt;p&gt;I don&apos;t know that anything requires 1.6&lt;/p&gt;</comment>
                    <comment id="30144" author="richhickey" created="Sun, 2 Dec 2012 18:41:29 -0600"  >&lt;p&gt;test-&amp;gt;, let-&amp;gt; when-&amp;gt; &lt;/p&gt;

&lt;p&gt;are now:&lt;/p&gt;

&lt;p&gt;cond-&amp;gt;, as-&amp;gt; and some-&amp;gt;&lt;/p&gt;</comment>
                    <comment id="30145" author="jafingerhut" created="Sun, 2 Dec 2012 18:49:18 -0600"  >&lt;p&gt;I&apos;ll put up an updated version soon, but that headline wasn&apos;t properly updated to match the later occurrence of it in the body, which is: &quot;Clojure 1.5 reducers library requires Java 6 or later&quot;.  Is it true that the ForkJoin library requires Java 6 or later?  If not, how can it be made to work with Java 5?&lt;/p&gt;</comment>
                    <comment id="30146" author="jafingerhut" created="Sun, 2 Dec 2012 20:42:23 -0600"  >&lt;p&gt;changes-draft-v8.md updates the table of contents headings to match those in the body, and updates names of new threading macros.&lt;/p&gt;</comment>
                    <comment id="30152" author="steveminer@gmail.com" created="Mon, 3 Dec 2012 09:40:58 -0600"  >&lt;p&gt;changes-draft-v8.md, section 2.4, needs an update for description of some-&amp;gt;.  The document says &quot;logical true&quot; where it should say &quot;not nil&quot;.  Same comment applies to some-&amp;gt;&amp;gt;.  The point is that false will thread through the forms.  This is a change from the replaced when-&amp;gt; (in 1.5-beta1).&lt;/p&gt;</comment>
                    <comment id="30154" author="halgari" created="Mon, 3 Dec 2012 10:02:39 -0600"  >&lt;p&gt;updated to reflect changes to some-&amp;gt; and some-&amp;gt;&amp;gt;&lt;/p&gt;</comment>
                    <comment id="30156" author="steveminer@gmail.com" created="Mon, 3 Dec 2012 10:15:23 -0600"  >&lt;p&gt;Sorry to nit pick, but there are two more &quot;logical true&quot; phrases in v9 that need to change to &quot;not nil&quot; in those some-&amp;gt; and some-&amp;gt;&amp;gt; descriptions.&lt;/p&gt;</comment>
                    <comment id="30157" author="halgari" created="Mon, 3 Dec 2012 10:22:18 -0600"  >&lt;p&gt;Not a problem. Thanks for looking it over!&lt;/p&gt;</comment>
                    <comment id="30169" author="stu" created="Mon, 3 Dec 2012 13:30:36 -0600"  >&lt;p&gt;I find the following sentence a little vague: &quot;Clojure 1.5 can still be compiled and run with Java 5, but the test suite will not pass due to the lack of support for ForkJoin.&quot;&lt;/p&gt;

&lt;p&gt;The problem is the application of the &quot;but&quot; to both parts of the conjunction. Isn&apos;t the intent actually: &quot;Clojure can run with Java version 1.5 or later. Running the Clojure build requires 1.6, in order to test features that work with ForkJoin.&quot;&lt;/p&gt;</comment>
                    <comment id="30170" author="jafingerhut" created="Mon, 3 Dec 2012 13:52:27 -0600"  >&lt;p&gt;Stuart H, that is almost the intent, and probably close enough for this kind of documentation.&lt;/p&gt;

&lt;p&gt;The full gory details are as follows:&lt;/p&gt;

&lt;p&gt;Clojure can build and run with Java version 1.5 or later.  A Java version 1.5 build of Clojure only works if you do not run the test suite, e.g. by using the command &quot;ant jar&quot;.  To build Clojure including running the test suite, or to use the new reducers library, requires Java 1.6 or later.&lt;/p&gt;

&lt;p&gt;If the patch for &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1109&quot; title=&quot;Oracle Java 5 fails to run tests when building Clojure&quot;&gt;&lt;del&gt;CLJ-1109&lt;/del&gt;&lt;/a&gt; is applied, the full gory details become simpler to state:&lt;/p&gt;

&lt;p&gt;Clojure can build and run with Java version 1.5 or later.  Using the new reducers library requires Java 1.6 or later.&lt;/p&gt;</comment>
                    <comment id="30171" author="jafingerhut" created="Mon, 3 Dec 2012 13:59:40 -0600"  >&lt;p&gt;changes-draft-v11.md changes the description of Java 5 limitations to match the current gory details, and hopefully address Stuart H&apos;s concerns raised above.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11739" name="changes-draft-v10.md" size="18448" author="halgari" created="Mon, 3 Dec 2012 10:21:42 -0600" />
                    <attachment id="11744" name="changes-draft-v11.md" size="18550" author="jafingerhut" created="Mon, 3 Dec 2012 13:59:40 -0600" />
                    <attachment id="11719" name="changes-draft-v5.md" size="18318" author="redinger" created="Wed, 28 Nov 2012 12:58:30 -0600" />
                </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>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJ-788] Add source and line members and getters to CompilerException</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-788</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;To improve the reliability and ease of using CompilerException in tooling, add source path and line getters to CompilerException.&lt;/p&gt;

&lt;p&gt;When handling compiler exceptions programmatically, the source path and line currently have to be parsed out of the compiler exception. &lt;/p&gt;</description>
                <environment></environment>
            <key id="14414">CLJ-788</key>
            <summary>Add source and line members and getters to CompilerException</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="hugoduncan">Hugo Duncan</reporter>
                        <labels>
                    </labels>
                <created>Tue, 3 May 2011 11:28:19 -0500</created>
                <updated>Sun, 2 Dec 2012 17:41:54 -0600</updated>
                    <resolved>Fri, 20 Jul 2012 16:44:41 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="26446" author="hugoduncan" created="Wed, 18 May 2011 17:13:52 -0500"  >&lt;p&gt;OK, I&apos;m blind - the source is already there - the line number would be nice though.&lt;/p&gt;</comment>
                    <comment id="27834" author="hugoduncan" created="Fri, 24 Feb 2012 10:28:16 -0600"  >&lt;p&gt;On clojure-1.3.0&lt;/p&gt;</comment>
                    <comment id="27836" author="jafingerhut" created="Fri, 24 Feb 2012 11:03:10 -0600"  >&lt;p&gt;clj-788-add-line-member-and-getter-to-CompilerException-patch.txt is identical to Hugo&apos;s, but for some reason that isn&apos;t obvious to me his did not apply cleanly to latest master when I tried it out, but this one does.&lt;/p&gt;

&lt;p&gt;Compiles without warnings and passes all tests.&lt;/p&gt;</comment>
                    <comment id="28753" author="stu" created="Fri, 8 Jun 2012 15:03:33 -0500"  >&lt;p&gt;Would it make sense to have CompilerException inherit from ExceptionInfo, now that we have the latter?&lt;/p&gt;</comment>
                    <comment id="28815" author="richhickey" created="Fri, 15 Jun 2012 09:32:22 -0500"  >&lt;p&gt;what patch am I supposed to be looking at?&lt;/p&gt;</comment>
                    <comment id="28816" author="jafingerhut" created="Fri, 15 Jun 2012 10:01:38 -0500"  >&lt;p&gt;They are identical except for context lines.  clj-788-add-line-member-and-getter-to-CompilerException-patch.txt is the only one that applies cleanly to latest master as of June 15, 2012.&lt;/p&gt;</comment>
                    <comment id="30134" author="bbloom" created="Sat, 1 Dec 2012 19:02:23 -0600"  >&lt;p&gt;What about getColumn ? &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-960&quot;&gt;http://dev.clojure.org/jira/browse/CLJ-960&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30140" author="jafingerhut" created="Sun, 2 Dec 2012 17:41:54 -0600"  >&lt;p&gt;Brandon, just a warning that while anyone who looks at this ticket will see your comment, not many people examine closed tickets looking for things to do with them.  If by your comment you mean that you think some additional change should be made to Clojure that wasn&apos;t made with the patch on this ticket (which I think was committed), nor by the patch committed for &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;, bringing it up in the clojure-dev group, or opening another ticket, might be more effective.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10954" name="0001-add-line-member-and-getter-to-CompilerException.diff" size="965" author="hugoduncan" created="Fri, 24 Feb 2012 10:34:11 -0600" />
                    <attachment id="10955" name="clj-788-add-line-member-and-getter-to-CompilerException-patch.txt" size="952" author="jafingerhut" created="Fri, 24 Feb 2012 11:03:10 -0600" />
                </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-948] It would be very useful to be able to annotate the constructors of classes created with gen-class</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-948</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;gen-class currently provides a way to annotate methods, but not constructors.&lt;/p&gt;

&lt;p&gt;when interoperating with java code that uses google juice heavily the ability to annotate constructors is required.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15266">CLJ-948</key>
            <summary>It would be very useful to be able to annotate the constructors of classes created with gen-class</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="chouser@n01se.net">Chouser</assignee>
                                <reporter username="hiredman">Kevin Downey</reporter>
                        <labels>
                    </labels>
                <created>Tue, 6 Mar 2012 07:59:13 -0600</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>1</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="27921" author="jafingerhut" created="Fri, 9 Mar 2012 09:15:37 -0600"  >&lt;p&gt;clj-948-annotate-gen-class-constructors-patch2.txt same as Kevin&apos;s &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-948&quot; title=&quot;It would be very useful to be able to annotate the constructors of classes created with gen-class&quot;&gt;&lt;del&gt;CLJ-948&lt;/del&gt;&lt;/a&gt;.patch, but with slight update so it applies cleanly to latest master as of March 9, 2012.  ant builds and tests with no errors or warnings.  One author Kevin Downey has signed CA.&lt;/p&gt;</comment>
                    <comment id="27924" author="hiredman" created="Fri, 9 Mar 2012 09:27:22 -0600"  >&lt;p&gt;&lt;a href=&quot;http://www.s2ki.com/s2000/uploads/gallery/1288955707/gallery_99130_32179_14062581294cd627112ab1f.gif&quot;&gt;http://www.s2ki.com/s2000/uploads/gallery/1288955707/gallery_99130_32179_14062581294cd627112ab1f.gif&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28017" author="jafingerhut" created="Mon, 26 Mar 2012 17:52:03 -0500"  >&lt;p&gt;clj-948-annotate-gen-class-constructors-patch3.txt on Mar 26, 2012 is no different from previous patches, except that it applies cleanly to latest master as of that date.  One author Kevin Downey has signed a CA.  Kevin, you don&apos;t need to thank me again.  The last time gave me eye damage (only joking).&lt;/p&gt;</comment>
                    <comment id="29472" author="chouser@n01se.net" created="Tue, 18 Sep 2012 00:40:35 -0500"  >&lt;p&gt;Patch is small and is a nice improvement.  Tests look good and pass.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11013" name="clj-948-annotate-gen-class-constructors-patch3.txt" size="3673" author="jafingerhut" created="Mon, 26 Mar 2012 17:52:03 -0500" />
                    <attachment id="10980" name="CLJ-948.patch" size="3656" author="hiredman" created="Tue, 6 Mar 2012 08:03:35 -0600" />
                </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-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>

<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-1070] PersistentQueue&apos;s hash function does not match its equality</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1070</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;There are two issues:&lt;/p&gt;

&lt;p&gt;1) PersistentQueue&apos;s hash function doesn&apos;t match its equiv function:&lt;/p&gt;

&lt;p&gt;(def iq (conj clojure.lang.PersistentQueue/EMPTY (Integer. -1)))&lt;br/&gt;
(def lq (conj clojure.lang.PersistentQueue/EMPTY (Long. -1)))&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;(= iq lq) (= (hash iq) (hash lq))&amp;#93;&lt;/span&gt;&lt;br/&gt;
;=&amp;gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;true false&amp;#93;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;2) PersistentQueue&apos;s hash function doesn&apos;t match PersistentVector&apos;s hash:&lt;/p&gt;

&lt;p&gt;(def q (conj clojure.lang.PersistentQueue/EMPTY 1 2 3))&lt;br/&gt;
[(= &lt;span class=&quot;error&quot;&gt;&amp;#91;1 2 3&amp;#93;&lt;/span&gt; q) (= (hash &lt;span class=&quot;error&quot;&gt;&amp;#91;1 2 3&amp;#93;&lt;/span&gt;) (hash q))]&lt;br/&gt;
;=&amp;gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;true false&amp;#93;&lt;/span&gt;&lt;/p&gt;
</description>
                <environment></environment>
            <key id="15699">CLJ-1070</key>
            <summary>PersistentQueue&apos;s hash function does not match its equality</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="ppotter">Philip Potter</assignee>
                                <reporter username="ppotter">Philip Potter</reporter>
                        <labels>
                    </labels>
                <created>Sat, 15 Sep 2012 12:26:38 -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>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29450" author="ppotter" created="Sat, 15 Sep 2012 13:52:56 -0500"  >&lt;p&gt;Clojure-dev discussion: &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/ME3-Ke-RbNk/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/ME3-Ke-RbNk/discussion&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29451" author="ppotter" created="Sat, 15 Sep 2012 14:34:14 -0500"  >&lt;p&gt;Attached patch 001-make-PersistentQueue-hash-match-equiv.diff, 15/Sep/12.&lt;/p&gt;</comment>
                    <comment id="29454" author="ppotter" created="Sat, 15 Sep 2012 16:56:06 -0500"  >&lt;p&gt;Attached 002-make-PersistentQueue-hash-match-equiv.diff, 15/Sep/12. This patch supercedes 001-make-PersistentQueue-hash-match-equiv.diff.&lt;/p&gt;

&lt;p&gt;Replaced test code which calls to Util/hasheq with code which calls hash instead.&lt;/p&gt;

&lt;p&gt;This patch has a minor conflict with my patch for &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1059&quot; title=&quot;PersistentQueue doesn&amp;#39;t implement java.util.List, causing nontransitive equality&quot;&gt;CLJ-1059&lt;/a&gt;, since they both add an interface to PersistentQueue (IHashEq here, List for &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1059&quot; title=&quot;PersistentQueue doesn&amp;#39;t implement java.util.List, causing nontransitive equality&quot;&gt;CLJ-1059&lt;/a&gt;).&lt;/p&gt;</comment>
                    <comment id="29477" author="chouser@n01se.net" created="Tue, 18 Sep 2012 01:38:39 -0500"  >&lt;p&gt;Thanks for the patch, Philip, it looks good to me.&lt;/p&gt;

&lt;p&gt;It really is a pity the implementations of hashCode and hasheq are duplicated.  I wonder how important it is to extend Obj?  Regardless, that&apos;s the approach PersistentQueue was already taking, so changing that would be outside the scope of this ticket anyway.&lt;/p&gt;

&lt;p&gt;I can&apos;t apply this patch with &quot;git am&quot;, but &quot;patch -p 1&quot; works fine.  I&apos;m hoping this is a configuration problem on my end, so I&apos;m marking this screened.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11499" name="001-fix-PersistentQueue-hash.clj" size="2718" author="bronsa" created="Sat, 15 Sep 2012 14:02:04 -0500" />
                    <attachment id="11500" name="001-make-PersistentQueue-hash-match-equiv.diff" size="2539" author="ppotter" created="Sat, 15 Sep 2012 14:34:14 -0500" />
                    <attachment id="11502" name="002-make-PersistentQueue-hash-match-equiv.diff" size="2320" author="ppotter" created="Sat, 15 Sep 2012 16:56:06 -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-1085] clojure.main/repl unconditionally refers REPL utilities into *ns*</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1085</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;A number of vars from &lt;tt&gt;clojure.repl&lt;/tt&gt;, &lt;tt&gt;clojure.java.javadoc&lt;/tt&gt;, and &lt;tt&gt;clojure.pprint&lt;/tt&gt; are unconditionally referred into &lt;tt&gt;&amp;#42;ns&amp;#42;&lt;/tt&gt; by &lt;tt&gt;clojure.main/repl&lt;/tt&gt;.  This is fine when it is being used e.g. as the primary driver of a terminal-bound Clojure REPL, but other usages can end up bringing those utility vars into namespaces other than &lt;tt&gt;&apos;user&lt;/tt&gt;.  This can cause problems if &lt;tt&gt;clojure.main/repl&lt;/tt&gt; is used to drive a REPL within namespaces that already have referred or interned vars with the same names as those utility vars, e.g.:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;$ java -jar ~/.m2/repository/org/clojure/clojure/1.5.0-alpha6/clojure-1.5.0-alpha6.jar
Clojure 1.5.0-alpha6
user=&amp;gt; (ns foo)
nil
foo=&amp;gt; (defn pp [] &lt;span class=&quot;code-quote&quot;&gt;&quot;hi!&quot;&lt;/span&gt;)
#&apos;foo/pp
foo=&amp;gt; (pp)
&lt;span class=&quot;code-quote&quot;&gt;&quot;hi!&quot;&lt;/span&gt;
foo=&amp;gt; (clojure.main/repl)
foo=&amp;gt; (pp)
nil
nil
foo=&amp;gt; (defn pp [] &lt;span class=&quot;code-quote&quot;&gt;&quot;whoops&quot;&lt;/span&gt;)
CompilerException java.lang.IllegalStateException: pp already refers to: #&apos;clojure.pprint/pp in namespace: foo, compiling:(NO_SOURCE_PATH:7:1)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Worse, nREPL uses &lt;tt&gt;clojure.main/repl&lt;/tt&gt; (in large part to maximize the consistency of REPL behaviour across different Clojure versions), where each user expression is evaluated through a separate &lt;tt&gt;clojure.main/repl&lt;/tt&gt; invocation.  This leads to the same problems as above, but for every nREPL user, session, and expression (reported @ &lt;a href=&quot;http://dev.clojure.org/jira/browse/NREPL-31&quot; title=&quot;REPL utilities are refered into *ns* prior to every expression evaluation&quot;&gt;&lt;del&gt;NREPL-31&lt;/del&gt;&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;A simple fix for this is to perform these refers only if &lt;tt&gt;&amp;#42;ns&amp;#42;&lt;/tt&gt; is &lt;tt&gt;&apos;user&lt;/tt&gt; (which, AFAICT, was the only intended effect of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-310&quot; title=&quot;clojure.repl namespace&quot;&gt;&lt;del&gt;CLJ-310&lt;/del&gt;&lt;/a&gt;, &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-454&quot; title=&quot;docstrings for special ops&quot;&gt;&lt;del&gt;CLJ-454&lt;/del&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/clojure/clojure/commit/04764db&quot;&gt;https://github.com/clojure/clojure/commit/04764db&lt;/a&gt;, the changes that added these automatic implicit refers to &lt;tt&gt;clojure.main/repl&lt;/tt&gt;).&lt;/p&gt;</description>
                <environment></environment>
            <key id="15744">CLJ-1085</key>
            <summary>clojure.main/repl unconditionally refers REPL utilities into *ns*</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="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="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Wed, 10 Oct 2012 13:33:36 -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>
                <version>Release 1.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>3</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29628" author="cemerick" created="Wed, 10 Oct 2012 13:36:52 -0500"  >&lt;p&gt;Patch attached to only refer in the utility vars if in the &lt;tt&gt;user&lt;/tt&gt; namespace.&lt;/p&gt;</comment>
                    <comment id="29629" author="steveminer@gmail.com" created="Wed, 10 Oct 2012 14:03:48 -0500"  >&lt;p&gt;It would probably be better to test with ns-name (as opposed to comparing strings):&lt;/p&gt;

&lt;p&gt;    (= &apos;user (ns-name &lt;b&gt;ns&lt;/b&gt;))&lt;/p&gt;</comment>
                    <comment id="29630" author="hiredman" created="Wed, 10 Oct 2012 14:18:31 -0500"  >&lt;p&gt;I don&apos;t follow how it is required to call `clojure.main/repl` for every input&lt;/p&gt;</comment>
                    <comment id="29631" author="cemerick" created="Wed, 10 Oct 2012 14:19:36 -0500"  >&lt;p&gt;Gah, of course.  :-/  Patch updated.&lt;/p&gt;</comment>
                    <comment id="29632" author="cemerick" created="Wed, 10 Oct 2012 14:32:42 -0500"  >&lt;p&gt;@Kevin: It&apos;s not &lt;em&gt;required&lt;/em&gt;, but I found it far more straightforward to not try to pretend that the underlying transport was stream-based when it&apos;s actually message-based.  It also means that sessions can be very lightweight: unless code is being evaluated within a session, it is not occupying a thread, and takes up only as much space as its map of thread-local bindings.&lt;/p&gt;</comment>
                    <comment id="29649" author="cemerick" created="Mon, 15 Oct 2012 05:10:04 -0500"  >&lt;p&gt;Based on discussion on clojure-dev, I have attached an alternative patch ({{&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1085&quot; title=&quot;clojure.main/repl unconditionally refers REPL utilities into *ns*&quot;&gt;&lt;del&gt;CLJ-1085&lt;/del&gt;&lt;/a&gt;-refactor.diff}}), which:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;breaks out the libspecs specifying the implicit refers into their own var (so that they can be consistently applied by other REPL implementations)&lt;/li&gt;
	&lt;li&gt;moves the default &lt;tt&gt;require&lt;/tt&gt; of the libspecs to be invoked only when REPL is started from &lt;tt&gt;clojure.main&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
</comment>
                    <comment id="29696" author="stu" created="Fri, 19 Oct 2012 14:12:51 -0500"  >&lt;p&gt;Screened and liked the second &quot;refactor&quot; patch.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11549" name="CLJ-1085.diff" size="1037" author="cemerick" created="Wed, 10 Oct 2012 14:19:36 -0500" />
                    <attachment id="11560" name="CLJ-1085-refactor.diff" size="1844" author="cemerick" created="Mon, 15 Oct 2012 04:47: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>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJ-917] clojure.core/definterface is not included in the API docs</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-917</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Is &lt;tt&gt;definterface&lt;/tt&gt; meant to be a public API?  If yes, then it needs a docstring.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15143">CLJ-917</key>
            <summary>clojure.core/definterface is not included in the API docs</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="tsdh">Tassilo Horn</reporter>
                        <labels>
                        <label>documentation</label>
                    </labels>
                <created>Mon, 23 Jan 2012 07:58:55 -0600</created>
                <updated>Sat, 20 Oct 2012 09:53:42 -0500</updated>
                    <resolved>Sat, 20 Oct 2012 09:53:42 -0500</resolved>
                            <version>Release 1.3</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="27618" author="tsdh" created="Wed, 25 Jan 2012 14:28:05 -0600"  >&lt;p&gt;This patch obsoletes the previous one.  The only addition is the insertion of :added metadata which is needed to make the tests pass.&lt;/p&gt;</comment>
                    <comment id="27911" author="tsdh" created="Thu, 8 Mar 2012 03:53:02 -0600"  >&lt;p&gt;Updated patch.&lt;/p&gt;</comment>
                    <comment id="27995" author="stuart.sierra" created="Fri, 23 Mar 2012 09:04:59 -0500"  >&lt;p&gt;Screened, pending question for Rich: &quot;Is definterface meant to be a public API?&quot;&lt;/p&gt;</comment>
                    <comment id="28663" author="tsdh" created="Thu, 31 May 2012 01:45:29 -0500"  >&lt;p&gt;Rebased patch on current master.&lt;/p&gt;</comment>
                    <comment id="29265" author="stuart.sierra" created="Fri, 24 Aug 2012 13:12:24 -0500"  >&lt;p&gt;Screened again. Still applies as of commit 1c8eb16a14ce5daefef1df68d2f6b1f143003140&lt;/p&gt;</comment>
                    <comment id="29688" author="stu" created="Fri, 19 Oct 2012 10:32:40 -0500"  >&lt;p&gt;The &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-971&quot; title=&quot;Jar within a jar throws a runtime error&quot;&gt;CLJ-971&lt;/a&gt; patch I just added is the same as the original with grammar corrections.&lt;/p&gt;</comment>
                    <comment id="29723" author="tsdh" created="Sat, 20 Oct 2012 05:48:29 -0500"  >&lt;p&gt;Patch including Stu&apos;s grammar/typo fixes.&lt;/p&gt;

&lt;p&gt;Sorry, contributors like to show up in the commit history, so I couldn&apos;t resist stealing my patch back from you. &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/wink.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11585" name="0001-Add-docstring-and-added-metadata-to-definterface.patch" size="1100" author="tsdh" created="Sat, 20 Oct 2012 05:48:29 -0500" />
                    <attachment id="11578" name="CLJ-917-definterface.patch" size="1090" author="stu" created="Fri, 19 Oct 2012 10:32:40 -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-1052] assoc should throw exception if missing val for last key</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1052</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/?fromgroups=#!topic/clojure/k2R4OdPUCzg&quot;&gt;https://groups.google.com/forum/?fromgroups=#!topic/clojure/k2R4OdPUCzg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Suggested by Ambrose Bonnaire-Sergeant:&lt;/p&gt;

&lt;p&gt;I think assoc should throw an error when applied with uneven arguments.&lt;/p&gt;

&lt;p&gt;Currently, the &quot;missing&quot; value is just replaced with nil.&lt;/p&gt;

&lt;p&gt;(assoc {} :a 1 :b)&lt;br/&gt;
;=&amp;gt; {:a 1, :b nil}&lt;/p&gt;</description>
                <environment></environment>
            <key id="15653">CLJ-1052</key>
            <summary>assoc should throw exception if missing val for last key</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="jafingerhut">Andy Fingerhut</reporter>
                        <labels>
                    </labels>
                <created>Wed, 29 Aug 2012 16:40:24 -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.2</version>
                <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>8</votes>
                        <watches>4</watches>
                        <comments>
                    <comment id="29286" author="jafingerhut" created="Wed, 29 Aug 2012 16:42:49 -0500"  >&lt;p&gt;Patch clj-1052-assoc-should-throw-exc-if-missing-val-patch1.txt dated Aug 29 2012 makes assoc throw an IllegalArgumentException if more than one key is given, but the last key has no value.  It includes a few simple test cases with correct and incorrect arguments to assoc.&lt;/p&gt;</comment>
                    <comment id="29287" author="ambrosebs" created="Wed, 29 Aug 2012 17:14:13 -0500"  >&lt;p&gt;IMO if the error message included something like &quot;assoc expects even number of arguments after target, found odd number&quot;, or some mention of the number of arguments the error would be clearer to me.&lt;/p&gt;</comment>
                    <comment id="29288" author="jafingerhut" created="Wed, 29 Aug 2012 18:06:59 -0500"  >&lt;p&gt;clj-1052-assoc-should-throw-exc-if-missing-val-patch2.txt is identical to the now-removed -patch1.txt, except for the text of the exception thrown, updated as per Ambrose&apos;s suggestion.&lt;/p&gt;</comment>
                    <comment id="29479" author="stu" created="Tue, 18 Sep 2012 06:51:53 -0500"  >&lt;p&gt;The patch appears correct. It does introduce a single extra (next) per iteration into the success path, although that seems unlikely to dominate the work. Wouldn&apos;t hurt to add as assessment showing this is no slower for correct programs.&lt;/p&gt;
</comment>
                    <comment id="29497" author="jafingerhut" created="Wed, 19 Sep 2012 02:03:45 -0500"  >&lt;p&gt;Test platform: Mac OS X 10.6.8 + Oracle/Apple Java 1.6.0_35 Java HotSpot(TM) 64-Bit Server VM&lt;/p&gt;

&lt;p&gt;With latest Clojure master as of Sep 19 2012:&lt;/p&gt;

&lt;p&gt;Clojure 1.5.0-master-SNAPSHOT&lt;br/&gt;
user=&amp;gt; (set! &lt;b&gt;unchecked-math&lt;/b&gt; true)&lt;br/&gt;
true&lt;br/&gt;
(defn count-maps &lt;span class=&quot;error&quot;&gt;&amp;#91;n&amp;#93;&lt;/span&gt;&lt;br/&gt;
  (let &lt;span class=&quot;error&quot;&gt;&amp;#91;base {:a 1}&amp;#93;&lt;/span&gt;&lt;br/&gt;
    (loop [i n&lt;br/&gt;
           sum 0]&lt;br/&gt;
      (if (zero? i)&lt;br/&gt;
        sum&lt;br/&gt;
        (let &lt;span class=&quot;error&quot;&gt;&amp;#91;m1 (assoc base :b 2 :c 3 :d 4 :e 5 :f 6 :g 7 :h 8 :i 9 :j 10)&amp;#93;&lt;/span&gt;&lt;br/&gt;
          (recur (dec i) (+ sum (count m1))))))))&lt;br/&gt;
#&apos;user/count-maps&lt;br/&gt;
user=&amp;gt; (time (count-maps 10000000))&lt;br/&gt;
&quot;Elapsed time: 48784.077 msecs&quot;&lt;br/&gt;
100000000&lt;br/&gt;
user=&amp;gt; (time (count-maps 10000000))&lt;br/&gt;
&quot;Elapsed time: 49028.52 msecs&quot;&lt;br/&gt;
100000000&lt;br/&gt;
user=&amp;gt; (time (count-maps 10000000))&lt;br/&gt;
&quot;Elapsed time: 50314.729 msecs&quot;&lt;br/&gt;
100000000&lt;/p&gt;

&lt;p&gt;Same Clojure version, plus the patch that was screened:&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (time (count-maps 10000000))&lt;br/&gt;
&quot;Elapsed time: 49576.191 msecs&quot;&lt;br/&gt;
100000000&lt;br/&gt;
user=&amp;gt; (time (count-maps 10000000))&lt;br/&gt;
&quot;Elapsed time: 49957.866 msecs&quot;&lt;br/&gt;
100000000&lt;br/&gt;
user=&amp;gt; (time (count-maps 10000000))&lt;br/&gt;
&quot;Elapsed time: 52149.998 msecs&quot;&lt;br/&gt;
100000000&lt;/p&gt;

&lt;p&gt;(average of 3 times after patch) / (average of 3 times before patch) = 1.0240&lt;/p&gt;

&lt;p&gt;So 2.4% slowdown on average for that test case.  I should add that I&apos;m not a statistician, but note that this 2.4% difference is less than the variation in run time from one run to the next of the same experiment.  Likely any real statistician would recommend collecting a lot more data before asserting there is a change in performance.&lt;/p&gt;</comment>
                    <comment id="29601" author="jafingerhut" created="Fri, 5 Oct 2012 07:38:05 -0500"  >&lt;p&gt;clj-1052-assoc-should-throw-exc-if-missing-val-patch3.txt dated Oct 5 2012 is the same as the previous patch clj-1052-assoc-should-throw-exc-if-missing-val-patch2.txt dated Aug 29 2012 except some context lines have been updated so that it applies cleanly using git.  The older version will be removed in a minute.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11536" name="clj-1052-assoc-should-throw-exc-if-missing-val-patch3.txt" size="1816" author="jafingerhut" created="Fri, 5 Oct 2012 07:38:05 -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-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-1084] (object-array [1]) is ~3x slower than (object-array (rseq [1]))</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1084</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;{{user=&amp;gt; (time (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;_ 10000000&amp;#93;&lt;/span&gt; (object-array &lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt;)))&lt;br/&gt;
&quot;Elapsed time: 1178.116257 msecs&quot;&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; (time (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;_ 10000000&amp;#93;&lt;/span&gt; (object-array (rseq &lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt;))))&lt;br/&gt;
&quot;Elapsed time: 422.42248 msecs&quot;&lt;br/&gt;
nil}}&lt;/p&gt;


&lt;p&gt;This appears to be because PersistentVector$ChunkedSeq does not implement Counted, so RT.count is iterating the ChunkedSeq to get its count.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15743">CLJ-1084</key>
            <summary>(object-array [1]) is ~3x slower than (object-array (rseq [1]))</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="pjstadig">Paul Stadig</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Tue, 9 Oct 2012 14:07:53 -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>1</watches>
                        <comments>
                    <comment id="29623" author="pjstadig" created="Tue, 9 Oct 2012 14:11:21 -0500"  >&lt;p&gt;I don&apos;t believe this is Major priority, but I cannot edit the ticket after having created it.&lt;/p&gt;</comment>
                    <comment id="29633" author="tsdh" created="Thu, 11 Oct 2012 10:17:56 -0500"  >&lt;p&gt;This patch makes PersistentVector$ChunkedSeq implement Counted.&lt;/p&gt;

&lt;p&gt;Performance before:&lt;/p&gt;
&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;(let [v (vec (range 10000))
      vs (seq v)]
  (time (dotimes [_ 10000]
          (count v)))
  (time (dotimes [_ 10000]
          (count vs))))
;&quot;Elapsed time: 0.862259 msecs&quot;
;&quot;Elapsed time: 7228.72486 msecs&quot;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Performance after (with the patch):&lt;/p&gt;
&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;(let [v (vec (range 10000))
      vs (seq v)]
  (time (dotimes [_ 10000]
          (count v)))
  (time (dotimes [_ 10000]
          (count vs))))
;&quot;Elapsed time: 0.967301 msecs&quot;
;&quot;Elapsed time: 0.99391 msecs&quot;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Also with Paul&apos;s test case.&lt;/p&gt;

&lt;p&gt;Before:&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;(time (dotimes [_ 10000000] (object-array [1])))
;&quot;Elapsed time: 1668.346997 msecs&quot;
(time (dotimes [_ 10000000] (object-array (rseq [1]))))
;&quot;Elapsed time: 662.820591 msecs&quot;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After:&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;(time (dotimes [_ 10000000] (object-array [1])))
;&quot;Elapsed time: 757.084577 msecs&quot;
(time (dotimes [_ 10000000] (object-array (rseq [1]))))
;&quot;Elapsed time: 680.602921 msecs&quot;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29693" author="stu" created="Fri, 19 Oct 2012 13:46:44 -0500"  >&lt;p&gt;Two patches to be applied together, the 10/19 patch adds tests and updates to latest test.generative.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11551" name="0001-Make-PersistentVector-ChunkedSeq-implement-Counted.patch" size="1168" author="tsdh" created="Thu, 11 Oct 2012 10:17:56 -0500" />
                    <attachment id="11580" name="CLJ-1084-tests.patch" size="1575" author="stu" created="Fri, 19 Oct 2012 13:46: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-1065] Allow duplicate set elements and map keys for all set and map constructors</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1065</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;See description here &lt;a href=&quot;http://dev.clojure.org/display/design/Allow+duplicate+map+keys+and+set+elements&quot;&gt;http://dev.clojure.org/display/design/Allow+duplicate+map+keys+and+set+elements&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15685">CLJ-1065</key>
            <summary>Allow duplicate set elements and map keys for all set and map constructors</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="jafingerhut">Andy Fingerhut</reporter>
                        <labels>
                    </labels>
                <created>Sat, 8 Sep 2012 01:15:16 -0500</created>
                <updated>Thu, 4 Oct 2012 10:15:06 -0500</updated>
                    <resolved>Thu, 4 Oct 2012 10:15:06 -0500</resolved>
                            <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="29405" author="jafingerhut" created="Sat, 8 Sep 2012 01:19:50 -0500"  >&lt;p&gt;I think that clj-1065-set-map-constructors-allow-duplicates-v1.txt dated Sep 7 2012 updates Clojure for the behavior Rich recommends on the dev Wiki page in the description.  I may have missed something, though.  Perhaps the most questionable part is the way I&apos;ve chosen to implement array-map always taking the last key&apos;s value.  It is no less efficient than the PersistentArrayMap createWithCheck method, i.e. O(n^2). &lt;/p&gt;</comment>
                    <comment id="29409" author="richhickey" created="Sat, 8 Sep 2012 07:10:54 -0500"  >&lt;p&gt;Thanks!&lt;/p&gt;

&lt;p&gt;array-map is ok. I would prefer that the docs strings say &quot;as if by repeated assoc&quot; (or conj for sets). &quot;eliminates&quot; and &quot;last&quot; are less precise e.g. what if you pass equal things, but with different metadata, to hash-set? &quot;Eliminates dupes&quot; doesn&apos;t say.&lt;/p&gt;</comment>
                    <comment id="29412" author="jafingerhut" created="Sat, 8 Sep 2012 15:39:25 -0500"  >&lt;p&gt;clj-1065-set-map-constructors-allow-duplicates-v2.txt dated Sep 8 2012 supersedes yesterday&apos;s -v1.txt patch, which I will remove.&lt;/p&gt;

&lt;p&gt;This one updates doc strings per Rich&apos;s suggestion.&lt;/p&gt;

&lt;p&gt;Also, his mention of metadata and &quot;as if by assoc&quot; led me to beef up the new test cases to check that metadata is correct, and I thus found that my new array-map constructor was not doing the right thing.  This one does.&lt;/p&gt;

&lt;p&gt;There is still no implementation of Rich&apos;s #3 yet.  Just wanted to get this one up there in case someone else builds on it before I do.&lt;/p&gt;</comment>
                    <comment id="29414" author="jafingerhut" created="Sun, 9 Sep 2012 03:07:01 -0500"  >&lt;p&gt;Patch clj-1065-do-map-constant-duplicate-key-checks-compile-time-only-v1.txt only makes changes that should eliminate run-time checks for duplicate map keys, if they are compile-time constants.&lt;/p&gt;

&lt;p&gt;It is currently separate from the changes to those for the set/map constructor functions, since I am less sure about these changes.  I&apos;m not terribly familiar with the compiler internals, and I might be going about this the wrong way.  Better to get separate feedback on these changes alone.  I&apos;m happy to merge them all into one patch if both parts look good.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11488" name="clj-1065-do-map-constant-duplicate-key-checks-compile-time-only-v1.txt" size="8648" author="jafingerhut" created="Sun, 9 Sep 2012 03:07:01 -0500" />
                    <attachment id="11487" name="clj-1065-set-map-constructors-allow-duplicates-v2.txt" size="9261" author="jafingerhut" created="Sat, 8 Sep 2012 15:39:25 -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-988] the locking in MultiFn.java (synchronized methods) can cause lots of contention in multithreaded programs</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-988</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;if you call a single multimethod a lot in multithreaded code you get lots of contention for the lock on the multimethod. this contention slows things down a lot.&lt;/p&gt;

&lt;p&gt;this is due to getMethod being synchronized. it would be great if there was some fast non-locking path through the multimethod.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15419">CLJ-988</key>
            <summary>the locking in MultiFn.java (synchronized methods) can cause lots of contention in multithreaded programs</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="stuart.sierra">Stuart Sierra</assignee>
                                <reporter username="hiredman">Kevin Downey</reporter>
                        <labels>
                        <label>bug</label>
                        <label>performance</label>
                    </labels>
                <created>Tue, 8 May 2012 11:14:53 -0500</created>
                <updated>Fri, 21 Sep 2012 14:21:33 -0500</updated>
                    <resolved>Fri, 21 Sep 2012 14:21:33 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>10</votes>
                        <watches>9</watches>
                        <comments>
                    <comment id="28411" author="hiredman" created="Tue, 8 May 2012 11:30:00 -0500"  >&lt;p&gt;&lt;a href=&quot;http://groups.google.com/group/clojure-dev/browse_thread/thread/6a8219ae3d4cd0ae?hl=en&quot;&gt;http://groups.google.com/group/clojure-dev/browse_thread/thread/6a8219ae3d4cd0ae?hl=en&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28446" author="santiago" created="Fri, 11 May 2012 06:38:34 -0500"  >&lt;p&gt;Here&apos;s a stab in the dark attempt at rewriting MultiFn to use atoms to swap between immutable copies of its otherwise mutable state. &lt;/p&gt;

&lt;p&gt;The four pieces of the MultiFn&apos;s state that are mutable and protected by locks are now contained in the MultiFn.State class, which is immutable and contains convenience functions for creating a new one with one field changed. An instance of this class is now held in an atom in the MultiFn called state. Changes to any of these four members are now done with an atomic swap of these State objects. &lt;/p&gt;

&lt;p&gt;The getMethod/findAndCacheBestMethod complex was rewritten to better enable the atomic logic. findAndCacheBestMethod was replaced with findBestMethod, which merely looks up the method; the caching logic was moved to getMethod so that it can be retried easily as part of the work that method does. &lt;/p&gt;

&lt;p&gt;As it was findAndCacheBestMethod seemingly had the potential to cause a stack overflow in a perfect storm of heavy concurrent modification, since it calls itself recursively if it finds that the hierarchy has changed while it has done its work. This logic is now done in the CAS looping of getMethod, so hopefully that is not even an unlikely possibility anymore.&lt;/p&gt;

&lt;p&gt;There is still seemingly a small race here, since the check is done of a regular variable against the value in a ref. Now as before, the ref could be updated just after you do the check, but before the MultiFn&apos;s state is updated. Of course, only the method lookup part of a MultiFn call was synchronized before; it could already change after the lookup but before the method itself executed, having a stale method finish seemingly after the method had been changed. Things are no different now in general, with the atom-based approach, so perhaps this race is not a big deal, as a stale value can&apos;t persist for long.&lt;/p&gt;

&lt;p&gt;The patch passes the tests and Clojure and multimethods seems to work.&lt;/p&gt;</comment>
                    <comment id="28482" author="hiredman" created="Sat, 12 May 2012 20:59:45 -0500"  >&lt;p&gt;this patch gets rid of the ugly lock contention issues. I have not been able to benchmark it vs. the old multimethod implementation, but looking at it, I would not be surprised if it is faster when the system is in a steady state.&lt;/p&gt;</comment>
                    <comment id="28747" author="stu" created="Fri, 8 Jun 2012 12:11:51 -0500"  >&lt;p&gt;This looks straightforward, except for getMethod. Can somebody with context add more discussion of how method caching works?&lt;/p&gt;

&lt;p&gt;Also, it would be great to have tests with this one.&lt;/p&gt;</comment>
                    <comment id="28810" author="santiago" created="Fri, 15 Jun 2012 04:44:53 -0500"  >&lt;p&gt;Obviously I didn&apos;t write the original code, so I&apos;m not the ideal&lt;br/&gt;
person to explain this stuff. But I did work with it a bit recently,&lt;br/&gt;
so in the hopes that I can be helpful, I&apos;m writing down my&lt;br/&gt;
understanding of the code as I worked with it. Since I came to the&lt;br/&gt;
code and sort of reverse engineered my way to this understanding,&lt;br/&gt;
hopefully laying this all out will make any mistakes or&lt;br/&gt;
misunderstandings I may have made easier to catch and correct. To&lt;br/&gt;
ensure some stability, I&apos;ll talk about the original MultiFn code as it&lt;br/&gt;
stands at this commit:&lt;br/&gt;
&lt;a href=&quot;https://github.com/clojure/clojure/blob/8fda34e4c77cac079b711da59d5fe49b74605553/src/jvm/clojure/lang/MultiFn.java&quot;&gt;https://github.com/clojure/clojure/blob/8fda34e4c77cac079b711da59d5fe49b74605553/src/jvm/clojure/lang/MultiFn.java&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are four pieces of state that change as the multimethod is either&lt;br/&gt;
populated with methods or called.&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;methodTable: A persistent map from a dispatch value (Object) to&lt;br/&gt;
    a function (IFn). This is the obvious thing you think it is,&lt;br/&gt;
    determining which dispatch values call which function.&lt;/li&gt;
	&lt;li&gt;preferTable: A persistent map from a dispatch value (Object) to&lt;br/&gt;
    another value (Object), where the key &quot;is preferred&quot; to the value.&lt;/li&gt;
	&lt;li&gt;methodCache: A persistent map from a dispatch value (Object) to&lt;br/&gt;
    function (IFn). By default, the methodCache is assigned the same&lt;br/&gt;
    map value as the methodTable. If values are calculated out of the&lt;br/&gt;
    hierarchy during a dispatch, the originating value and the&lt;br/&gt;
    ultimate method it resolves to are inserted as additional items in&lt;br/&gt;
    the methodCache so that subsequent calls can jump right to the&lt;br/&gt;
    method without recursing down the hierarchy and preference table.&lt;/li&gt;
	&lt;li&gt;cachedHierarchy: An Object that refers to the hierarchy that is&lt;br/&gt;
    reflected in the latest cached values. It is used to check if the&lt;br/&gt;
    hierarchy has been updated since we last updated the cache. If it&lt;br/&gt;
    has been updated, then the cache is flushed.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I think reset(), addMethod(), removeMethod(), preferMethod(),&lt;br/&gt;
prefers(), isA(), dominates(), and resetCache() are extremely&lt;br/&gt;
straightforward in both the original code and the patch. In the&lt;br/&gt;
original code, the first four of those are synchronized, and the other&lt;br/&gt;
four are only called from methods that are synchronized (or from&lt;br/&gt;
methods only called from methods that are synchronized).&lt;/p&gt;

&lt;p&gt;Invoking a multimethod through its invoke() function will call&lt;br/&gt;
getFn(). getFn() will call the getMethod() function, which is&lt;br/&gt;
synchronized. This means any call of the multimethod will wait for and&lt;br/&gt;
take a lock as part of method invocation. The goal of the patch in&lt;br/&gt;
this issue is to remove this lock on calls into the multimethod. It in&lt;br/&gt;
fact removes the locks on all operations, and instead keeps its&lt;br/&gt;
internal mutable state by atomically swapping a private immutable&lt;br/&gt;
State object held in an Atom called state.&lt;/p&gt;

&lt;p&gt;The biggest change in the patch is to the&lt;br/&gt;
getFn()&lt;del&gt;&amp;gt;getMethod()&lt;/del&gt;&amp;gt;findAndCacheBestMethod() complex from the&lt;br/&gt;
original code. I&apos;ll describe how that code works first. &lt;/p&gt;

&lt;p&gt;In the original code, getFn() does nothing but bounce through&lt;br/&gt;
getMethod(). getMethod() tries three times to find a method to call,&lt;br/&gt;
after checking that the cache is up to date and flushing it if it&lt;br/&gt;
isn&apos;t:&lt;/p&gt;

&lt;p&gt;    1. It checks if there&apos;s a method for the dispatch value in the&lt;br/&gt;
    methodCache. &lt;/p&gt;

&lt;p&gt;    2. If not, it calls findAndCacheBestMethod() on the&lt;br/&gt;
    dispatch value. findAndCacheBestMethod() does the following:&lt;/p&gt;

&lt;p&gt;        1. It iterates through every map entry in the method table,&lt;br/&gt;
        keeping at each step the best entry it has found so far&lt;br/&gt;
        (according to the hierarchy and preference tables).  &lt;/p&gt;

&lt;p&gt;        2. If it did not find a suitable entry, it returns null.  &lt;/p&gt;

&lt;p&gt;        3. Otherwise, it checks if the hierarchy has been changed since the cache&lt;br/&gt;
        was last updated. If it has not changed, it inserts the method&lt;br/&gt;
        into the cache and returns it. If it has been changed, it&lt;br/&gt;
        resets the cache and calls itself recursively to repeat the process.&lt;/p&gt;

&lt;p&gt;    3. Failing all else, it will return the method for the default&lt;br/&gt;
    dispatch value.&lt;/p&gt;

&lt;p&gt;Again, remember everything in the list above happens in a call to a&lt;br/&gt;
synchronized function. Also note that as it is currently written,&lt;br/&gt;
findAndCacheBestMethod() uses recursion for iteration in a way that&lt;br/&gt;
grows the stack. This seems unlikely to cause a stack overflow unless&lt;br/&gt;
the multimethod is getting its hierarchy updated very rapidly for a&lt;br/&gt;
sustained period while someone else tries to call it. Nonetheless, the&lt;br/&gt;
hierarchy is held in an IRef that is updated independently of the&lt;br/&gt;
locking of the MultiFn. Finally, note that the multimethod is locked&lt;br/&gt;
only while the method is being found. Once it is found, the lock is&lt;br/&gt;
released and the method actually gets called afterwards without any&lt;br/&gt;
synchronization, meaning that by the time the method actually&lt;br/&gt;
executes, the multimethod may have already been modified in a way that&lt;br/&gt;
suggests a different method should have been called. Presumably this&lt;br/&gt;
is intended, understood, and not a big deal.&lt;/p&gt;

&lt;p&gt;Moving on now to the patch in this issue. As mentioned, the main&lt;br/&gt;
change is updating this entire apparatus to work with a single atomic&lt;br/&gt;
swap to control concurrency. This means that all updates to the&lt;br/&gt;
multimethod&apos;s state have to happen at one instant in time. Where the&lt;br/&gt;
original code could make multiple changes to the state at different&lt;br/&gt;
times, knowing it was safely protected by an exclusive lock, rewriting&lt;br/&gt;
for atom swaps requires us to reorganize the code so that all updates&lt;br/&gt;
to the state happen at the same time with a single CAS.&lt;/p&gt;

&lt;p&gt;To implement this change, I pulled the implicit looping logic from&lt;br/&gt;
findAndCacheBestMethod() up into getMethod() itself, and broke the&lt;br/&gt;
&quot;findBestMethod&quot; part into its own function, findBestMethod(), which&lt;br/&gt;
makes no update to any state while implementing the same&lt;br/&gt;
logic. getMethod() now has an explicit loop to avoid stack-consuming&lt;br/&gt;
recursion on retries. This infinite for loop covers all of the logic&lt;br/&gt;
in getMethod() and retries until a method is successfully found and a&lt;br/&gt;
CAS operation succeeds, or we determine that the method cannot be&lt;br/&gt;
found and we return the default dispatch value&apos;s implementation.&lt;/p&gt;

&lt;p&gt;I&apos;ll now describe the operation of the logic in the for loop. The&lt;br/&gt;
first two steps in the loop correspond to things getMethod() does&lt;br/&gt;
&quot;before&quot; its looping construct in the original code, but we have to do&lt;br/&gt;
in the loop to get the latest values.&lt;/p&gt;

&lt;p&gt;    1. First we dereference our state, and assign this value to both&lt;br/&gt;
    oldState and newState. We also set a variable called needWrite to&lt;br/&gt;
    false; this is so we can avoid doing a CAS (they&apos;re not free) when&lt;br/&gt;
    we have not actually updated the state.  &lt;/p&gt;

&lt;p&gt;    2. Check if the cache is stale, and flush it if so. If the cache&lt;br/&gt;
    gets flushed, set needWrite to true, as the state has changed.&lt;/p&gt;

&lt;p&gt;    3. Check if the methodCache has an entry for this dispatch&lt;br/&gt;
    value. If so, we are &quot;finished&quot; in the sense that we found the&lt;br/&gt;
    value we wanted. However, we may need to update the state. So, &lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;If needWrite is false, we can return without a CAS, so just&lt;br/&gt;
          break out of the loop and return the method.&lt;/li&gt;
&lt;/ul&gt;


&lt;ul&gt;
	&lt;li&gt;Otherwise, we need to update the state object with a CAS. If&lt;br/&gt;
          the CAS is successful, break out of the loop and return the&lt;br/&gt;
          target function. Otherwise, continue on the next iteration&lt;br/&gt;
          of the loop, skipping any other attempts to fetch the method&lt;br/&gt;
          later in the loop (useless work, at this point).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;    4. The value was not in the methodCache, so call the function&lt;br/&gt;
    findBestMethod() to attempt to find a suitable method based on the&lt;br/&gt;
    hierarchy and preferences. If it does find us a suitable method,&lt;br/&gt;
    we now need to cache it ourselves. We create a new state object&lt;br/&gt;
    with the new method cache and attempt to update the state atom&lt;br/&gt;
    with a CAS (we definitely need a write here, so no need to check&lt;br/&gt;
    needWrite at this point).&lt;/p&gt;

&lt;p&gt;    The one thing that is possibly questionable is the check at this&lt;br/&gt;
    point to make sure the hierarchy has not been updated since the&lt;br/&gt;
    beginning of this method. I inserted this here to match the&lt;br/&gt;
    identical check at the corresponding point in&lt;br/&gt;
    findAndCacheBestMethod() in the original code. That is also a&lt;br/&gt;
    second check, since the cache is originally checked for freshness&lt;br/&gt;
    at the very beginning of getMethod() in the original code. That&lt;br/&gt;
    initial check happens at the beginning of the loop in the&lt;br/&gt;
    patch. Given that there is no synchronization with the method&lt;br/&gt;
    hierarchy, it is not clear to me that this second check is needed,&lt;br/&gt;
    since we are already proceeding with a snapshot from the beginning&lt;br/&gt;
    of the loop. Nonetheless, it can&apos;t hurt as far as I can tell, it&lt;br/&gt;
    is how the original code worked, and I assume there was some&lt;br/&gt;
    reason for that, so I kept the second check.&lt;/p&gt;

&lt;p&gt;    5. Finally, if findBestMethod() failed to find us a method for the&lt;br/&gt;
    dispatch value, find the method for the default dispatch value and&lt;br/&gt;
    return that by breaking out of the loop.&lt;/p&gt;

&lt;p&gt;So the organization of getMethod() in the patch is complicated by two&lt;br/&gt;
factors: (1) making the retry looping explicit and stackless, (2)&lt;br/&gt;
skipping the CAS when we don&apos;t need to update state, and (3) skipping&lt;br/&gt;
needless work later in the retry loop if we find a value but are&lt;br/&gt;
unable to succeed in our attempt to CAS. Invoking a multimethod that&lt;br/&gt;
has a stable hierarchy and a populated cache should not even have a&lt;br/&gt;
CAS operation (or memory allocation) on this code path, just a cache&lt;br/&gt;
lookup after the dispatch value is calculated.&lt;/p&gt;</comment>
                    <comment id="28811" author="santiago" created="Fri, 15 Jun 2012 04:45:58 -0500"  >&lt;p&gt;I&apos;ve updated this patch (removing the old version, which is entirely superseded by this one). The actual changes to MultiFn.java are identical (modulo any thing that came through in the rebase), but this newer patch has tests of basic multimethod usage, including defmulti, defmethod, remove-method, prefer-method and usage of these in a hierarchy that updates in a way interleaved with calls. &lt;/p&gt;</comment>
                    <comment id="28812" author="santiago" created="Fri, 15 Jun 2012 06:38:27 -0500"  >&lt;p&gt;I created a really, really simple benchmark to make sure this was an improvement. The following tests were on a quad-core hyper-threaded 2012 MBP. &lt;/p&gt;

&lt;p&gt;With two threads contending for a simple multimethod: &lt;br/&gt;
The lock-based multifns run at an average of 606ms, with about 12% user, 15% system CPU at around 150%. &lt;br/&gt;
The lockless multifns run at an average of 159ms, with about 25% user, 3% system CPU at around 195%.&lt;/p&gt;

&lt;p&gt;With four threads contending for a simple multimethod:&lt;br/&gt;
The lock-based multifns run at an average of 1.2s, with about 12% user, 15% system, CPU at around 150%.&lt;br/&gt;
The lockless multifns run at an average of 219ms, with about 50% user, 4% system, CPU at around 330%.&lt;/p&gt;

&lt;p&gt;You can get the code at &lt;a href=&quot;https://github.com/davidsantiago/multifn-perf&quot;&gt;https://github.com/davidsantiago/multifn-perf&lt;/a&gt; &lt;/p&gt;</comment>
                    <comment id="29159" author="santiago" created="Tue, 14 Aug 2012 22:02:00 -0500"  >&lt;p&gt;It&apos;s been a couple of months, and so I just wanted to check in and see if there was anything else needed to move this along. &lt;/p&gt;

&lt;p&gt;Also, Alan Malloy pointed out to me that my benchmarks above did not mention single-threaded performance. I actually wrote this into the tests above, but I neglected to report them at the time. Here are the results on the same machine as above (multithreaded versions are basically the same as the previous comment). &lt;/p&gt;

&lt;p&gt;With a single thread performing the same work:&lt;br/&gt;
The lock-based multifns run at an average of 142ms. &lt;br/&gt;
The lockless multifns run at an average of 115ms. &lt;/p&gt;

&lt;p&gt;So the lockless multimethods are still faster even in a single-threaded case, although the speedup is more modest compared to the speedups in the multithreaded cases above. This is not surprising, but it is good to know.&lt;/p&gt;</comment>
                    <comment id="29213" author="stuart.sierra" created="Fri, 17 Aug 2012 14:58:06 -0500"  >&lt;p&gt;Screened. The approach is sound. &lt;/p&gt;

&lt;p&gt;I can confirm similar performance measurements using David Santiago&apos;s benchmark, compared with Clojure 1.5 master as of commit f5f4faf.&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;Mean runtime (ms) of a multimethod when called repeatedly from N threads:

|            | N=1 | N=2 | N=4 |
|------------+-----+-----+-----|
| 1.5 master |  80 | 302 | 765 |
| lockless   |  63 |  88 | 125 |&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;My only concern is that the extra allocations of the &lt;tt&gt;State&lt;/tt&gt; class will create more garbage, but this is probably not significant if we are already using persistent maps. It would be interesting to compare this implementation with one using thread-safe mutable data structures (e.g. ConcurrentHashMap) for the cache.&lt;/p&gt;</comment>
                    <comment id="29216" author="santiago" created="Fri, 17 Aug 2012 19:05:54 -0500"  >&lt;p&gt;I think your assessment that it&apos;s not significant compared to the current implementation using persistent maps is correct. Regarding the extra garbage, note that the new State is only created when the hierarchy has changed or there&apos;s a cache miss (related, obviously)... situations where you&apos;re already screwed. Then it won&apos;t have to happen again for the same method (until another change to the multimethod). So for most code, it won&apos;t happen very often. &lt;/p&gt;

&lt;p&gt;ConcurrentHashMap might be faster, it&apos;d be interesting to see. My instinct is to keep it as close to being &quot;made out of Clojure&quot; as possible. In fact, it&apos;s hard to see why this couldn&apos;t be rewritten in Clojure itself some day, as I believe Chas Emerick has suggested. Also, I would point out that two of the three maps are used from the Clojure side in core.clj. I assume they would be happier if they were persistent maps. &lt;/p&gt;

&lt;p&gt;Funny story: I was going to point out the parts of the code that were called from the clojure side just now, and alarmingly cannot find two of the functions. I think I must have misplaced them while rewriting the state into an immutable object. Going to attach a new patch with the fix and some tests for it in a few minutes.&lt;/p&gt;</comment>
                    <comment id="29218" author="santiago" created="Fri, 17 Aug 2012 19:44:54 -0500"  >&lt;p&gt;Latest patch for this issue. Supersedes issue988-lockless-multifn+tests.diff as of 08/17/2012.&lt;/p&gt;</comment>
                    <comment id="29219" author="santiago" created="Fri, 17 Aug 2012 19:49:13 -0500"  >&lt;p&gt;As promised, I reimplemented those two functions. I also added more multimethod tests to the test suite. The new tests should definitely prevent a similar mistake. While I was at it, I went through core.clj and found all the multimethod API functions I could and ensured that there were at least some basic functionality tests for all of them. The ones I found were: defmulti, defmethod, remove-all-methods, remove-method, prefer-method, methods, get-method, prefers (Some of those already had tests from the earlier version of the patch). &lt;/p&gt;

&lt;p&gt;Really sorry about catching this right after you vetted the patch. 12771 test assertions were apparently not affected by prefers and methods ceasing to function, but now there are 12780 to help prevent a similar error. Since you just went through it, I&apos;m leaving the older version of the patch up so you can easily see the difference to what I&apos;ve added. &lt;/p&gt;</comment>
                    <comment id="29448" author="richhickey" created="Sat, 15 Sep 2012 09:05:46 -0500"  >&lt;p&gt;&lt;a href=&quot;https://github.com/clojure/clojure/commit/83ebf814d5d6663c49c1b2d0d076b57638bff673&quot;&gt;https://github.com/clojure/clojure/commit/83ebf814d5d6663c49c1b2d0d076b57638bff673&lt;/a&gt; should fix these issues. The patch here was too much of a change to properly vet.&lt;/p&gt;

&lt;p&gt;If you could though, I&apos;d appreciate a patch with just the multimethod tests.&lt;/p&gt;</comment>
                    <comment id="29449" author="jafingerhut" created="Sat, 15 Sep 2012 10:59:01 -0500"  >&lt;p&gt;Patch clj-988-tests-only-patch-v1.txt dated Sep 15 2012 is a subset of David Santiago&apos;s &lt;br/&gt;
patch issue988-lockless-multifn+tests-120817.diff dated Aug 17 2012.  It includes only the tests from that patch.  Applies cleanly and passes tests with latest master after Rich&apos;s read/write lock change for multimethods was committed.&lt;/p&gt;</comment>
                    <comment id="29463" author="richhickey" created="Mon, 17 Sep 2012 09:20:43 -0500"  >&lt;p&gt;tests-only patch ok&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11498" name="clj-988-tests-only-patch-v1.txt" size="3569" author="jafingerhut" created="Sat, 15 Sep 2012 10:59:01 -0500" />
                    <attachment id="11441" name="issue988-lockless-multifn+tests-120817.diff" size="15875" author="santiago" created="Fri, 17 Aug 2012 19:44:54 -0500" />
                    <attachment id="11321" name="issue988-lockless-multifn+tests.diff" size="12422" author="santiago" created="Fri, 15 Jun 2012 04:45:58 -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-1071] ExceptionInfo does no abstraction</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1071</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;There oughtta be an interface&lt;/p&gt;</description>
                <environment></environment>
            <key id="15703">CLJ-1071</key>
            <summary>ExceptionInfo does no abstraction</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="-1">Unassigned</assignee>
                                <reporter username="stu">Stuart Halloway</reporter>
                        <labels>
                    </labels>
                <created>Mon, 17 Sep 2012 06:32:54 -0500</created>
                <updated>Fri, 21 Sep 2012 14:21:33 -0500</updated>
                    <resolved>Fri, 21 Sep 2012 14:21:33 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29481" author="stuart.sierra" created="Tue, 18 Sep 2012 08:44:10 -0500"  >&lt;p&gt;Screened.&lt;/p&gt;</comment>
                    <comment id="29482" author="fogus" created="Tue, 18 Sep 2012 08:46:36 -0500"  >&lt;p&gt;Looks fine to me.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11507" name="clj-1071-iexceptioninfo.patch" size="3738" author="stu" created="Mon, 17 Sep 2012 06:45:47 -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-940] Passing a non-sequence to refer :only results in uninformative exception</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-940</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Compiling the following code results in a &lt;tt&gt;Don&apos;t know how to create ISeq from: clojure.lang.Symbol&lt;/tt&gt; exception&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;code&lt;/tt&gt;&lt;br/&gt;
(ns clj14.myns&lt;br/&gt;
  (:use&lt;br/&gt;
   &lt;span class=&quot;error&quot;&gt;&amp;#91;clojure.core :only seq&amp;#93;&lt;/span&gt;))&lt;br/&gt;
&lt;tt&gt;code&lt;/tt&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15246">CLJ-940</key>
            <summary>Passing a non-sequence to refer :only results in uninformative exception</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="stuart.sierra">Stuart Sierra</assignee>
                                <reporter username="hugoduncan">Hugo Duncan</reporter>
                        <labels>
                    </labels>
                <created>Fri, 24 Feb 2012 12:20:40 -0600</created>
                <updated>Sat, 1 Sep 2012 08:37:48 -0500</updated>
                    <resolved>Sat, 1 Sep 2012 08:37:48 -0500</resolved>
                            <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="27922" author="jafingerhut" created="Fri, 9 Mar 2012 09:22:18 -0600"  >&lt;p&gt;Hugo, your patch doesn&apos;t apply cleanly to latest master due to some changed lines of context around it that are from before Nov 2011, which confuses me given that your patch was created recently.  I could mechanically update it, but if you could take a look and create an updated patch yourself it would be safer.&lt;/p&gt;</comment>
                    <comment id="28288" author="jafingerhut" created="Thu, 26 Apr 2012 19:36:12 -0500"  >&lt;p&gt;Patch clj-940-add-exception-for-non-sequence-in-refer-only-patch.txt dated Apr 26 2012 is same as Hugo Duncan&apos;s, except it applies cleanly to latest master as of today.&lt;/p&gt;</comment>
                    <comment id="29210" author="stuart.sierra" created="Fri, 17 Aug 2012 09:14:49 -0500"  >&lt;p&gt;Previous patch does not accurately reflect new &lt;tt&gt;:refer&lt;/tt&gt; syntax in &lt;tt&gt;ns&lt;/tt&gt;:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(:require [... :refer ...])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I offer a new patch, 0003-&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-940&quot; title=&quot;Passing a non-sequence to refer :only results in uninformative exception&quot;&gt;&lt;del&gt;CLJ-940&lt;/del&gt;&lt;/a&gt;-check-for-sequential.patch, as an alternative.&lt;/p&gt;

&lt;p&gt;This patch also checks for the more specific clojure.lang.Sequential instead of IPersistentCollection (which includes sets and maps).&lt;/p&gt;

&lt;p&gt;If I had my druthers, I&apos;d check for IPersistentList, but I can&apos;t face the screaming that would result.&lt;/p&gt;

&lt;p&gt;Neither patch provides file/line information in the error, but there isn&apos;t much affordance for that in core.clj right now.&lt;/p&gt;</comment>
                    <comment id="29239" author="aaron" created="Tue, 21 Aug 2012 10:57:07 -0500"  >&lt;p&gt;Applies cleanly against d4170e65d001c8c2976f1bd7159484056b9a9d6d. This looks good to me. We should at some point talk more about the implications of checking IPersistenList, but I think there is enough value here to push it forward.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10959" name="0001-add-exception-for-non-sequence-in-refer-only.diff" size="939" author="hugoduncan" created="Fri, 24 Feb 2012 12:20:40 -0600" />
                    <attachment id="11440" name="0003-CLJ-940-check-for-sequential.patch" size="1064" author="stuart.sierra" created="Fri, 17 Aug 2012 09:14:49 -0500" />
                    <attachment id="11114" name="clj-940-add-exception-for-non-sequence-in-refer-only-patch.txt" size="937" author="jafingerhut" created="Thu, 26 Apr 2012 19:36:12 -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-910] [Patch] Allow for type-hinting the method receiver in memfn</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-910</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The attached patch copies metadata given to the method name symbol of memfn to the method receiver in the expansion.  That way, memfn is able to be used even for type-hinted calls resulting in a big performance win.&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; (time (dotimes [i 1000000] ((memfn intValue) 1)))
Reflection warning, NO_SOURCE_FILE:1 - call to intValue can&apos;t be resolved.
&quot;Elapsed time: 2579.229115 msecs&quot;
nil
user&amp;gt; (time (dotimes [i 1000000] ((memfn ^Number intValue) 1)))
&quot;Elapsed time: 12.015235 msecs&quot;
nil
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15115">CLJ-910</key>
            <summary>[Patch] Allow for type-hinting the method receiver in memfn</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>performance</label>
                        <label>reflection</label>
                    </labels>
                <created>Fri, 13 Jan 2012 06:02:28 -0600</created>
                <updated>Sat, 1 Sep 2012 08:37:48 -0500</updated>
                    <resolved>Sat, 1 Sep 2012 08:37:48 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="27912" author="tsdh" created="Thu, 8 Mar 2012 03:56:20 -0600"  >&lt;p&gt;Updated patch.&lt;/p&gt;</comment>
                    <comment id="29245" author="aaron" created="Tue, 21 Aug 2012 18:06:49 -0500"  >&lt;p&gt;Applies properly against d4170e65d001c8c2976f1bd7159484056b9a9d6d. Things look good to me. &lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10985" name="0001-Make-memfn-allow-for-type-hinting-the-method-receive.patch" size="1168" author="tsdh" created="Thu, 8 Mar 2012 03:56:20 -0600" />
                </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-963] Support pretty printing namespace declarations under code-dispatch</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-963</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Currently when you print code with an (ns ) declaration in it, the ns declaration comes out kind of messy. This patch makes that beautiful. &lt;/p&gt;</description>
                <environment>all</environment>
            <key id="15307">CLJ-963</key>
            <summary>Support pretty printing namespace declarations under code-dispatch</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="tomfaulhaber">Tom Faulhaber</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Thu, 29 Mar 2012 20:38:10 -0500</created>
                <updated>Sat, 1 Sep 2012 08:37:48 -0500</updated>
                    <resolved>Sat, 1 Sep 2012 08:37:48 -0500</resolved>
                            <version>Release 1.2</version>
                <version>Release 1.3</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29260" author="stuart.sierra" created="Fri, 24 Aug 2012 08:30:19 -0500"  >&lt;p&gt;Screened.&lt;/p&gt;

&lt;p&gt;It&apos;s not perfect, but an improvement.&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; (with-pprint-dispatch code-dispatch (pprint &apos;(ns com.some-example.my-app (:require clojure.string [clojure.set :as set] [clojure.java.io :refer (file reader)]))))
(ns
  com.some-example.my-app
  (:require
    clojure.string
    [clojure.set :as set]
    [clojure.java.io :refer (file reader)]))
nil&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; (with-pprint-dispatch code-dispatch (pprint &apos;(ns com.some-example.my-app (:require clojure.string [clojure.set :as set] [clojure.java.io :refer (file reader)]))))
(ns com.some-example.my-app
  (:require clojure.string [clojure.set :as set]
            [clojure.java.io :refer (file reader)]))
nil&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11026" name="pprint-ns-patch.diff" size="9569" author="tomfaulhaber" created="Thu, 29 Mar 2012 20:38:11 -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>
                                                                                    <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-1034] &quot;Conflicting data-reader mapping&quot; triggered when the same data_readers.clj is on the classpath twice</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1034</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;If you have two data_readers.clj files on the classpath that agree with one another about the mapping of a given literal, Clojure still claims there is a conflict.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15601">CLJ-1034</key>
            <summary>&quot;Conflicting data-reader mapping&quot; triggered when the same data_readers.clj is on the classpath twice</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="technomancy">Phil Hagelberg</reporter>
                        <labels>
                    </labels>
                <created>Thu, 26 Jul 2012 16:04:32 -0500</created>
                <updated>Sat, 1 Sep 2012 08:37:48 -0500</updated>
                    <resolved>Sat, 1 Sep 2012 08:37:48 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>10</votes>
                        <watches>5</watches>
                        <comments>
                    <comment id="29126" author="jkkramer" created="Mon, 13 Aug 2012 09:59:43 -0500"  >&lt;p&gt;This comes up when using checkout dependencies in Leiningen. If the checked-out project contains data_readers.clj, Clojure will throw an exception.&lt;/p&gt;

&lt;p&gt;To reproduce:&lt;/p&gt;

&lt;p&gt;&lt;b&gt;user=&amp;gt;&lt;/b&gt; (spit &quot;/tmp/data_readers.clj&quot; &quot;{foo/bar foo.core/bar}&quot;)&lt;br/&gt;
&lt;em&gt;nil&lt;/em&gt;&lt;br/&gt;
&lt;b&gt;user=&amp;gt;&lt;/b&gt; (with-redefs [clojure.core/data-reader-urls (constantly &lt;span class=&quot;error&quot;&gt;&amp;#91;(java.net.URL. &amp;quot;file:/tmp/data_readers.clj&amp;quot;)&amp;#93;&lt;/span&gt;)] (#&apos;clojure.core/load-data-readers))&lt;br/&gt;
&lt;em&gt;{foo/bar #&apos;foo.core/bar}&lt;/em&gt;&lt;br/&gt;
&lt;b&gt;user=&amp;gt;&lt;/b&gt; (with-redefs [clojure.core/data-reader-urls (constantly &lt;span class=&quot;error&quot;&gt;&amp;#91;(java.net.URL. &amp;quot;file:/tmp/data_readers.clj&amp;quot;)&amp;#93;&lt;/span&gt;)] (#&apos;clojure.core/load-data-readers))&lt;br/&gt;
&lt;em&gt;ExceptionInfo Conflicting data-reader mapping  clojure.core/ex-info (core.clj:4227)&lt;/em&gt;&lt;/p&gt;</comment>
                    <comment id="29127" author="jkkramer" created="Mon, 13 Aug 2012 10:21:19 -0500"  >&lt;p&gt;Attached clj_1034_data_readers_fix.diff with simple fix: checks that new mappings actually point to different vars before claiming a conflict.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11421" name="clj_1034_data_readers_fix.diff" size="1383" author="jkkramer" created="Mon, 13 Aug 2012 10:21: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>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJ-828] clojure.core/bases returns a cons when passed a class and a Java array when passed an interface</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-828</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;clojure.core/bases returns a clojure.lang.Cons when called with a class as parameter, but a Java array ( [Ljava.lang.Class; &amp;#41; when called with an interface. Both should return values of the same type, which I guess should be a seq.&lt;/p&gt;

&lt;p&gt;Showing the problem at the REPL:&lt;br/&gt;
user=&amp;gt; (bases java.util.List)&lt;br/&gt;
#&amp;lt;Class[] [Ljava.lang.Class;@315b0333&amp;gt;&lt;br/&gt;
user=&amp;gt; (bases java.util.ArrayList)&lt;br/&gt;
(java.util.AbstractList java.util.List java.util.RandomAccess&lt;br/&gt;
java.lang.Cloneable java.io.Serializable) &lt;/p&gt;

&lt;p&gt;I have attached a patch which calls the seq function on the else part of clojure.core/bases. Also updated the clojure.test-clojure.java-interop/test-bases test. However these test do not currently seem to run as part of the maven build. I have however run the test manually and verified that it works.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14575">CLJ-828</key>
            <summary>clojure.core/bases returns a cons when passed a class and a Java array when passed an interface</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="stoyle">Alf Kristian St&#248;yle</reporter>
                        <labels>
                    </labels>
                <created>Mon, 15 Aug 2011 11:20:02 -0500</created>
                <updated>Sat, 18 Aug 2012 09:19:35 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:50:41 -0500</resolved>
                            <version>Release 1.2</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="27862" author="jafingerhut" created="Fri, 24 Feb 2012 19:29:50 -0600"  >&lt;p&gt;Behavior where bases returns Java array in some cases still exists on latest master, and this patch still applies cleanly and changes that behavior as described.&lt;/p&gt;

&lt;p&gt;The patch writer Alf is not on the list of people who have signed a CA.  If he isn&apos;t in the process of doing so, what should be done with the patch?  If I described the behavior to a committer without showing them the patch, they would likely come up with a similar one-line fix. &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="27867" author="stoyle" created="Sat, 25 Feb 2012 01:09:33 -0600"  >&lt;p&gt;I was not aware that contributors had to sign the CA to get a patch in when I wrote this, so my apologies for adding the patch. I just wanted to make the contribution an &quot;easy add&quot;. I guess you guys would have figured out a similar fix really easy.&lt;/p&gt;

&lt;p&gt;I am not in the process of signing the CA. I would not have any problems signing it, but then I guess for such a small contribution it would be too much of a hassle. And besides, I don&apos;t think this small contribution makes me a worthy contributor.&lt;/p&gt;

&lt;p&gt;I would certainly not mind you guys fixing this in anyway you can, with or without my patch.&lt;/p&gt;

&lt;p&gt;Cheers,&lt;br/&gt;
Alf&lt;/p&gt;</comment>
                    <comment id="27873" author="jafingerhut" created="Sat, 25 Feb 2012 11:58:53 -0600"  >&lt;p&gt;No apologies necessary for trying to improve the code, Alf.  We appreciate it.&lt;/p&gt;

&lt;p&gt;I agree it might be a bit of a hassle to sign a CA just for this fix.  Legally, a Clojure contributor is one whether anyone considers them &quot;worthy&quot; or not.&lt;/p&gt;

&lt;p&gt;We&apos;ll figure something out.&lt;/p&gt;</comment>
                    <comment id="28525" author="steveminer@gmail.com" created="Fri, 18 May 2012 15:38:55 -0500"  >&lt;p&gt;Independently written patch that fixes bases so that it always returns a seq.  Added additional tests to verify that it returns nil (rather than an empty seq) when there are no bases to maintain compatibility with the original code.&lt;/p&gt;</comment>
                    <comment id="29194" author="fogus" created="Thu, 16 Aug 2012 14:27:44 -0500"  >&lt;p&gt;Patch 0001-bases-should-return-a-seq-not-a-Java-array.patch from Steve Miner works as expected and is of acceptable quality.&lt;/p&gt;</comment>
                    <comment id="29220" author="steveminer@gmail.com" created="Sat, 18 Aug 2012 08:54:23 -0500"  >&lt;p&gt;I think commit 73f94cb8c7f60a131759b4488a3fefd6599d0328 took the wrong patch.  Stoyle said he did not have a CA. I wrote an independent patch which Fogus vetted.&lt;/p&gt;</comment>
                    <comment id="29221" author="stu" created="Sat, 18 Aug 2012 09:19:35 -0500"  >&lt;p&gt;Reverted wrong patch, applied correct patch. Thanks for watching my back, Steve.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11230" name="0001-bases-should-return-a-seq-not-a-Java-array.patch" size="1490" author="steveminer@gmail.com" created="Fri, 18 May 2012 15:38:55 -0500" />
                    <attachment id="10313" name="0001-Make-sure-the-clojure.core-bases-function-always-ret.patch" size="1601" author="stoyle" created="Mon, 15 Aug 2011 11:20:03 -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-745] gen-class should allow exposes-methods to expose protected final methods</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-745</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Currently, there is no way in Clojure to call a protected final method of a superclass.  While this may be an acceptable limitation for proxy, gen-class should provide that ability.  Otherwise, one is now forced to create a dummy subclass in Java for the sole purpose of widening the visibility of such methods.&lt;/p&gt;

&lt;p&gt;My patch makes it so that protected final methods may be exposed via the :exposes-methods mechanism.  It is still impossible to override them.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14359">CLJ-745</key>
            <summary>gen-class should allow exposes-methods to expose protected final methods</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="dsg">Daniel Solano G&#243;mez</reporter>
                        <labels>
                    </labels>
                <created>Fri, 25 Feb 2011 13:48:38 -0600</created>
                <updated>Sat, 18 Aug 2012 07:50:41 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:50:41 -0500</resolved>
                            <version>Release 1.2</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>2</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="27311" author="chouser@n01se.net" created="Sat, 19 Nov 2011 16:13:22 -0600"  >&lt;p&gt;Updated patch to apply cleanly to Clojure 1.4 SNAPSHOT.  Included tests look good and pass.&lt;/p&gt;</comment>
                    <comment id="29201" author="chouser@n01se.net" created="Thu, 16 Aug 2012 22:26:07 -0500"  >&lt;p&gt;Patch still applies, tests still pass.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10708" name="expose-protected-final-gen-class-clojure1.4.diff" size="5576" author="chouser@n01se.net" created="Sat, 19 Nov 2011 16:13:22 -0600" />
                    <attachment id="10120" name="expose-protected-final-gen-class.diff" size="5705" author="dsg" created="Fri, 25 Feb 2011 13:48:39 -0600" />
                </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-757] Empty transient maps/sets return wrong value for .contains</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-757</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;As explained in &lt;a href=&quot;http://groups.google.com/group/clojure/browse_thread/thread/496ffc7fb9058699/6e9d8152b6fd6365?show_docid=6e9d8152b6fd6365&quot;&gt;http://groups.google.com/group/clojure/browse_thread/thread/496ffc7fb9058699/6e9d8152b6fd6365?show_docid=6e9d8152b6fd6365&lt;/a&gt;, (.contains (transient #{}) :some-key) returns true instead of false. (contains? #{} :some-key) works properly, but the plain .contains method does not.&lt;/p&gt;

&lt;p&gt;The issue is in TransientHashMap.doValAt(key, notFound), and the attached patch is a simple fix with test.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14373">CLJ-757</key>
            <summary>Empty transient maps/sets return wrong value for .contains</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="-1">Unassigned</assignee>
                                <reporter username="amalloy">Alan Malloy</reporter>
                        <labels>
                    </labels>
                <created>Mon, 14 Mar 2011 15:53:28 -0500</created>
                <updated>Sat, 18 Aug 2012 07:50:41 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:50:41 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="26349" author="stu" created="Tue, 5 Apr 2011 20:59:02 -0500"  >&lt;p&gt;IIRC there are broader issues around lookup from transients. Should we look at this patch alone, or step back and review?&lt;/p&gt;</comment>
                    <comment id="26669" author="richhickey" created="Fri, 29 Jul 2011 07:44:13 -0500"  >&lt;p&gt;take the patch if it fixes the problem&lt;/p&gt;</comment>
                    <comment id="27809" author="jafingerhut" created="Thu, 23 Feb 2012 02:55:39 -0600"  >&lt;p&gt;clj-757-fix-behavior-of-empty-transient-maps-patch2.txt is an update of Alan&apos;s original patch, with no changes other than those required to apply cleanly to latest master as of Feb 22, 2012.  Compiles fine and runs without test errors, and does fix the behavior of the one new unit test included.&lt;/p&gt;</comment>
                    <comment id="27997" author="jafingerhut" created="Fri, 23 Mar 2012 18:30:59 -0500"  >&lt;p&gt;Approval was changed from Test to Incomplete when it was waiting on Rich&apos;s feedback.  He did give his feedback, but Approval never changed back to Test.  Doing that now in hopes it makes the ticket more accurately categorized by filters.  Feel free to give me a stern warning for mucking with the Approval field if I&apos;m out of line here.&lt;/p&gt;</comment>
                    <comment id="28862" author="jafingerhut" created="Mon, 18 Jun 2012 14:42:37 -0500"  >&lt;p&gt;clj-757-fix-behavior-of-empty-transient-maps-patch3.txt dated June 18, 2012 is identical to clj-757-fix-behavior-of-empty-transient-maps-patch2.txt, except it has some updated context lines so that it applies cleanly with latest Clojure master.  I will remove the -patch2.txt patch since it no longer applies cleanly.&lt;/p&gt;</comment>
                    <comment id="29211" author="fogus" created="Fri, 17 Aug 2012 09:56:18 -0500"  >&lt;p&gt;The patch in &lt;tt&gt;clj-757-fix-behavior-of-empty-transient-maps-patch3.txt&lt;/tt&gt; is straight-forward and so is its test.  This fixes only the behavior listed in the ticket and does not address the the general transient lookup behavior.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10147" name="0001-Fix-behavior-of-empty-transient-maps.patch" size="1309" author="amalloy" created="Mon, 14 Mar 2011 15:53:29 -0500" />
                    <attachment id="11335" name="clj-757-fix-behavior-of-empty-transient-maps-patch3.txt" size="1312" author="jafingerhut" created="Mon, 18 Jun 2012 14:42: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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJ-916] into loses metadata</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-916</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The into fn loses metadata.&lt;/p&gt;

&lt;p&gt;I&apos;m seeing some team members (myself included) rely on metadata. Metadata has been incredibly useful in some cases, however the silent destruction of metadata by core clojure fns (into, walk, etc) have been a source of increasing complexity and confusion. &lt;/p&gt;

&lt;p&gt;A team member could start relying on a 3rd party library that used &apos;into&apos;. Actually, the into fn could essentially be added to the code base at any time in many ways. Wrt metadata the potential for incidental complexity increases exponentially as more developers and libraries enter the mix. &lt;/p&gt;

&lt;p&gt;One of the reasons Clojure has worked for us so well is because it has greatly reduced incidental complexity.&lt;br/&gt;
IMHO the &apos;into metadata bug&apos; seriously limits the usefulness of metadata and would love to see the into fn fixed in 1.4.&lt;/p&gt;



</description>
                <environment></environment>
            <key id="15134">CLJ-916</key>
            <summary>into loses metadata</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="-1">Unassigned</assignee>
                                <reporter username="markswanson">Mark Swanson</reporter>
                        <labels>
                        <label>into</label>
                        <label>metadata</label>
                        <label>walk</label>
                    </labels>
                <created>Sat, 21 Jan 2012 11:58:29 -0600</created>
                <updated>Sat, 18 Aug 2012 07:50:41 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:50:41 -0500</resolved>
                            <version>Release 1.3</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>4</votes>
                        <watches>5</watches>
                        <comments>
                    <comment id="27899" author="jafingerhut" created="Thu, 1 Mar 2012 04:42:26 -0600"  >&lt;p&gt;Someone please correct this if it is wrong, but it seems that into loses metadata because it is implemented using transients, and transients lose metadata.  If true, then one way to fix this ticket is to implement metadata for transients.&lt;/p&gt;

&lt;p&gt;Are there any fundamental reasons why it would be difficult to add metadata to transients, as long as the metadata itself was immutable?&lt;/p&gt;</comment>
                    <comment id="27958" author="jafingerhut" created="Fri, 16 Mar 2012 04:57:42 -0500"  >&lt;p&gt;First rough cut of a patch that makes not only into, but also select-keys, clojure.set/project, and clojure.set/rename preserve metadata.  Added tests for these and many other functions.  Still some open questions about other functions not tested in comments.  This patch does not attempt to make transients preserve metadata.&lt;/p&gt;</comment>
                    <comment id="28001" author="jafingerhut" created="Fri, 23 Mar 2012 20:03:25 -0500"  >&lt;p&gt;clj-916-make-into-and-others-preserve-metadata-patch2.txt is semantically same patch and comments as March 16, 2012.  Merely touched up to apply cleanly to latest master as of Mar 23, 2012.&lt;/p&gt;</comment>
                    <comment id="28613" author="abrooks" created="Sat, 26 May 2012 22:58:00 -0500"  >&lt;p&gt;I just ran into this issue myself. Is there anything that I could do to help get this fixed? Test writing? Patch checks? I&apos;m happy to help in any way I can.&lt;/p&gt;</comment>
                    <comment id="28614" author="jafingerhut" created="Sun, 27 May 2012 01:11:15 -0500"  >&lt;p&gt;You could examine the existing patch, including its tests, and see if it would have done what you were hoping it would do.  Add a comment here regarding whether the changes look good to you.  The attached patch is already on my weekly list of prescreened patches, but it is only one among many.&lt;/p&gt;</comment>
                    <comment id="29180" author="fogus" created="Wed, 15 Aug 2012 13:14:46 -0500"  >&lt;p&gt;The code is clean and tests test what they should test.  Regarding the questions in the test file:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;I recommend (royal) we create another ticket for the remaining clojure.set functions and discuss them there.  Once resolved the questions in the metadata.clj test file should be removed.&lt;/li&gt;
&lt;/ul&gt;


&lt;ul&gt;
	&lt;li&gt;&lt;tt&gt;remove&lt;/tt&gt; returns a LazySeq, but the intent of the question is clear.  I vote that remove preserve metadata as well, but that should be the topic of yet another ticket.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;One final point. I&apos;d prefer that tickets be addressed in isolation and not contain extra fixes. This is a personal preference, but one that I&apos;d like to take up on the clojure-dev list.&lt;/p&gt;</comment>
                    <comment id="29191" author="jafingerhut" created="Thu, 16 Aug 2012 00:38:41 -0500"  >&lt;p&gt;clj-916-make-into-preserve-metadata-patch1.txt dated Aug 15 2012 only changes the behavior of into so that it preserves metadata.  One or more other tickets will be created for some other functions that currently do not preserve metadata, but perhaps should.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11006" name="clj-916-make-into-and-others-preserve-metadata-patch2.txt" size="7444" author="jafingerhut" created="Fri, 23 Mar 2012 20:03:25 -0500" />
                    <attachment id="11437" name="clj-916-make-into-preserve-metadata-patch1.txt" size="3811" author="jafingerhut" created="Thu, 16 Aug 2012 00:38:41 -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-870] clojure.string/replace behaves unexpectedly when \ or $ are part of the result string</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-870</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;clojure.string/replace uses javas replace function to do it&apos;s work, the replace function has the tricky habit of &apos;double evaluating&apos; the replacement string (third argument). This means that every \ in the string (so i.e. &quot;&lt;br clear=&quot;all&quot; /&gt;&quot;) is evaluated by the java code behind replace.&lt;/p&gt;

&lt;p&gt;Since this behavior isn&apos;t documented it can lead to confusing errors, for example (made up semi real world example to explain the issue):&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;(clojure.string/replace &quot;c:/windows/&quot; #&quot;/&quot; &quot;\\&quot;)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This should replace all unix folder separators with windows separators, this crashes with a index out of bound exemption since java tries to evaluate &quot;&lt;br clear=&quot;all&quot; /&gt;&quot; as a semi regexp.&lt;/p&gt;

&lt;p&gt;or&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;(println (str &quot;\&quot;&quot; (clojure.string/replace &quot;my string with \\ and \&quot; in it&quot; #&quot;[\&quot;\\]&quot; (fn [x] (str &quot;\\&quot; x))) &quot;\&quot;&quot;))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; 

&lt;p&gt;The expected result would be:&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;&quot;my string with \\ and \&quot; in it&quot;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; 
&lt;p&gt;the actual result is:&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;&quot;my string with \ and &quot; in it&quot;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This should return an &apos;escaped&apos; string, it does not since the &apos;double evaluation&apos; of the return string results in \\\\ being reduced to &lt;br clear=&quot;all&quot; /&gt; again.&lt;/p&gt;

</description>
                <environment>HW/OS/SW indipendant - issue is part of java interface</environment>
            <key id="14913">CLJ-870</key>
            <summary>clojure.string/replace behaves unexpectedly when \ or $ are part of the result string</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="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="licenser">Heinz N. Gies</reporter>
                        <labels>
                    </labels>
                <created>Fri, 4 Nov 2011 05:28:31 -0500</created>
                <updated>Sat, 18 Aug 2012 07:50:41 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:50:41 -0500</resolved>
                            <version>Release 1.2</version>
                <version>Release 1.3</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>2</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="27192" author="licenser" created="Fri, 4 Nov 2011 05:31:57 -0500"  >&lt;p&gt;A working code for the replace example is: &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;(println (str &quot;\&quot;&quot; (clojure.string/replace &quot;my string with \\ and \&quot; in it&quot; #&quot;[\&quot;\\]&quot; (fn [x] (str  &quot;\\\\&quot;  (if (= x &quot;\\&quot;) &quot;\\&quot;) x))) &quot;\&quot;&quot;))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;which is horribly ugly since you need to hand escape the backslash or it crashes.&lt;/p&gt;</comment>
                    <comment id="27448" author="stuart.sierra" created="Fri, 9 Dec 2011 15:31:41 -0600"  >&lt;p&gt;Vetted on 1.4.0 master. Needs patch.&lt;/p&gt;</comment>
                    <comment id="27511" author="amalloy" created="Thu, 5 Jan 2012 20:30:04 -0600"  >&lt;p&gt;No hand-escaping is necessary, just use #(java.util.regex.Matcher/quoteReplacement %).&lt;/p&gt;

&lt;p&gt;Edit: I see, we&apos;re talking about when you use a function as a replacement, not a replacement &lt;b&gt;string&lt;/b&gt; like &quot;&lt;br clear=&quot;all&quot; /&gt;x&quot; - the function&apos;s output should not be interpreted as regex replacement, I agree. Looks like it just needs a small patch in clojure.string/replace-by.&lt;/p&gt;</comment>
                    <comment id="27512" author="amalloy" created="Thu, 5 Jan 2012 20:53:14 -0600"  >&lt;p&gt;Patch and test for this issue.&lt;/p&gt;</comment>
                    <comment id="27513" author="jafingerhut" created="Fri, 6 Jan 2012 00:25:52 -0600"  >&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-870&quot; title=&quot;clojure.string/replace behaves unexpectedly when \ or $ are part of the result string&quot;&gt;&lt;del&gt;CLJ-870&lt;/del&gt;&lt;/a&gt;-also-fix-replace-first.patch combines Alan Malloy&apos;s two patches, and adds the same change for replace-first.  I like this change, too, and think replace and replace-first should be consistent with each other in this behavior.&lt;/p&gt;</comment>
                    <comment id="27514" author="jafingerhut" created="Fri, 6 Jan 2012 00:32:50 -0600"  >&lt;p&gt;If there is any interest in a combined patch for this issue, &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-753&quot; title=&quot;clojure.string/replace-first returns nil with replacement fn when regex doesn&amp;#39;t match&quot;&gt;&lt;del&gt;CLJ-753&lt;/del&gt;&lt;/a&gt; and &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-905&quot; title=&quot;clojure.string/replace-first treats \ and $ specially when match is a string, unlike clojure.string/replace&quot;&gt;&lt;del&gt;CLJ-905&lt;/del&gt;&lt;/a&gt; all in one, I&apos;d be happy to merge them.&lt;/p&gt;</comment>
                    <comment id="27543" author="jafingerhut" created="Thu, 12 Jan 2012 00:05:43 -0600"  >&lt;p&gt;Proposed combined patch for &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-753&quot; title=&quot;clojure.string/replace-first returns nil with replacement fn when regex doesn&amp;#39;t match&quot;&gt;&lt;del&gt;CLJ-753&lt;/del&gt;&lt;/a&gt;, &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-870&quot; title=&quot;clojure.string/replace behaves unexpectedly when \ or $ are part of the result string&quot;&gt;&lt;del&gt;CLJ-870&lt;/del&gt;&lt;/a&gt;, and &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-905&quot; title=&quot;clojure.string/replace-first treats \ and $ specially when match is a string, unlike clojure.string/replace&quot;&gt;&lt;del&gt;CLJ-905&lt;/del&gt;&lt;/a&gt;, since they all affect the behavior of clojure.string/replace and replace-first.&lt;/p&gt;</comment>
                    <comment id="27643" author="stuart.sierra" created="Fri, 3 Feb 2012 09:15:43 -0600"  >&lt;p&gt;The 1/12/2012 combined patch is not in correct format. Please recreate, see &lt;a href=&quot;http://clojure.org/patches&quot;&gt;http://clojure.org/patches&lt;/a&gt; for correct format.&lt;/p&gt;</comment>
                    <comment id="27652" author="jafingerhut" created="Sat, 4 Feb 2012 10:51:50 -0600"  >&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-753&quot; title=&quot;clojure.string/replace-first returns nil with replacement fn when regex doesn&amp;#39;t match&quot;&gt;&lt;del&gt;CLJ-753&lt;/del&gt;&lt;/a&gt;-870-905-combined-fix2.patch should have proper patch format.&lt;/p&gt;</comment>
                    <comment id="27884" author="jafingerhut" created="Tue, 28 Feb 2012 12:38:29 -0600"  >&lt;p&gt;Attaching slightly improved patch &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-753&quot; title=&quot;clojure.string/replace-first returns nil with replacement fn when regex doesn&amp;#39;t match&quot;&gt;&lt;del&gt;CLJ-753&lt;/del&gt;&lt;/a&gt;-870-905-combined-fix3.patch, along with a README to explain in gory detail the behavior and performance changes to clojure.string/replace and clojure.string/replace-first, in case it would help anyone review the changes.  Deleting my older patches.&lt;/p&gt;</comment>
                    <comment id="29153" author="aaron" created="Tue, 14 Aug 2012 20:44:20 -0500"  >&lt;p&gt;This is a small nit pick, but re-qr is a pretty non-descriptive name. Perhaps we could change it to re-quote-replacement?&lt;/p&gt;</comment>
                    <comment id="29175" author="jafingerhut" created="Wed, 15 Aug 2012 11:19:59 -0500"  >&lt;p&gt;Patches clj-753-870-905-combined-fix4.patch dated Aug 15 2012 and the patch that Aaron reviewed, &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-753&quot; title=&quot;clojure.string/replace-first returns nil with replacement fn when regex doesn&amp;#39;t match&quot;&gt;&lt;del&gt;CLJ-753&lt;/del&gt;&lt;/a&gt;-870-905-combined-fix3.patch dated Feb 28 2012, are almost identical.&lt;/p&gt;

&lt;p&gt;fix3 uses the name re-qr for a function, where fix4 uses the name re-quote-replacement.  I have no strong preference for either of them.&lt;/p&gt;</comment>
                    <comment id="29177" author="jafingerhut" created="Wed, 15 Aug 2012 11:23:30 -0500"  >&lt;p&gt;Added patch addressing what I think is Aaron&apos;s reason for changing state to Incomplete, so as a result I am changing state back to its former Vetted state.  If there is something else a non-screener should be doing to bring Incomplete tickets to the attention of screeners, please let me know, and I will document it here: &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="29188" author="stuart.sierra" created="Wed, 15 Aug 2012 14:42:33 -0500"  >&lt;p&gt;I will be looking at this.&lt;/p&gt;</comment>
                    <comment id="29209" author="stuart.sierra" created="Fri, 17 Aug 2012 07:55:59 -0500"  >&lt;p&gt;Screened. This is an adequate fix for this particular problem, given the current API.&lt;/p&gt;

&lt;p&gt;However, the long and complicated docstring proves that &lt;tt&gt;replace&lt;/tt&gt; and &lt;tt&gt;replace-first&lt;/tt&gt; should each be four separate functions:&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;code&lt;/tt&gt;&lt;br/&gt;
replace-char   &lt;span class=&quot;error&quot;&gt;&amp;#91;input char char&amp;#93;&lt;/span&gt;&lt;br/&gt;
replace-string &lt;span class=&quot;error&quot;&gt;&amp;#91;input string string&amp;#93;&lt;/span&gt;&lt;br/&gt;
replace-re     &lt;span class=&quot;error&quot;&gt;&amp;#91;input pattern string&amp;#93;&lt;/span&gt;&lt;br/&gt;
replace-re-by  &lt;span class=&quot;error&quot;&gt;&amp;#91;input pattern fn&amp;#93;&lt;/span&gt;&lt;br/&gt;
&lt;tt&gt;code&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;This is how these functions were originally written back in the days of clojure.contrib.str-utils. This would be a minor breaking change.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10760" name="0001-Add-tests-for-870.patch" size="964" author="amalloy" created="Thu, 5 Jan 2012 20:53:14 -0600" />
                    <attachment id="10761" name="0002-Fix-870-by-using-quoteReplacement.patch" size="1205" author="amalloy" created="Thu, 5 Jan 2012 20:53:14 -0600" />
                    <attachment id="10971" name="CLJ-753-870-905-combined-fix3.patch" size="8936" author="jafingerhut" created="Tue, 28 Feb 2012 12:38:29 -0600" />
                    <attachment id="10972" name="CLJ-753-870-905-combined-fix3.readme.txt" size="3571" author="jafingerhut" created="Tue, 28 Feb 2012 12:38:29 -0600" />
                    <attachment id="11434" name="clj-753-870-905-combined-fix4.patch" size="9071" author="jafingerhut" created="Wed, 15 Aug 2012 11:19:59 -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>
                                                                                    <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-909] Make LineNumberingPushbackReader&apos;s buffer size configurable</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-909</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;In some situations, it&apos;s necessary to configure the buffer size of LineNumberingPushbackReader&apos;s wrapped java.io.LineNumberReader, that gets created in the constructor. A concrete problem case is where you want to avoid doing reads from the underlying Reader whenever possible, so using a buffer size of 1 makes it a bit lazier. I can also imagine cases where you&apos;d want to &lt;b&gt;increase&lt;/b&gt; the buffer from java.io.BufferedReader&apos;s 8192-char default, but I haven&apos;t dealt with that one directly.&lt;/p&gt;

&lt;p&gt;There&apos;s no good way to do this by subclassing LineNumberingPushbackReader, since all the action happens in the constructors: those of java.io.LineNumberReader and the superclass of LineNumberingPushbackReader, which is java.io.PushbackReader. So my current workaround is to copy the entirety of LineNumberingPushbackReader, change the name, and add a constructor. Having LineNumberingPushbackReader support this directly would be great.&lt;/p&gt;

&lt;p&gt;Both java.io.LineNumberReader and java.io.PushbackReader have constructors that accept the buffer size as the second argument, so it seems very reasonable to me to add a similar constructor for LineNumberingPushbackReader.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15111">CLJ-909</key>
            <summary>Make LineNumberingPushbackReader&apos;s buffer size configurable</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="trptcolin">Colin Jones</reporter>
                        <labels>
                    </labels>
                <created>Wed, 11 Jan 2012 19:16:40 -0600</created>
                <updated>Sat, 18 Aug 2012 07:50:41 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:50:41 -0500</resolved>
                            <version>Release 1.2</version>
                <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27607" author="trptcolin" created="Sun, 22 Jan 2012 18:56:50 -0600"  >&lt;p&gt;This patch still works great.&lt;/p&gt;

&lt;p&gt;Turns out my current workaround to get around the lack of this ability has a problem: LispReader depends on the concrete LineNumberingPushbackReader class to be able to call .getLineNumber (via instanceof / casting). So the similar (read: nearly-copied) class I&apos;m trying to use can&apos;t store line numbers, which makes the stack trace less nice (fwiw, this is in REPL-y: &lt;a href=&quot;https://github.com/trptcolin/reply&quot;&gt;https://github.com/trptcolin/reply&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;It would be nice to have an interface (ILineNumberingPushbackReader?) that declares getLineNumber, readLine, and atLineStart,  and have things check instanceof on that instead of the concrete class. That way, anyone else adhering to the LineNumberingPushbackReader contract (in order to bind that to &amp;#42;in&amp;#42; as the docstring for `clojure.main/repl` prescribes) can do it and have line numbering play nicely with the Clojure reader.&lt;/p&gt;

&lt;p&gt;If that sounds desirable, I can replace this patch. The existing patch will also work fine if we want to keep things concrete, or if that feels enough like solving a different problem to require another ticket.&lt;/p&gt;</comment>
                    <comment id="29181" author="fogus" created="Wed, 15 Aug 2012 13:49:59 -0500"  >&lt;p&gt;The patch looks fine.&lt;/p&gt;

&lt;p&gt;Regarding the larger question of an interface I&apos;d say another ticket is in order. The existence of LNPBR is an implementation detail, but I too have found it useful.  Maybe there is a wider discussion on the usefulness of LNPBR and a sane way to expose it for tool, compiler, etc. devs?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10767" name="0001-Allow-custom-buffer-size-in-LineNumberingPushbackRea.patch" size="929" author="trptcolin" created="Wed, 11 Jan 2012 19:16:40 -0600" />
                </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-932] contains? should throw exception on non-keyed collections</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-932</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The &lt;tt&gt;contains?&lt;/tt&gt; function, given a collection which is not an associative (Map, Set, String, array), returns false instead of throwing an exception.&lt;/p&gt;

&lt;p&gt;This is a subject of confusion when people call &lt;tt&gt;contains?&lt;/tt&gt; on sequential collections like lists, and on associative collections which do not implement the &lt;tt&gt;Associative&lt;/tt&gt; interface.&lt;/p&gt;

&lt;p&gt;Other predicates, such as &lt;tt&gt;even?&lt;/tt&gt;, throw an exception when passed arguments of an invalid type.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15229">CLJ-932</key>
            <summary>contains? should throw exception on non-keyed collections</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="stuart.sierra">Stuart Sierra</assignee>
                                <reporter username="stuart.sierra">Stuart Sierra</reporter>
                        <labels>
                    </labels>
                <created>Fri, 17 Feb 2012 15:19:20 -0600</created>
                <updated>Sat, 18 Aug 2012 07:50:41 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:50:41 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="27759" author="stuart.sierra" created="Fri, 17 Feb 2012 15:30:57 -0600"  >&lt;p&gt;Patch adds fix, adds some tests, and removes tests reflecting the old behavior.&lt;/p&gt;</comment>
                    <comment id="29178" author="aaron" created="Wed, 15 Aug 2012 12:31:03 -0500"  >&lt;p&gt;This seems to be working properly, but what about vectors?&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;(contains? [1 2 3] 3)
;-&amp;gt; false
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29179" author="jafingerhut" created="Wed, 15 Aug 2012 12:40:46 -0500"  >&lt;p&gt;The doc string for contains? covers the vector and Java array case explicitly.  I&apos;m not saying that this behavior shouldn&apos;t change, but at least it is well documented what it currently does in these cases.&lt;/p&gt;</comment>
                    <comment id="29182" author="aaron" created="Wed, 15 Aug 2012 14:03:53 -0500"  >&lt;p&gt;Agreed. I just want to make sure that we are still ok with this functionality given that things are changing. Are there others (Stuart) that want to chime in here and make the intentions clear? If this is good then I would consider this screened and ready.&lt;/p&gt;</comment>
                    <comment id="29185" author="stuart.sierra" created="Wed, 15 Aug 2012 14:40:02 -0500"  >&lt;p&gt;Vector is Associative, so supporting &lt;tt&gt;contains?&lt;/tt&gt; is valid even if it does not do what people might expect:&lt;/p&gt;

&lt;div class=&quot;code panel&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; (contains? [:a :b :c] 2)
&lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;
user=&amp;gt; (contains? [:a :b :c] 7)
&lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;All I&apos;m trying to change here is have &lt;tt&gt;contains?&lt;/tt&gt; throw an exception if the argument is &lt;b&gt;not&lt;/b&gt; Associative. The current behavior (returning false) was hiding a bug in my code.&lt;/p&gt;

&lt;p&gt;I do not consider this a breaking change. I believe the docstring of &lt;tt&gt;contains?&lt;/tt&gt; leaves room for this interpretation, but Rich will have the final say.&lt;/p&gt;</comment>
                    <comment id="29187" author="aaron" created="Wed, 15 Aug 2012 14:42:30 -0500"  >&lt;p&gt;Perfect. I just wanted to make sure that this was intended.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10921" name="CLJ-932-0001.patch" size="1809" author="stuart.sierra" created="Fri, 17 Feb 2012 15:30:57 -0600" />
                </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-966] Add support for marker protocols</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-966</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The attached patch adds support to marker protocols, for example&lt;/p&gt;

&lt;p&gt;(defprotocol Sequential&lt;br/&gt;
&quot;marker protocol indicating a sequential type&quot;)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15316">CLJ-966</key>
            <summary>Add support for marker protocols</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="bronsa">Nicola Mometto</reporter>
                        <labels>
                    </labels>
                <created>Thu, 5 Apr 2012 07:16:52 -0500</created>
                <updated>Sat, 18 Aug 2012 07:50:41 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:50:41 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>2</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28086" author="jonase" created="Sat, 7 Apr 2012 13:20:28 -0500"  >&lt;p&gt;Marker protocols are supported and used in ClojureScript.&lt;/p&gt;</comment>
                    <comment id="29183" author="hiredman" created="Wed, 15 Aug 2012 14:23:44 -0500"  >&lt;p&gt;what are the uses for marker protocols? I know there are marker interfaces in java, but is it a pattern we want to carry forward?&lt;/p&gt;</comment>
                    <comment id="29186" author="fogus" created="Wed, 15 Aug 2012 14:40:36 -0500"  >&lt;p&gt;Nice and simple.  Tested with:&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 P (hi [_]))
(defprotocol M)
(deftype T [a] M P (hi [_] &quot;hi there&quot;))
(satisfies? P (T. 1))
(satisfies? M (T. 1))
(hi (T. 1))
(defprotocol M2 &quot;marker for 2&quot;)
(extend-type T M2)
(satisfies? M2 (T. 1))
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Similar tests are included in the additional patch file as test cases. This additional patch file should be applied after the feature&apos;s main patch file.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11436" name="CLJ-966-additional-marker-tests-APPLY-AFTER.diff" size="2487" author="fogus" created="Wed, 15 Aug 2012 14:40:36 -0500" />
                    <attachment id="11029" name="marker-protocols.diff" size="4971" author="bronsa" created="Thu, 5 Apr 2012 07:16:52 -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-923] Reading ratios prefixed by + is not working</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-923</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;In general Clojure&apos;s number types can be read prefixed with either a +&lt;br/&gt;
or - and this seems to work correctly for reading integers and floats.&lt;br/&gt;
In the case of ratios however things break down when ratios are&lt;br/&gt;
prefixed with a +.&lt;/p&gt;

&lt;p&gt;The ratio pattern in LispReader.java does match on ratios starting&lt;br/&gt;
with both + and - but matchNumber fails on ratios prefixed with +&lt;br/&gt;
because it ends up calling &quot;new BigInteger(m.group(1))&quot; and it turns&lt;br/&gt;
out the constructor for BigInteger has no problems with negative&lt;br/&gt;
numbers but it doesn&apos;t like numbers prefixed by a +.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15159">CLJ-923</key>
            <summary>Reading ratios prefixed by + is not working</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="-1">Unassigned</assignee>
                                <reporter username="cosmin">Cosmin Stejerean</reporter>
                        <labels>
                    </labels>
                <created>Fri, 3 Feb 2012 18:06:54 -0600</created>
                <updated>Sat, 18 Aug 2012 07:12:53 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:12:52 -0500</resolved>
                            <version>Release 1.2</version>
                <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27645" author="cosmin" created="Fri, 3 Feb 2012 18:26:09 -0600"  >&lt;p&gt;added patch with fix and tests&lt;/p&gt;</comment>
                    <comment id="27854" author="hiredman" created="Fri, 24 Feb 2012 16:02:26 -0600"  >&lt;p&gt;changes to the reader tests on master cause 0001-added-tests-for-reading-ratios-and-fixed-reading-of-.patch to no longer apply cleanly&lt;/p&gt;</comment>
                    <comment id="27856" author="jafingerhut" created="Fri, 24 Feb 2012 16:21:55 -0600"  >&lt;p&gt;clj-923-reading-ratios-prefixed-by-plus-patch.txt applies cleanly to latest as of Feb 24, 2012 (2:20 PM PST &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="28000" author="jafingerhut" created="Fri, 23 Mar 2012 19:55:54 -0500"  >&lt;p&gt;clj-923-reading-ratios-prefixed-by-plus-patch2.txt still semantically same as Cosmin&apos;s original patch, except it applies, builds, and tests cleanly on latest master as of Mar 23, 2012.  Context lines around patch must have changed recently.&lt;/p&gt;</comment>
                    <comment id="28002" author="cosmin" created="Fri, 23 Mar 2012 20:07:23 -0500"  >&lt;p&gt;Thanks for updating the patch. I&apos;ve removed the original to make it clear which one we need.&lt;/p&gt;</comment>
                    <comment id="29157" author="aaron" created="Tue, 14 Aug 2012 21:33:29 -0500"  >&lt;p&gt;Patch applies cleanly against 4004d267e124f12b65b0d7fb6522f32a75e3c4fb. Submitter is a confirmed CA signer.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11005" name="clj-923-reading-ratios-prefixed-by-plus-patch2.txt" size="1897" author="jafingerhut" created="Fri, 23 Mar 2012 19:55:54 -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-1041] reduce-kv on sorted maps should stop on seeing a Reduced value</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1041</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The current implementation is dereferencing Reduced and returning them up the chain; but that means that parent nodes don&apos;t know the reduction has completed, so the reduction might continue along other paths down the tree.&lt;/p&gt;

&lt;p&gt;This patch touches the same areas of code as &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1040&quot; title=&quot;reduce-kv on sorted maps should reduce, in sorted order&quot;&gt;&lt;del&gt;CLJ-1040&lt;/del&gt;&lt;/a&gt; so will have conflicts if both patches are merged separately. However, as noted in my comment on &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1040&quot; title=&quot;reduce-kv on sorted maps should reduce, in sorted order&quot;&gt;&lt;del&gt;CLJ-1040&lt;/del&gt;&lt;/a&gt;, I don&apos;t think the patch there is correct yet, so I&apos;ve also included a commit (7beb14256) to fix the issue in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1040&quot; title=&quot;reduce-kv on sorted maps should reduce, in sorted order&quot;&gt;&lt;del&gt;CLJ-1040&lt;/del&gt;&lt;/a&gt;. Thus, this patch can be merged independently of 1040&apos;s patch, solving both issues without a merge conflict.&lt;/p&gt;

&lt;p&gt;This patch also includes tests for both issues, which fail before my commits are applied, and pass afterwards.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15622">CLJ-1041</key>
            <summary>reduce-kv on sorted maps should stop on seeing a Reduced value</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="-1">Unassigned</assignee>
                                <reporter username="amalloy">Alan Malloy</reporter>
                        <labels>
                    </labels>
                <created>Fri, 10 Aug 2012 15:17:49 -0500</created>
                <updated>Sat, 18 Aug 2012 07:12:53 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:12:53 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="29144" author="aaron" created="Tue, 14 Aug 2012 19:46:39 -0500"  >&lt;p&gt;Patch applies cleanly against 4004d267e124f12b65b0d7fb6522f32a75e3c4fb. Submitter confirmed on the CA list.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11420" name="sorted-map-kvreduce.patch" size="4081" author="amalloy" created="Fri, 10 Aug 2012 15:17:49 -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-977] (int \a) returns a value, (long \a) throws an exception</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-977</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;As described in the summary, calling (long ...) on a character throws a ClassCastException.  I know the semantics surrounding numbers has changed a bit, but I think it would be nice for this to be consistent.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15374">CLJ-977</key>
            <summary>(int \a) returns a value, (long \a) throws an exception</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="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="ztellman">Zach Tellman</reporter>
                        <labels>
                    </labels>
                <created>Sat, 28 Apr 2012 03:09:50 -0500</created>
                <updated>Sat, 18 Aug 2012 07:12:53 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:12:53 -0500</resolved>
                            <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28484" author="scottlowe" created="Sat, 12 May 2012 22:45:29 -0500"  >&lt;p&gt;Attached a patch. 0001-&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-977&quot; title=&quot;(int \a) returns a value, (long \a) throws an exception&quot;&gt;&lt;del&gt;CLJ-977&lt;/del&gt;&lt;/a&gt;-int-a-returns-a-value-long-a-throws-an-excep.patch 13/May/12&lt;/p&gt;</comment>
                    <comment id="29148" author="aaron" created="Tue, 14 Aug 2012 20:11:48 -0500"  >&lt;p&gt;Patch applies cleanly against 4004d267e124f12b65b0d7fb6522f32a75e3c4fb. Submitter is a confirmed CA signer.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11211" name="0001-CLJ-977-int-a-returns-a-value-long-a-throws-an-excep.patch" size="850" author="scottlowe" created="Sat, 12 May 2012 22:45:29 -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-1009] make print-table org mode compatible</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1009</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description></description>
                <environment></environment>
            <key id="15521">CLJ-1009</key>
            <summary>make print-table org mode compatible</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="stu">Stuart Halloway</assignee>
                                <reporter username="stu">Stuart Halloway</reporter>
                        <labels>
                    </labels>
                <created>Fri, 8 Jun 2012 13:18:30 -0500</created>
                <updated>Sat, 18 Aug 2012 07:12:53 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:12:53 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>2</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28760" author="jafingerhut" created="Fri, 8 Jun 2012 22:39:28 -0500"  >&lt;p&gt;Patch clj-1009-print-table-org-mode-patch2.txt dated June 8, 2012 is the same as Stuart Halloway&apos;s print-table-org-mode.txt of the same date, except a couple of tests have been added.  His code changes look correct to me.&lt;/p&gt;</comment>
                    <comment id="29149" author="aaron" created="Tue, 14 Aug 2012 20:22:44 -0500"  >&lt;p&gt;This is not quite correct. the header separator in org-mode is &lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;|--+--+--|&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; not &lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;+--+--+&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;</comment>
                    <comment id="29168" author="jafingerhut" created="Wed, 15 Aug 2012 10:29:30 -0500"  >&lt;p&gt;clj-1009-print-table-org-mode-patch3.txt dated Aug 15, 2012 is same as the previous -patch2.txt version of Jun 8, 2012 (now deleted as obsolete), except it corrects the header separator as identified by Aaron Bedra.&lt;/p&gt;</comment>
                    <comment id="29169" author="jafingerhut" created="Wed, 15 Aug 2012 10:31:48 -0500"  >&lt;p&gt;Presumptuously changing approval from Incomplete back to Vetted, as it was before Aaron Bedra described a problem with the patch, and I updated the patch to address his comment.  Feel free to apply the smackdown if necessary. &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="29172" author="aaron" created="Wed, 15 Aug 2012 10:44:50 -0500"  >&lt;p&gt;Looks ok now. Three cheers for org-mode awesomeness!!!&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11431" name="clj-1009-print-table-org-mode-patch3.txt" size="3402" author="jafingerhut" created="Wed, 15 Aug 2012 10:29:30 -0500" />
                    <attachment id="11302" name="print-table-org-mode.txt" size="2034" author="stu" created="Fri, 8 Jun 2012 13:18:30 -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-964] test-clojure/rt.clj has undeclared dependency on clojure.set</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-964</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;In test-clojure/rt.clj, the test last-var-wins-for-core evaluates #&apos;clojure.set/subset?.  This fails unless clojure.set has been loaded.  In the normal run of the test suite, this dependency is satisfied by test-clojure/core-set being loaded first.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15311">CLJ-964</key>
            <summary>test-clojure/rt.clj has undeclared dependency on clojure.set</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="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="dmiller">David Miller</reporter>
                        <labels>
                        <label>test</label>
                    </labels>
                <created>Sat, 31 Mar 2012 13:40:16 -0500</created>
                <updated>Sat, 18 Aug 2012 07:12:53 -0500</updated>
                    <resolved>Sat, 18 Aug 2012 07:12:53 -0500</resolved>
                            <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28066" author="jafingerhut" created="Sat, 31 Mar 2012 20:47:35 -0500"  >&lt;p&gt;clj-964-add-require-of-clojure-set-patch1.txt dated March 31, 2012 applies cleanly as of latest master.  It simply adds a require of clojure.set to test_clojure/rt.clj.  I verified that if that test was the only one, it does fail without the require, and passes with it.  I also verified that every other test file succeeds on its own without any further changes.&lt;/p&gt;</comment>
                    <comment id="29150" author="aaron" created="Tue, 14 Aug 2012 20:30:55 -0500"  >&lt;p&gt;Patch applies cleanly against 4004d267e124f12b65b0d7fb6522f32a75e3c4fb. Submitter is a confirmed CA signer.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11028" name="clj-964-add-require-of-clojure-set-patch1.txt" size="679" author="jafingerhut" created="Sat, 31 Mar 2012 20:47:35 -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-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-1012] partial function should also accept 1 arg (just f)</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1012</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The partial function should accept just a function. This allows it to be properly used with apply.&lt;/p&gt;

&lt;p&gt;E.g. This breaks (but shouldn&apos;t) if args are nil: (apply partial f args)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15529">CLJ-1012</key>
            <summary>partial function should also accept 1 arg (just f)</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="kanaka">Joel Martin</reporter>
                        <labels>
                    </labels>
                <created>Tue, 12 Jun 2012 14:28:13 -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.4</version>
                <version>Release 1.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28792" author="hircus" created="Wed, 13 Jun 2012 05:18:28 -0500"  >&lt;p&gt;Attached patch makes partial just returns f if called with only one argument. Not sure if this will have a performance impact or not; a Clojure/core member would probably be able to better judge if the use cases outweigh any performance hit.&lt;/p&gt;</comment>
                    <comment id="29173" author="fogus" created="Wed, 15 Aug 2012 10:45:58 -0500"  >&lt;p&gt;Attached a patch adding a test for this ticket.&lt;/p&gt;</comment>
                    <comment id="29174" author="fogus" created="Wed, 15 Aug 2012 10:47:43 -0500"  >&lt;p&gt;Original patch is trivial, but did not have a test. I added a test as a separate patch file.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11315" name="0001-Extend-partial-function-to-also-handle-one-argument-.patch" size="762" author="hircus" created="Wed, 13 Jun 2012 05:18:28 -0500" />
                    <attachment id="11433" name="CLJ-1012-partial-1-arity-test.diff" size="825" author="fogus" created="Wed, 15 Aug 2012 10:45:57 -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-1019] ns-resolve doc has a typo</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1019</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The doc string for ns-resolve has a typo: environement should be environment.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15560">CLJ-1019</key>
            <summary>ns-resolve doc has a typo</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="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="cldwalker">Gabriel Horner</reporter>
                        <labels>
                        <label>documentation</label>
                    </labels>
                <created>Sat, 30 Jun 2012 09:10:00 -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.5</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28980" author="jafingerhut" created="Thu, 12 Jul 2012 12:54:11 -0500"  >&lt;p&gt;clj-1019-ns-resolve-doc-string-misspelling-patch1.txt dated July 12, 2012 is identical to fix_ns-resolve.patch of June 30, 2012, except it is in git format.  It includes Gabriel&apos;s name and email address for proper attribution.&lt;/p&gt;</comment>
                    <comment id="29147" author="aaron" created="Tue, 14 Aug 2012 20:07:17 -0500"  >&lt;p&gt;Patch applies cleanly against 4004d267e124f12b65b0d7fb6522f32a75e3c4fb. Submitter is a confirmed CA signer.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11378" name="clj-1019-ns-resolve-doc-string-misspelling-patch1.txt" size="860" author="jafingerhut" created="Thu, 12 Jul 2012 12:54:11 -0500" />
                    <attachment id="11355" name="fix_ns-resolve.patch" size="540" author="cldwalker" created="Sat, 30 Jun 2012 09:10:00 -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-820] int coercion doesn&apos;t work in clojure 1.3</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-820</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Using the clojure git head as of 2011-07-14 (commit f704853751d02faf72bd53be599ee0be6c1da63e), int coercion doesn&apos;t work:&lt;/p&gt;

&lt;p&gt;user&amp;gt; (class (int 1))&lt;br/&gt;
java.lang.Long&lt;/p&gt;

&lt;p&gt;byte, short, double, and float coercion work fine, though:&lt;/p&gt;

&lt;p&gt;user&amp;gt; (class (byte 1))&lt;br/&gt;
java.lang.Byte&lt;br/&gt;
user&amp;gt; (class (short 1))&lt;br/&gt;
java.lang.Short&lt;br/&gt;
user&amp;gt; (class (double 1))&lt;br/&gt;
java.lang.Double&lt;br/&gt;
user&amp;gt; (class (float 1))&lt;br/&gt;
java.lang.Float&lt;/p&gt;

&lt;p&gt;Also creating integers directly works fine:&lt;/p&gt;

&lt;p&gt;user&amp;gt; (class (Integer. &quot;100&quot;))&lt;br/&gt;
java.lang.Integer&lt;br/&gt;
user&amp;gt; (class (Integer/valueOf 1))&lt;br/&gt;
java.lang.Integer&lt;br/&gt;
user&amp;gt; (class (Integer. 100))&lt;br/&gt;
java.lang.Integer&lt;/p&gt;

&lt;p&gt;This is probably related to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-439&quot; title=&quot;Automatic type translation from Integer to Long&quot;&gt;&lt;del&gt;CLJ-439&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;</description>
                <environment>Gentoo GNU/Linux</environment>
            <key id="14490">CLJ-820</key>
            <summary>int coercion doesn&apos;t work in clojure 1.3</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tsdh">Tassilo Horn</reporter>
                        <labels>
                    </labels>
                <created>Thu, 14 Jul 2011 08:05:40 -0500</created>
                <updated>Fri, 20 Jul 2012 16:54:48 -0500</updated>
                    <resolved>Fri, 20 Jul 2012 16:54:48 -0500</resolved>
                            <version>Release 1.3</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="26571" author="paraseba" created="Fri, 15 Jul 2011 14:33:57 -0500"  >&lt;p&gt;Related documentation here: &lt;a href=&quot;http://dev.clojure.org/display/doc/Enhanced+Primitive+Support&quot;&gt;http://dev.clojure.org/display/doc/Enhanced+Primitive+Support&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;all long-or-smaller integers are boxed as Long&lt;br/&gt;
You can&apos;t use primitive coercions to force specific box types&lt;br/&gt;
Your code was broken if you were relying on that&lt;/p&gt;

&lt;p&gt;So, apparently (int) has the correct behavior. It&apos;s byte and short which should be also boxed into Longs&lt;/p&gt;</comment>
                    <comment id="26572" author="paraseba" created="Fri, 15 Jul 2011 14:34:24 -0500"  >&lt;p&gt;See also this topic in clojure-dev: &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/fXQAYv8s0tQ/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/fXQAYv8s0tQ/discussion&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="26573" author="tsdh" created="Fri, 15 Jul 2011 15:00:20 -0500"  >&lt;p&gt;So to call some Java method that requires an int you have to use Integer/valueOf?&lt;/p&gt;</comment>
                    <comment id="26574" author="paraseba" created="Fri, 15 Jul 2011 15:46:02 -0500"  >&lt;p&gt;Yes, I think so&lt;/p&gt;</comment>
                    <comment id="26575" author="tsdh" created="Fri, 15 Jul 2011 16:16:11 -0500"  >&lt;p&gt;But for what are the coercion functions now good for?  I mean, &lt;a href=&quot;http://clojure.org/java_interop#Java&quot;&gt;http://clojure.org/java_interop#Java&lt;/a&gt; Interop-Coercions states:&lt;/p&gt;

&lt;p&gt;  &quot;At times it is necessary to have a value of a particular primitive type. These coercion functions yield a value of the indicated type as long as such a coercion is possible: bigdec bigint boolean byte char double float int long num short&quot;&lt;/p&gt;

&lt;p&gt;That&apos;s exactly my use case which is not supported anymore.&lt;/p&gt;</comment>
                    <comment id="26576" author="paraseba" created="Fri, 15 Jul 2011 23:09:37 -0500"  >&lt;p&gt;(int) (char) etc. are not intended to return boxed types, they always return primitive types. If you want boxed types you can use (num). When you do (class (int 42)) you are casting the long 42 to a int and then boxing it into a Long to get its class.&lt;/p&gt;

&lt;p&gt;For short and byte, I don&apos;t know, I think there is a bug, (class (short 42)) should be Short.&lt;/p&gt;</comment>
                    <comment id="26577" author="tsdh" created="Sat, 16 Jul 2011 07:13:07 -0500"  >&lt;p&gt;&lt;cite&gt;(int) (char) etc. are not intended to return boxed types, they always return primitive types.&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Thank you, Sebasti&#225;n, that made it clear and unveiled the problem at my side.  When I did&lt;/p&gt;

&lt;p&gt;  &lt;tt&gt;(set-value! foo :position (int 17))&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;I got the exception &quot;java.lang.Long cannot be cast to java.lang.Integer&quot;.  set-value! is a protocol function extended on the java types of the java library I&apos;m interacting with.  Eventually, it&apos;ll call &lt;tt&gt;(doto foo (.setAttribute &quot;position&quot; (mutable &amp;lt;providedVal&amp;gt;))&lt;/tt&gt;, where mutable is yet another protocol function that converts clojure collections to the libraries counterparts and does nothing for primitive types.&lt;/p&gt;

&lt;p&gt;Now, although (int 17) returns an unboxed int, these two indirections box it into a Long again and the java setter is called with that leading to the error.&lt;/p&gt;

&lt;p&gt;  &lt;tt&gt;(set-value! foo :position (Integer/intValue 17))&lt;/tt&gt;&lt;/p&gt;

&lt;p&gt;circumvents the issue, because here you directly get an int boxed as Integer.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;If you want boxed types you can use (num).&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Well, I want a boxed value of a certain type, like Integer.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;For short and byte, I don&apos;t know, I think there is a bug, (class (short 42)) should be Short.&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;Should or should not?  Currently, for all primitive types &amp;lt;primType&amp;gt;, the call &lt;tt&gt;(class (&amp;lt;primType&amp;gt; &amp;lt;val&amp;gt;))&lt;/tt&gt; returns the wrapper class corresponding to &amp;lt;primType&amp;gt; with the exception of int where you get a Long instead of an Integer.  That&apos;s totally surprising and caused me to file this bug report.&lt;/p&gt;</comment>
                    <comment id="28611" author="hircus" created="Sat, 26 May 2012 12:55:00 -0500"  >&lt;p&gt;This is fixed in 1.4.0 &amp;#8211; could one of the screeners confirm this, and maybe close the issue?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJ-844] NPE calling keyword on map from bean</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-844</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Calling a keyword on a map returned from clojure.core/bean causes a null pointer exception if the keyword is not a key in the map:&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (:a (bean {}))&lt;br/&gt;
java.lang.NullPointerException (NO_SOURCE_FILE:0)&lt;br/&gt;
user=&amp;gt; (.printStackTrace *e)&lt;br/&gt;
Caused by: java.lang.NullPointerException&lt;br/&gt;
	at clojure.core$bean$v__4765.invoke(core_proxy.clj:385)&lt;br/&gt;
	at clojure.core$bean$fn__4786.invoke(core_proxy.clj:394)&lt;br/&gt;
	at clojure.core.proxy$clojure.lang.APersistentMap$0.valAt(Unknown Source)&lt;br/&gt;
	at clojure.lang.KeywordLookupSite.fault(KeywordLookupSite.java:33)&lt;br/&gt;
	at user$eval1062.invoke(NO_SOURCE_FILE:7)&lt;br/&gt;
	at clojure.lang.Compiler.eval(Compiler.java:5424)&lt;br/&gt;
	... 9 more&lt;/p&gt;

&lt;p&gt;The object returned by bean claims to be an APersistentMap FWIW:&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (class (bean {}))&lt;br/&gt;
clojure.core.proxy$clojure.lang.APersistentMap$0&lt;/p&gt;</description>
                <environment></environment>
            <key id="14648">CLJ-844</key>
            <summary>NPE calling keyword on map from bean</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="steveminer@gmail.com">Steve Miner</assignee>
                                <reporter username="technomancy">Phil Hagelberg</reporter>
                        <labels>
                    </labels>
                <created>Tue, 27 Sep 2011 19:00:37 -0500</created>
                <updated>Fri, 15 Jun 2012 11:09:26 -0500</updated>
                    <resolved>Fri, 15 Jun 2012 11:09:26 -0500</resolved>
                            <version>Release 1.2</version>
                <version>Release 1.3</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>2</votes>
                        <watches>5</watches>
                        <comments>
                    <comment id="26909" author="stu" created="Fri, 7 Oct 2011 09:41:57 -0500"  >&lt;p&gt;Bean needs a full overhaul. In my ideal world it would be deprecated out of core into some other namespace.&lt;/p&gt;</comment>
                    <comment id="26914" author="lprefontaine" created="Fri, 7 Oct 2011 23:59:14 -0500"  >&lt;p&gt;If you can sketch a bit what you have in mind, I might give it a try.&lt;br/&gt;
I have some time available and went through the pending issues, this one seems within&lt;br/&gt;
my reach.&lt;/p&gt;</comment>
                    <comment id="28189" author="steveminer@gmail.com" created="Fri, 20 Apr 2012 13:09:05 -0500"  >&lt;p&gt;The current work-around is to use a default arg like this:&lt;/p&gt;

&lt;p&gt;(:a my-bean nil)&lt;/p&gt;

&lt;p&gt;It works, but it&apos;s inconvenient and adds complexity to the handling of bean maps.&lt;/p&gt;

&lt;p&gt;Normal maps of course already return nil as the default value for a missing key.  The current bean proxy does the contains? check on the key only if there&apos;s a default value.  The patch uses the same contains? check for the single-arg version of valAt.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11069" name="0001-CLJ-844-NPE-calling-keyword-on-map-from-bean.patch" size="1432" author="steveminer@gmail.com" created="Fri, 20 Apr 2012 13:09:05 -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-943] When load-lib fails, a namespace is still created</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-943</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;When requiring a namespace that doesn&apos;t compile, a namespace is still created. The attached patch removes the namespace on failure if the namespace wasn&apos;t already present on entry to load-lib. See the test case in the patch for repro instructions.&lt;/p&gt;

&lt;p&gt;This is obviously a subset of having atomic loads. Would a step further in this direction, e.g. using a swapable state object within clojure.lang.Namespace be of interest?&lt;/p&gt;</description>
                <environment></environment>
            <key id="15255">CLJ-943</key>
            <summary>When load-lib fails, a namespace is still created</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="-1">Unassigned</assignee>
                                <reporter username="hugoduncan">Hugo Duncan</reporter>
                        <labels>
                    </labels>
                <created>Thu, 1 Mar 2012 19:30:47 -0600</created>
                <updated>Fri, 15 Jun 2012 11:09:26 -0500</updated>
                    <resolved>Fri, 15 Jun 2012 11:09:26 -0500</resolved>
                            <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28755" author="stu" created="Fri, 8 Jun 2012 15:17:56 -0500"  >&lt;p&gt;Why catch Exception, not Throwable?&lt;/p&gt;</comment>
                    <comment id="28756" author="stu" created="Fri, 8 Jun 2012 15:23:33 -0500"  >&lt;p&gt;This patch accomplishes its purpose, although (in the absence of fully atomic load) I would imagine it creates a race condition if one thread tried to load a broken namespace while another thread tried simply to create a namespace.&lt;/p&gt;

&lt;p&gt;Marked screened anyway...&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10977" name="0001-Remove-namespace-if-load-lib-fails-and-namespace-did.patch" size="2899" author="hugoduncan" created="Thu, 1 Mar 2012 19:30:47 -0600" />
                </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-667] Allow loops fully nested in catch/finally</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-667</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;~/clj-git/clojure $ java -cp clojure.jar clojure.main&lt;br/&gt;
Clojure 1.3.0-alpha2-SNAPSHOT&lt;br/&gt;
user=&amp;gt; (try (catch Exception e (loop &lt;span class=&quot;error&quot;&gt;&amp;#91;x 0&amp;#93;&lt;/span&gt; (recur x))))&lt;br/&gt;
CompilerException java.lang.UnsupportedOperationException: Cannot recur from catch/finally, compiling:(NO_SOURCE_PATH:1) &lt;br/&gt;
user=&amp;gt; (try (finally (loop &lt;span class=&quot;error&quot;&gt;&amp;#91;x 0&amp;#93;&lt;/span&gt; (if false (recur x)))))&lt;br/&gt;
CompilerException java.lang.UnsupportedOperationException: Cannot recur from catch/finally, compiling:(NO_SOURCE_PATH:2) &lt;/p&gt;

&lt;p&gt;With attached patch (should also fix &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-31&quot; title=&quot;GC Issue 27: Disallow recur across try&quot;&gt;&lt;del&gt;CLJ-31&lt;/del&gt;&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;~/clj-head/clojure $ java -cp clojure.jar clojure.main&lt;br/&gt;
Clojure 1.3.0-alpha2-SNAPSHOT&lt;br/&gt;
user=&amp;gt; (try (catch Exception e (loop &lt;span class=&quot;error&quot;&gt;&amp;#91;x 0&amp;#93;&lt;/span&gt; (recur x))))&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; (try (finally (loop &lt;span class=&quot;error&quot;&gt;&amp;#91;x 0&amp;#93;&lt;/span&gt; (if false (recur x)))))&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; (loop &lt;span class=&quot;error&quot;&gt;&amp;#91;x 0&amp;#93;&lt;/span&gt; (try (if false (recur x))))&lt;br/&gt;
CompilerException java.lang.UnsupportedOperationException: Can only recur from tail position, compiling:(NO_SOURCE_PATH:3) &lt;br/&gt;
user=&amp;gt; (loop &lt;span class=&quot;error&quot;&gt;&amp;#91;x 0&amp;#93;&lt;/span&gt; (try (catch Exception e (recur x))))&lt;br/&gt;
CompilerException java.lang.UnsupportedOperationException: Can only recur from tail position, compiling:(NO_SOURCE_PATH:4) &lt;br/&gt;
user=&amp;gt; (loop &lt;span class=&quot;error&quot;&gt;&amp;#91;x 0&amp;#93;&lt;/span&gt; (try (finally (recur x))))&lt;br/&gt;
CompilerException java.lang.UnsupportedOperationException: Can only recur from tail position, compiling:(NO_SOURCE_PATH:5)&lt;/p&gt;</description>
                <environment></environment>
            <key id="14269">CLJ-667</key>
            <summary>Allow loops fully nested in catch/finally</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="jarpiain">Juha Arpiainen</reporter>
                        <labels>
                    </labels>
                <created>Sun, 31 Oct 2010 12:51:15 -0500</created>
                <updated>Fri, 15 Jun 2012 11:09:26 -0500</updated>
                    <resolved>Fri, 15 Jun 2012 11:09:26 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>4</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="27861" author="jafingerhut" created="Fri, 24 Feb 2012 18:47:18 -0600"  >&lt;p&gt;clj-667-allow-loop-recur-nested-in-catch-and-finally-patch2.txt applies cleanly to latest master as of Feb 24, 2012.&lt;/p&gt;

&lt;p&gt;I cannot vouch for the changes in Compiler.java &amp;#8211; I simply modified what was in Juha Arpiainen&apos;s patch so that they applied cleanly.  Some of the context changed noticeably due to a patch for &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-31&quot; title=&quot;GC Issue 27: Disallow recur across try&quot;&gt;&lt;del&gt;CLJ-31&lt;/del&gt;&lt;/a&gt; by Kevin Downey that was applied.&lt;/p&gt;

&lt;p&gt;The test parts of the patch I can vouch for.  Some of the previously existing tests seem not to test what they should.  I can make a separate patch with just the updated passing tests if that is desired.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10010" name="0001-Allow-loop-recur-nested-in-catch-and-finally.patch" size="2440" author="jarpiain" created="Sun, 31 Oct 2010 12:51:15 -0500" />
                    <attachment id="10963" name="clj-667-allow-loop-recur-nested-in-catch-and-finally-patch2.txt" size="8177" author="jafingerhut" created="Fri, 24 Feb 2012 18:47:18 -0600" />
                </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-768] cl-format bug in ~f formatting</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-768</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Carlos Ungil reports a bug in cl-format as follows (&lt;a href=&quot;http://groups.google.com/group/clojure/browse_thread/thread/bb235ff4464aed78#):&quot;&gt;http://groups.google.com/group/clojure/browse_thread/thread/bb235ff4464aed78#):&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hello,&lt;/p&gt;

&lt;p&gt;I don&apos;t know if there is a better way to file bug reports (if there is one,&lt;br/&gt;
it&apos;s not easy to find).&lt;/p&gt;

&lt;p&gt;(use &apos;clojure.pprint)&lt;/p&gt;

&lt;p&gt;(let &lt;span class=&quot;error&quot;&gt;&amp;#91;x 111.11111&amp;#93;&lt;/span&gt;&lt;br/&gt;
  (doseq [fmt &lt;span class=&quot;error&quot;&gt;&amp;#91;&amp;quot;~3f~%&amp;quot; &amp;quot;~4f~%&amp;quot; &amp;quot;~5f~%&amp;quot; &amp;quot;~6f~%&amp;quot;&amp;#93;&lt;/span&gt;]&lt;br/&gt;
    (cl-format true fmt x)))&lt;/p&gt;

&lt;p&gt;;; 111.11111&lt;br/&gt;
;; 111.11111&lt;br/&gt;
;; 111.1&lt;br/&gt;
;; 111.11&lt;/p&gt;

&lt;p&gt;There is clearly a problem in the first two cases, too many digits are being&lt;br/&gt;
printed.&lt;/p&gt;

&lt;p&gt;For reference, this is what common lisp does:&lt;/p&gt;

&lt;p&gt;(let ((x 111.11111))&lt;br/&gt;
  (loop for fmt  in &apos;(&quot;&lt;sub&gt;3f&lt;/sub&gt;%&quot; &quot;&lt;sub&gt;4f&lt;/sub&gt;%&quot; &quot;&lt;sub&gt;5f&lt;/sub&gt;%&quot; &quot;&lt;sub&gt;6f&lt;/sub&gt;%&quot;)&lt;br/&gt;
do (format t fmt x)))&lt;/p&gt;

&lt;p&gt;;; 111.&lt;br/&gt;
;; 111.&lt;br/&gt;
;; 111.1&lt;br/&gt;
;; 111.11&lt;/p&gt;

&lt;p&gt;Cheers,&lt;/p&gt;

&lt;p&gt;Carlos &lt;/p&gt;</description>
                <environment></environment>
            <key id="14392">CLJ-768</key>
            <summary>cl-format bug in ~f formatting</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="jafingerhut">Andy Fingerhut</assignee>
                                <reporter username="tomfaulhaber">Tom Faulhaber</reporter>
                        <labels>
                    </labels>
                <created>Tue, 5 Apr 2011 01:08:42 -0500</created>
                <updated>Fri, 15 Jun 2012 11:09:26 -0500</updated>
                    <resolved>Fri, 15 Jun 2012 11:09:26 -0500</resolved>
                            <version>Release 1.2</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27711" author="jafingerhut" created="Mon, 13 Feb 2012 21:49:54 -0600"  >&lt;p&gt;Attached patch assumes that &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-881&quot; title=&quot;Problem with the &amp;quot;cl-format&amp;quot; function from the clojure.pprint&quot;&gt;&lt;del&gt;CLJ-881&lt;/del&gt;&lt;/a&gt; patch has been applied.  It might apply cleanly without &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-881&quot; title=&quot;Problem with the &amp;quot;cl-format&amp;quot; function from the clojure.pprint&quot;&gt;&lt;del&gt;CLJ-881&lt;/del&gt;&lt;/a&gt; patch being applied first &amp;#8211; I haven&apos;t checked.  Fixes the issue originally reported, and several other problems found with cl-format&apos;s ~f directive.&lt;/p&gt;</comment>
                    <comment id="27739" author="tomfaulhaber" created="Fri, 17 Feb 2012 09:26:21 -0600"  >&lt;p&gt;I&apos;ve reviewed the patch and it looks good to me. Thanks, Andy!&lt;/p&gt;

&lt;p&gt;To clojure/core: please go ahead and accept this patch.&lt;/p&gt;</comment>
                    <comment id="27742" author="jafingerhut" created="Fri, 17 Feb 2012 13:33:52 -0600"  >&lt;p&gt;Thanks for the review, Tom.  If you have the time, &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-881&quot; title=&quot;Problem with the &amp;quot;cl-format&amp;quot; function from the clojure.pprint&quot;&gt;&lt;del&gt;CLJ-881&lt;/del&gt;&lt;/a&gt; is shorter, and fixes a different bug.  I do know that if you apply the &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-881&quot; title=&quot;Problem with the &amp;quot;cl-format&amp;quot; function from the clojure.pprint&quot;&gt;&lt;del&gt;CLJ-881&lt;/del&gt;&lt;/a&gt; recommended patch, and then this one, everything works fine.  If it is helpful, I can try out this one independently, but they are both bugs in the ~f format of cl-format, the other one causing Clojure to throw an exception for some combinations of ~f directives and numerical values.&lt;/p&gt;</comment>
                    <comment id="27810" author="jafingerhut" created="Thu, 23 Feb 2012 03:30:26 -0600"  >&lt;p&gt;clj-768-without-clj-881-patched-first.txt is the same as the one that Tom reviewed, except it applies cleanly to master as of Feb 23, 2012 without having to first apply the patch for &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-881&quot; title=&quot;Problem with the &amp;quot;cl-format&amp;quot; function from the clojure.pprint&quot;&gt;&lt;del&gt;CLJ-881&lt;/del&gt;&lt;/a&gt;.  This bug and the patch are really independent of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-881&quot; title=&quot;Problem with the &amp;quot;cl-format&amp;quot; function from the clojure.pprint&quot;&gt;&lt;del&gt;CLJ-881&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;</comment>
                    <comment id="28534" author="jafingerhut" created="Sat, 19 May 2012 01:03:51 -0500"  >&lt;p&gt;clj-768-patch-for-after-clj-881-fixed-patch2.txt dated May 18, 2012 is the most up to date one as of the latest updates to Clojure master.  Only context line changes from previous patches so that it applies cleanly, not substantive changes.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11232" name="clj-768-patch-for-after-clj-881-fixed-patch2.txt" size="7847" author="jafingerhut" created="Sat, 19 May 2012 01:03:51 -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-897] deftype error message is misleading not useful</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-897</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;If you forget to include the argument vector for deftype, i.e.&lt;/p&gt;

&lt;p&gt;(deftype second-request-handler&lt;br/&gt;
  HttpServer.RequestHandler&lt;br/&gt;
  (canRespond &lt;span class=&quot;error&quot;&gt;&amp;#91;this request&amp;#93;&lt;/span&gt; true)&lt;br/&gt;
  (getResponse &lt;span class=&quot;error&quot;&gt;&amp;#91;this request&amp;#93;&lt;/span&gt; nil))&lt;/p&gt;

&lt;p&gt;which should be...&lt;/p&gt;

&lt;p&gt;(deftype second-request-handler []&lt;br/&gt;
  HttpServer.RequestHandler&lt;br/&gt;
  (canRespond &lt;span class=&quot;error&quot;&gt;&amp;#91;this request&amp;#93;&lt;/span&gt; true)&lt;br/&gt;
  (getResponse &lt;span class=&quot;error&quot;&gt;&amp;#91;this request&amp;#93;&lt;/span&gt; nil))&lt;/p&gt;

&lt;p&gt;I get the error message..&lt;/p&gt;

&lt;p&gt;Don&apos;t know how to create ISeq from: clojure.lang.Symbol (main.clj:1)&lt;/p&gt;

&lt;p&gt;When in fact the error is coming from (second-request-handler.clj:3). Can this error message be improved and give the actually location of the error?&lt;/p&gt;</description>
                <environment>OS X</environment>
            <key id="15071">CLJ-897</key>
            <summary>deftype error message is misleading not useful</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="mylesmegyesi">Myles Megyesi</reporter>
                        <labels>
                    </labels>
                <created>Wed, 14 Dec 2011 08:46:44 -0600</created>
                <updated>Fri, 15 Jun 2012 11:09:26 -0500</updated>
                    <resolved>Fri, 15 Jun 2012 11:09:26 -0500</resolved>
                            <version>Release 1.3</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27490" author="tsdh" created="Fri, 23 Dec 2011 04:28:59 -0600"  >&lt;p&gt;The problem is that deftype and defrecord use destructuring in the argument vector, so the error pops up before the macro is actually running.&lt;/p&gt;

&lt;p&gt;The attached patch removes the destructuring form (but keeps the nice syntax in :arglists) and adds a vector? check to validate-fields.&lt;/p&gt;

&lt;p&gt;All tests pass, and the example above now errors with &quot;AssertionError No fields vector given.&quot;&lt;/p&gt;</comment>
                    <comment id="27987" author="jafingerhut" created="Fri, 23 Mar 2012 02:40:46 -0500"  >&lt;p&gt;Changing Patch attribute to &quot;Code&quot;.&lt;/p&gt;</comment>
                    <comment id="28287" author="jafingerhut" created="Thu, 26 Apr 2012 19:29:18 -0500"  >&lt;p&gt;clj-897-deftype-error-message-is-misleading-patch.txt dated Apr 26 2012 is the same as Tassilo Horn&apos;s patch, except it is updated to apply cleanly to latest master as of today.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10753" name="0001-Fix-CLJ-897-Don-t-use-descructuring-in-defrecord-def.patch" size="1908" author="tsdh" created="Fri, 23 Dec 2011 04:28:59 -0600" />
                    <attachment id="11113" name="clj-897-deftype-error-message-is-misleading-patch.txt" size="1872" author="jafingerhut" created="Thu, 26 Apr 2012 19:29:18 -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-934] disj! throws exception when attempting to remove multiple items in one call</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-934</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;disj! fails whenever called with multiple items to remove:&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (-&amp;gt; #{5 10 15 20} transient (disj! 10 15) persistent!)&lt;br/&gt;
ClassCastException clojure.lang.PersistentHashSet$TransientHashSet cannot be cast to clojure.lang.IPersistentSet  clojure.core/disj (core.clj:1419)&lt;/p&gt;

&lt;p&gt;It is a simple one line fix to disj! Clojure source code to correct this.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15236">CLJ-934</key>
            <summary>disj! throws exception when attempting to remove multiple items in one call</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="jafingerhut">Andy Fingerhut</reporter>
                        <labels>
                    </labels>
                <created>Tue, 21 Feb 2012 02:10:48 -0600</created>
                <updated>Fri, 15 Jun 2012 11:09:26 -0500</updated>
                    <resolved>Fri, 15 Jun 2012 11:09:26 -0500</resolved>
                            <version>Release 1.2</version>
                <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27919" author="jafingerhut" created="Fri, 9 Mar 2012 09:02:01 -0600"  >&lt;p&gt;clj-934-transient-disj-patch2.txt fixes a problem with my previous one where it had a warning during testing because of a poorly named test that conflicted with a name in clojure.core.  This one is clean.&lt;/p&gt;</comment>
                    <comment id="28744" author="stu" created="Fri, 8 Jun 2012 10:37:20 -0500"  >&lt;p&gt;Patch 3 is same as patch 2, but nonreflective invocation.&lt;/p&gt;</comment>
                    <comment id="28745" author="jafingerhut" created="Fri, 8 Jun 2012 10:42:34 -0500"  >&lt;p&gt;Removed older patch in favor of Stuart&apos;s improved one clj-934-transient-disj-patch-3.txt dated June 8, 2012.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11300" name="clj-934-transient-disj-patch-3.txt" size="2313" author="stu" created="Fri, 8 Jun 2012 10:37:20 -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-981] clojure.set/rename-keys deletes keys when there&apos;s a collision</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-981</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;(set/rename-keys {:a &quot;one&quot; :b &quot;two&quot; :c &quot;three&quot;} {:a :b :b :a}) returns {:b &quot;one&quot; :c &quot;three&quot;}&lt;br/&gt;
should be {:a &quot;two&quot; :b &quot;one&quot; :c &quot;three&quot;}&lt;/p&gt;

&lt;p&gt;I have created a pull request for a fix, here: &lt;a href=&quot;https://github.com/clojure/clojure/pull/23&quot;&gt;https://github.com/clojure/clojure/pull/23&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15405">CLJ-981</key>
            <summary>clojure.set/rename-keys deletes keys when there&apos;s a collision</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="ed.bowler@gmail.com">Ed Bowler</reporter>
                        <labels>
                    </labels>
                <created>Fri, 4 May 2012 12:35:32 -0500</created>
                <updated>Fri, 15 Jun 2012 11:09:26 -0500</updated>
                    <resolved>Fri, 15 Jun 2012 11:09:26 -0500</resolved>
                            <version>Release 1.3</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28386" author="ed.bowler@gmail.com" created="Fri, 4 May 2012 13:31:19 -0500"  >&lt;p&gt;added fix&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11167" name="rename-keys-fix.patch" size="1689" author="ed.bowler@gmail.com" created="Fri, 4 May 2012 13:31: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-763] Do not use hash-map constructor in destructuring to avoid multiple key check.</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-763</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;What I did:&lt;/p&gt;

&lt;div class=&quot;code panel&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 number-to-string
  [&amp;amp; {fmt :format locale :locale :or {locale (Locale/getDefault)}}]
  (fn [v]
    (&lt;span class=&quot;code-object&quot;&gt;String&lt;/span&gt;/format locale fmt (to-array [v]))))

(defn &lt;span class=&quot;code-object&quot;&gt;double&lt;/span&gt;-to-string
  [&amp;amp; options]
  (apply number-to-string :format &lt;span class=&quot;code-quote&quot;&gt;&quot;%f&quot;&lt;/span&gt; options))

(def us-number (&lt;span class=&quot;code-object&quot;&gt;double&lt;/span&gt;-to-string :locale Locale/US))
(def legacy-number (&lt;span class=&quot;code-object&quot;&gt;double&lt;/span&gt;-to-string :format &lt;span class=&quot;code-quote&quot;&gt;&quot;% 3.2f&quot;&lt;/span&gt;))

(us-number 3.14159)
(legacy-number 3.14159)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What I expected:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;&lt;span class=&quot;code-quote&quot;&gt;&quot;3.14159&quot;&lt;/span&gt;
&lt;span class=&quot;code-quote&quot;&gt;&quot;  3,14&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What I got:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;java.lang.IllegalArgumentException: Duplicate key: :format&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Using &lt;tt&gt;into&lt;/tt&gt; or a combination of &lt;tt&gt;reduce&lt;/tt&gt; and &lt;tt&gt;assoc&lt;/tt&gt; instead of &lt;tt&gt;hash-map&lt;/tt&gt; would allow this without breaking things.&lt;/p&gt;

&lt;p&gt;If this is a desired modification, I can provide a patch. (CA is filed.)&lt;/p&gt;</description>
                <environment>Clojure versions 1.2 and above</environment>
            <key id="14379">CLJ-763</key>
            <summary>Do not use hash-map constructor in destructuring to avoid multiple key check.</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="1">Completed</resolution>
                                <assignee username="mbrandmeyer">Meikel Brandmeyer</assignee>
                                <reporter username="mbrandmeyer">Meikel Brandmeyer</reporter>
                        <labels>
                    </labels>
                <created>Mon, 21 Mar 2011 04:23:43 -0500</created>
                <updated>Fri, 18 May 2012 20:37:21 -0500</updated>
                    <resolved>Fri, 18 May 2012 20:37:21 -0500</resolved>
                            <version>Release 1.2</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="26326" author="mbrandmeyer" created="Mon, 21 Mar 2011 13:43:59 -0500"  >&lt;p&gt;Build map in destructuring step by step instead of calling hash-map.&lt;/p&gt;</comment>
                    <comment id="28018" author="jafingerhut" created="Mon, 26 Mar 2012 18:43:02 -0500"  >&lt;p&gt;clj-763-destructuring-allow-dup-keys-patch2.txt dated Mar 26, 2012 applies cleanly to latest master and passes all tests, including a new one added based upon Meikel&apos;s report that fails without his fix.  Supersedes his earlier patch 0001-Avoid-duplicate-key-check-in-destructuring.patch of Mar 21, 2011.  Meikel and I have both signed CAs.&lt;/p&gt;</comment>
                    <comment id="28134" author="richhickey" created="Fri, 13 Apr 2012 09:29:17 -0500"  >&lt;p&gt;I&apos;m happy to see this improved, but it has to be fast. into + partition is not fast enough down here. Probably should instead call non-checking map ctor&lt;/p&gt;</comment>
                    <comment id="28246" author="mbrandmeyer" created="Mon, 23 Apr 2012 18:08:48 -0500"  >&lt;p&gt;Map destructuring without duplicate check with test case&lt;/p&gt;</comment>
                    <comment id="28247" author="mbrandmeyer" created="Mon, 23 Apr 2012 18:10:31 -0500"  >&lt;p&gt;Uploaded &lt;tt&gt;0001-Do-not-check-for-duplicates-in-destructuring-map-cre.patch&lt;/tt&gt; with a faster implementation accessing the unchecked constructor directly plus a simplified test case. Supersedes the two previous patches. (I can delete only mine, but not Andy&apos;s.)&lt;/p&gt;</comment>
                    <comment id="28265" author="jafingerhut" created="Tue, 24 Apr 2012 19:39:00 -0500"  >&lt;p&gt;Removing patch clj-763-destructuring-allow-dup-keys-patch2.txt dated Mar 26 2012 in favor of Meikel&apos;s Apr 23 2012 patch, which fixes the problem in a faster way, and its test is more straightforward.&lt;/p&gt;</comment>
                    <comment id="28277" author="mbrandmeyer" created="Wed, 25 Apr 2012 14:30:37 -0500"  >&lt;p&gt;Deleted obsolete patch.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11100" name="0001-Do-not-check-for-duplicates-in-destructuring-map-cre.patch" size="1608" author="mbrandmeyer" created="Mon, 23 Apr 2012 18:08: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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJ-867] Records of different types with the same data have the same hashcodes, even though they are not considered to be equal</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-867</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Records which contain the same field values are not considered to be equal, but the record type is not currently included in the hash.  This means that if an heterogenous map contains records of different types, where the fields aren&apos;t necessarily distinct, there is a high likelyhood of hash collisions.&lt;/p&gt;

&lt;p&gt;I propose that the record type should be included in the hash code algorithm for records.  There should be no expectation that unequal records of different types should have the same hash-code.&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (hash (-&amp;gt;A 1))&lt;br/&gt;
1013911913&lt;br/&gt;
user=&amp;gt; (hash (-&amp;gt;B 1))&lt;br/&gt;
1013911913&lt;br/&gt;
user=&amp;gt; (= (&lt;del&gt;&amp;gt;A 1) (&lt;/del&gt;&amp;gt;B 1))&lt;br/&gt;
false&lt;/p&gt;


&lt;p&gt;This issue also affects ClojureScript.  But see &lt;a href=&quot;#CLJS-97&quot;&gt;CLJS-97&lt;/a&gt;, as ClojureScript also has an issue with record equality.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14910">CLJ-867</key>
            <summary>Records of different types with the same data have the same hashcodes, even though they are not considered to be equal</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="djpowell">David Powell</reporter>
                        <labels>
                    </labels>
                <created>Sun, 30 Oct 2011 06:39:17 -0500</created>
                <updated>Fri, 18 May 2012 20:37:11 -0500</updated>
                    <resolved>Fri, 18 May 2012 20:37:11 -0500</resolved>
                            <version>Release 1.3</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="27186" author="djpowell" created="Sun, 30 Oct 2011 07:27:32 -0500"  >&lt;p&gt;Potential patch to xor the hash of the record symbol name with the current hash obtained from the data&lt;/p&gt;</comment>
                    <comment id="28136" author="richhickey" created="Fri, 13 Apr 2012 09:43:38 -0500"  >&lt;p&gt;You can&apos;t change hashCode w/o breaking Map semantics. But you can implement IHashEq and do this in hasheq()&lt;/p&gt;</comment>
                    <comment id="28222" author="brentonashworth" created="Sat, 21 Apr 2012 17:23:21 -0500"  >&lt;p&gt;Added patch&lt;/p&gt;

&lt;p&gt;clj-867-incorporate-record-name-into-hash-code.txt&lt;/p&gt;

&lt;p&gt;which implements IHashEq for records, incorporating the record name into the hash code in the hasheq method.&lt;/p&gt;

&lt;p&gt;With this patch you will now see the following behavior:&lt;/p&gt;

&lt;div class=&quot;code panel&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; (defrecord A [x])
user.A
user=&amp;gt; (defrecord B [x])
user.B
user=&amp;gt; (= (-&amp;gt;B 1) (-&amp;gt;A 1))
&lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;
user=&amp;gt; (= (hash (-&amp;gt;B 1)) (hash (-&amp;gt;A 1)))
&lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10593" name="0001-CLJ-867-Incorporate-the-record-name-into-the-hash-co.patch" size="1478" author="djpowell" created="Sun, 30 Oct 2011 07:27:32 -0500" />
                    <attachment id="11085" name="clj-867-incorporate-record-name-into-hash-code.txt" size="1535" author="brentonashworth" created="Sat, 21 Apr 2012 17:17:14 -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-881] Problem with the &quot;cl-format&quot; function from the clojure.pprint</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-881</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Let&apos;s see the following scenario:&lt;/p&gt;

&lt;p&gt;vdim@home:~/clojure$ git log -1&lt;br/&gt;
commit ba930d95fc3a4a78c5bd6756ea483c9dac681618&lt;br/&gt;
Author: Rich Hickey &amp;lt;richhickey@gmail.com&amp;gt;&lt;br/&gt;
Date:   Sun Oct 30 10:44:55 2011 -0400&lt;/p&gt;

&lt;p&gt;    inline equiv in variadic =&lt;br/&gt;
vdim@home:~/clojure$ rlwrap java -cp clojure-1.4.0-master-SNAPSHOT.jar clojure.main&lt;br/&gt;
Clojure 1.4.0-master-SNAPSHOT&lt;br/&gt;
user=&amp;gt; (use &apos;clojure.pprint)&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; (cl-format nil &quot;~12,10F&quot; 1.00000000074)&lt;br/&gt;
&quot;1.0000000007&quot;&lt;br/&gt;
user=&amp;gt; (cl-format nil &quot;~12,10F&quot; 1.00000000076)&lt;br/&gt;
NumberFormatException For input string: &quot;10000000007&quot;  java.lang.NumberFormatException.forInputString (NumberFormatException.java:65)&lt;br/&gt;
user=&amp;gt;&lt;/p&gt;


&lt;p&gt;The exception is caused from round-str function (cl-format.clj) where&lt;br/&gt;
my number (100000000076) is coerced to an Integer (see line with Integer/valueOf code&lt;br/&gt;
into this function).&lt;/p&gt;

&lt;p&gt;Is this normal behaviour?&lt;/p&gt;

&lt;p&gt;See patch with tests and my suggestion for solving this problem.&lt;/p&gt;</description>
                <environment>Linux 2.6.31-22-generic #61-Ubuntu SMP Wed Jul 28 01:57:06 UTC 2010 i686 GNU/Linux</environment>
            <key id="15020">CLJ-881</key>
            <summary>Problem with the &quot;cl-format&quot; function from the clojure.pprint</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="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="vdim">Vyacheslav Dimitrov</reporter>
                        <labels>
                    </labels>
                <created>Sun, 20 Nov 2011 02:47:16 -0600</created>
                <updated>Fri, 18 May 2012 20:37:04 -0500</updated>
                    <resolved>Fri, 18 May 2012 20:37:04 -0500</resolved>
                            <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27313" author="vdim" created="Sun, 20 Nov 2011 02:49:03 -0600"  >&lt;p&gt;Also I can create pull request if any.&lt;/p&gt;</comment>
                    <comment id="27706" author="jafingerhut" created="Sun, 12 Feb 2012 02:29:18 -0600"  >&lt;p&gt;I&apos;ve modified Vyacheslav&apos;s patch so that it is in the proper format.  I also changed his implementation of function inc-s so that it should allocate a bit less memory, and removed an addition of a redundant test case that is in his patch.  There is a bug he has found here, and I&apos;ve verified that this patch fixes it.&lt;/p&gt;</comment>
                    <comment id="28014" author="jafingerhut" created="Mon, 26 Mar 2012 17:04:41 -0500"  >&lt;p&gt;clj-881-cl-format-exception-patch2.txt Mar 26, 2012 applies cleanly to latest master, and fixes the problem in the same way as my Feb 12, 2012 patch (since deleted to avoid confusion).  I am the author, and have signed a CA.&lt;/p&gt;</comment>
                    <comment id="28053" author="tomfaulhaber" created="Thu, 29 Mar 2012 20:15:36 -0500"  >&lt;p&gt;This patch looks good to me. I recommend we apply it.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11010" name="clj-881-cl-format-exception-patch2.txt" size="3112" author="jafingerhut" created="Mon, 26 Mar 2012 17:04:41 -0500" />
                    <attachment id="10710" name="patchfile" size="2743" author="vdim" created="Sun, 20 Nov 2011 02:47:16 -0600" />
                </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-892] sort changes its argument, if a Java array</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-892</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;user&amp;gt; (let [a (to-array &lt;span class=&quot;error&quot;&gt;&amp;#91;32 11&amp;#93;&lt;/span&gt;)] &lt;br/&gt;
        (prn (seq a))&lt;br/&gt;
        (sort a)&lt;br/&gt;
        (prn (seq a)))&lt;br/&gt;
(32 11)&lt;br/&gt;
(11 32)&lt;br/&gt;
nil&lt;/p&gt;

&lt;p&gt;Where the second line printed ought to be the same as the first.&lt;/p&gt;</description>
                <environment>java version &amp;quot;1.6.0_22&amp;quot;&lt;br/&gt;
OpenJDK Runtime Environment (IcedTea6 1.10.4) (6b22-1.10.4-0ubuntu1~11.04.1)&lt;br/&gt;
(clojure-version)&lt;br/&gt;
&amp;quot;1.4.0-alpha2&amp;quot;</environment>
            <key id="15058">CLJ-892</key>
            <summary>sort changes its argument, if a Java array</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="s11001001">Stephen Compall</reporter>
                        <labels>
                    </labels>
                <created>Thu, 8 Dec 2011 19:14:37 -0600</created>
                <updated>Fri, 18 May 2012 12:35:48 -0500</updated>
                    <resolved>Fri, 18 May 2012 12:35:48 -0500</resolved>
                            <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Reviewed Backlog</fixVersion>
                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27438" author="stu" created="Fri, 9 Dec 2011 09:37:53 -0600"  >&lt;p&gt;This is an enhancement request, since the docs for sort make no promise one way or the other. &lt;/p&gt;

&lt;p&gt;For performance, I prefer the current behavior, so another possibility is a clarifying doc string.&lt;/p&gt;</comment>
                    <comment id="28016" author="jafingerhut" created="Mon, 26 Mar 2012 17:32:41 -0500"  >&lt;p&gt;clj-892-clarify-sort-sort-by-doc-strings-patch1.txt of Mar 26, 2012 applies cleanly to latest master on that date.  Only doc string changes, to make it clear that by sort and sort-by will modify Java arrays given as arguments.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11012" name="clj-892-clarify-sort-sort-by-doc-strings-patch1.txt" size="1409" author="jafingerhut" created="Mon, 26 Mar 2012 17:32:41 -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-952] bigdec does not properly convert a clojure.lang.BigInt</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-952</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;bigdec handles java.math.BigInteger when converting to java.math.BigDecimal, but it does not handle clojure.lang.BigInt.  Instead it treats a clojure.lang.BigInt as a Number, by casting it to long.  This causes the following error:&lt;/p&gt;

&lt;p&gt;Clojure 1.4.0-beta3&lt;br/&gt;
user=&amp;gt; (bigdec (inc (bigint Long/MAX_VALUE)))&lt;br/&gt;
IllegalArgumentException Value out of range for long: 9223372036854775808  clojure.lang.RT.longCast (RT.java:1123)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15274">CLJ-952</key>
            <summary>bigdec does not properly convert a clojure.lang.BigInt</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="-1">Unassigned</assignee>
                                <reporter username="pjstadig">Paul Stadig</reporter>
                        <labels>
                    </labels>
                <created>Mon, 12 Mar 2012 14:21:41 -0500</created>
                <updated>Fri, 18 May 2012 12:32:12 -0500</updated>
                    <resolved>Fri, 18 May 2012 12:32:12 -0500</resolved>
                            <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>2</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="27974" author="jafingerhut" created="Wed, 21 Mar 2012 10:55:30 -0500"  >&lt;p&gt;Add a case to bigdec to handle BigInts.  Also eliminate a reflection warning in the ratio case while we are in there.  Paul&apos;s failing case has been added to tests, fails before the fix, and passes after.  Attempted to make it as run-time efficient as possible by creating a new BigInt/toBigDecimal, patterned after the existing BigInt/toBigInteger.&lt;/p&gt;</comment>
                    <comment id="27975" author="pjstadig" created="Wed, 21 Mar 2012 11:51:50 -0500"  >&lt;p&gt;I was originally thinking of something like &lt;tt&gt;(BigDecimal. (.toBigInteger ^clojure.lang.BigInt x))&lt;/tt&gt;.  Adding a &lt;tt&gt;toBigDecimal&lt;/tt&gt; method to &lt;tt&gt;clojure.lang.BigInt&lt;/tt&gt; saves some object allocations and such.  Probably more of a micro optimization, but it works.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Clojure 1.4.0-master-SNAPSHOT&lt;br/&gt;
user=&amp;gt; (bigdec (inc (bigint Long/MAX_VALUE)))&lt;br/&gt;
9223372036854775808M&lt;/p&gt;

&lt;p&gt;Thanks, Andy!&lt;/p&gt;

&lt;p&gt;+1&lt;/p&gt;</comment>
                    <comment id="28190" author="alan@thinkrelevance.com" created="Fri, 20 Apr 2012 13:35:40 -0500"  >&lt;p&gt;Looks good to me, thanks.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10999" name="clj-952-make-bigdec-work-on-bigints-patch1.txt" size="2145" author="jafingerhut" created="Wed, 21 Mar 2012 10:55:30 -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-893] crafted `vec&apos; call allows created vector to be mutated</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-893</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;user&amp;gt; (let [a (to-array (repeat 31 0)), v (vec a)]
        [(v 2) (&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt; (aset a 2 &apos;no) (v 2))])
[0 no]
user&amp;gt; (let [a (to-array (repeat 33 0)), v (vec a)]
        [(v 2) (&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt; (aset a 2 &apos;no) (v 2))])
[0 0]&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;While a relaxation of &lt;b&gt;when&lt;/b&gt; different changes to the environment are made may impact the resulting value of the vector, as it is with lazy seqs, it oughtn&apos;t be possible to get two different results for the same access, just as with lazy seqs.&lt;/p&gt;</description>
                <environment>Found in 1.3.0; tested in 1.4.0-alpha2 as well.</environment>
            <key id="15059">CLJ-893</key>
            <summary>crafted `vec&apos; call allows created vector to be mutated</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="-1">Unassigned</assignee>
                                <reporter username="s11001001">Stephen Compall</reporter>
                        <labels>
                    </labels>
                <created>Thu, 8 Dec 2011 19:26:47 -0600</created>
                <updated>Fri, 18 May 2012 12:32:03 -0500</updated>
                    <resolved>Fri, 18 May 2012 12:32:03 -0500</resolved>
                            <version>Release 1.3</version>
                <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27436" author="stu" created="Fri, 9 Dec 2011 09:34:12 -0600"  >&lt;p&gt;The code path followed here lets vec assume (without copying) a passed-in array. to-array just returns the array, and createOwning doesn&apos;t copy either.&lt;/p&gt;

&lt;p&gt;Seems like we need a defensive copy somewhere&lt;/p&gt;</comment>
                    <comment id="27605" author="richhickey" created="Sun, 22 Jan 2012 12:26:10 -0600"  >&lt;p&gt;Just document that, when passed an array, vec aliases it, and it should not be changed. Then only people that can&apos;t ensure that must copy it first.&lt;/p&gt;</comment>
                    <comment id="27865" author="jafingerhut" created="Fri, 24 Feb 2012 20:33:07 -0600"  >&lt;p&gt;Proposed patch to document the existing behavior, and briefly suggest safe ways to use vec with mutable collections.&lt;/p&gt;</comment>
                    <comment id="27994" author="stuart.sierra" created="Fri, 23 Mar 2012 09:00:14 -0500"  >&lt;p&gt;I think the docstring in the 24/Feb/12 patch is too long. Also not entirely correct: calling &lt;tt&gt;vec&lt;/tt&gt; on a mutable java.util.List, for example, will create an immutable vector from the contents of the List.&lt;/p&gt;

&lt;p&gt;Instead just say that Java arrays may be aliased by &lt;tt&gt;vec&lt;/tt&gt; and should not be modified.&lt;/p&gt;</comment>
                    <comment id="28015" author="jafingerhut" created="Mon, 26 Mar 2012 17:16:36 -0500"  >&lt;p&gt;clj-893-doc-vec-aliases-java-array-patch2.txt of Mar 26, 2012 is shorter than the previous attempt, and avoids the error Stuart Sierra found.&lt;/p&gt;</comment>
                    <comment id="28130" author="richhickey" created="Fri, 13 Apr 2012 08:09:17 -0500"  >&lt;p&gt;I&apos;d prefer it said will alias and &quot;should not be modified&quot; vs &quot;should be copied&quot;.&lt;/p&gt;</comment>
                    <comment id="28144" author="jafingerhut" created="Sat, 14 Apr 2012 16:22:41 -0500"  >&lt;p&gt;Would someone better at writing Clojure style doc strings take a crack at this?  I&apos;m too verbose.  I have added a (verbose) note about this behavior on clojuredocs.org.&lt;/p&gt;</comment>
                    <comment id="28221" author="brentonashworth" created="Sat, 21 Apr 2012 16:12:00 -0500"  >&lt;p&gt;Added patch&lt;/p&gt;

&lt;p&gt;clj-893-doc-vec-aliases-java-array-patch3.txt&lt;/p&gt;

&lt;p&gt;With this patch the doc string would be:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;Creates a &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; vector containing the contents of coll. Java arrays
will be aliased and should not be modified.&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="28266" author="jafingerhut" created="Tue, 24 Apr 2012 19:42:06 -0500"  >&lt;p&gt;Removed non-preferred patch clj-893-doc-vec-aliases-java-array-patch2.txt of Mar 26, 2012.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11084" name="clj-893-doc-vec-aliases-java-array-patch3.txt" size="836" author="brentonashworth" created="Sat, 21 Apr 2012 16:08:25 -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-730] Create test suite for functional fns (e.g. juxt, comp, partial, etc.)</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-730</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The tests in &lt;tt&gt;other_functions.clj&lt;/tt&gt; for the combinator functions are tenuous in some cases (&lt;tt&gt;comp&lt;/tt&gt;) and missing in others (&lt;tt&gt;juxt&lt;/tt&gt;, &lt;tt&gt;partial&lt;/tt&gt;, &lt;tt&gt;complement&lt;/tt&gt;, and &lt;tt&gt;constantly&lt;/tt&gt;).  It would be nice to have a full suite of combinator tests moving forward.&lt;/p&gt;

&lt;p&gt;I would be happy to write the needed tests.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14343">CLJ-730</key>
            <summary>Create test suite for functional fns (e.g. juxt, comp, partial, etc.)</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                    </labels>
                <created>Wed, 26 Jan 2011 11:46:39 -0600</created>
                <updated>Fri, 18 May 2012 12:31:51 -0500</updated>
                    <resolved>Fri, 18 May 2012 12:31:51 -0500</resolved>
                                            <fixVersion>Approved Backlog</fixVersion>
                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="26180" author="stu" created="Fri, 28 Jan 2011 09:00:40 -0600"  >&lt;p&gt;Go for it, and mark them waiting for me when they are ready.&lt;/p&gt;</comment>
                    <comment id="26330" author="fbrubacher" created="Tue, 22 Mar 2011 11:07:15 -0500"  >&lt;p&gt;Michael, Stuart, Can I barge in with a patch? I would love to get feedback on this. I have CA signed already. Thanks&lt;br/&gt;
Federico&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10161" name="0001-add-tests-for-complement-constantly-juxt-partial.patch" size="1686" author="fbrubacher" created="Tue, 22 Mar 2011 11:07:15 -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>
                                                                                        </customfields>
    </item>

<item>
            <title>[CLJ-103] GC Issue 99: Incorrect error with if-let</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-103</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;Reported by rosejn, Mar 19, 2009

Example:
user=&amp;gt; (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let [foo (+ 1 2)] foo + 1 foo)
java.lang.IllegalArgumentException: &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let requires a vector &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; its
binding (NO_SOURCE_FILE:2)

The error reports that &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let requires a vector &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; its binding, but the
problem here has nothing to &lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt; with the binding being a vector.  A paren
was forgotten before the &apos;+&apos;, so the number of arguments is incorrect &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt;
the &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; form.&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="13500">CLJ-103</key>
            <summary>GC Issue 99: Incorrect error with if-let</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="rosejn">Jeff Rose</reporter>
                        <labels>
                    </labels>
                <created>Wed, 17 Jun 2009 16:56:00 -0500</created>
                <updated>Fri, 18 May 2012 12:26:37 -0500</updated>
                    <resolved>Fri, 18 May 2012 12:26:37 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="22766" author="importer" created="Tue, 24 Aug 2010 06:45:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/103&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/103&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="22767" author="importer" created="Tue, 24 Aug 2010 06:45:00 -0500"  >&lt;p&gt;richhickey said: Updating tickets (#8, #19, #30, #31, #126, #17, #42, #47, #50, #61, #64, #69, #71, #77, #79, #84, #87, #89, #96, #99, #103, #107, #112, #113, #114, #115, #118, #119, #121, #122, #124)&lt;/p&gt;</comment>
                    <comment id="24322" author="jszakmeister" created="Wed, 27 Oct 2010 21:15:07 -0500"  >&lt;p&gt;I have a patch that gives a better error message.  It will now say: &quot;IllegalArgumentException if-let requires 1 or 2 forms to be passed&quot;.  I&apos;m not sure if that&apos;s a better error message or not, but I&apos;m happy to tweak it.&lt;/p&gt;</comment>
                    <comment id="24323" author="jszakmeister" created="Wed, 27 Oct 2010 21:16:09 -0500"  >&lt;p&gt;First iteration of the patch.&lt;/p&gt;</comment>
                    <comment id="27830" author="jafingerhut" created="Thu, 23 Feb 2012 23:43:34 -0600"  >&lt;p&gt;clj-103-incorrect-if-let-error-patch2.txt is same as John&apos;s except updated to apply cleanly to latest master as of Feb 23, 2012.  No compiler errors or warnings, no test failures.  No new tests for this one &amp;#8211; I could write one, but the only way to do so is to check the contents of the error message in the exception thrown, which seems a bit too specific.  The author John Szakmeister is on the contributor list.&lt;/p&gt;</comment>
                    <comment id="28201" author="brentonashworth" created="Fri, 20 Apr 2012 17:19:58 -0500"  >&lt;p&gt;The provided patch from John and updated by Andy&lt;/p&gt;

&lt;p&gt;clj-103-incorrect-if-let-error-patch2.txt&lt;/p&gt;

&lt;p&gt;applies cleanly and doesn&apos;t cause any problems. I don&apos;t like the wording of the error message: &quot;requires 1 or 2 forms to be passed&quot; so I added another patch&lt;/p&gt;

&lt;p&gt;clj-103-improved-if-let-error-message-patch.txt&lt;/p&gt;

&lt;p&gt;which is the same change but with the wording &quot;requires 1 or 2 forms after binding vector&quot; which I think is a little more clear.&lt;/p&gt;

&lt;p&gt;With this change, a user would now get the following error messages:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;&amp;gt; (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let foo)
ArityException 
Wrong number of args (1) passed to: core$&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let 
clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.macroexpand1 (&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6371)

&amp;gt; (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let foo (+ 1 3))
IllegalArgumentException 
clojure.core/&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let requires a vector &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; its binding in clojure.core: 
clojure.core/&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let (NO_SOURCE_FILE:124)

&amp;gt; (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let [foo (+ 1 3)])
ArityException
Wrong number of args (1) passed to: core$&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let 
clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.macroexpand1 (&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6371)

&amp;gt; (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let [foo (+ 1 3)] foo 7 5)
IllegalArgumentException
&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let requires 1 or 2 forms after binding vector in clojure.core:142
clojure.core/&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let (NO_SOURCE_FILE:124)

&amp;gt; (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let [foo (+ 1 3) bar 7] foo 7)
IllegalArgumentException
&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let requires exactly 2 forms in binding vector in clojure.core:143
clojure.core/&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let (NO_SOURCE_FILE:124)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="28207" author="jszakmeister" created="Fri, 20 Apr 2012 18:40:25 -0500"  >&lt;p&gt;I like the improved wording.  I struggled with that myself.  Thanks Brenton!&lt;/p&gt;</comment>
                    <comment id="28264" author="jafingerhut" created="Tue, 24 Apr 2012 19:28:42 -0500"  >&lt;p&gt;Removed obsolete patch from Feb 23 2012.  Preference should be given to patch clj-103-improved-if-let-error-message-patch.txt dated Apr 20 2012 instead.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10001" name="0001-Fix-CLJ-103-Incorrect-error-with-if-let.patch" size="904" author="jszakmeister" created="Wed, 27 Oct 2010 21:16:09 -0500" />
                    <attachment id="11073" name="clj-103-improved-if-let-error-message-patch.txt" size="914" author="brentonashworth" created="Fri, 20 Apr 2012 17:04: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="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJ-962] Vectors returned by subvec allow access at negative indices</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-962</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Google group thread: &lt;a href=&quot;https://mail.google.com/mail/?shva=1#label/clojure/1365e058eaf0d5fa&quot;&gt;https://mail.google.com/mail/?shva=1#label/clojure/1365e058eaf0d5fa&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vectors returned by subvec correctly disallow access to elements after their end, but not before their beginning.&lt;/p&gt;

&lt;p&gt;Clojure 1.3.0&lt;br/&gt;
user=&amp;gt; (def v1 (vec (range 100)))&lt;br/&gt;
#&apos;user/v1&lt;br/&gt;
user=&amp;gt; (def v2 (subvec v1 50 52))&lt;br/&gt;
#&apos;user/v2&lt;br/&gt;
user=&amp;gt; (v2 3)&lt;br/&gt;
IndexOutOfBoundsException   clojure.lang.APersistentVector$SubVector.nth (APersistentVector.java:526)&lt;br/&gt;
user=&amp;gt; (v2 -48)&lt;br/&gt;
2&lt;/p&gt;</description>
                <environment></environment>
            <key id="15304">CLJ-962</key>
            <summary>Vectors returned by subvec allow access at negative indices</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="jafingerhut">Andy Fingerhut</reporter>
                        <labels>
                    </labels>
                <created>Thu, 29 Mar 2012 09:55:00 -0500</created>
                <updated>Fri, 18 May 2012 10:03:07 -0500</updated>
                    <resolved>Fri, 18 May 2012 10:03:07 -0500</resolved>
                                            <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28044" author="jafingerhut" created="Thu, 29 Mar 2012 10:12:53 -0500"  >&lt;p&gt;One-line simple fix.  clj-962-subvec-nth-throws-on-negative-index-patch1.txt dated March 29, 2012 applies, builds, and tests cleanly on latest master.  Includes a few new tests that exhibit the problem.  One author has signed CA.&lt;/p&gt;</comment>
                    <comment id="28192" author="alan@thinkrelevance.com" created="Fri, 20 Apr 2012 13:52:50 -0500"  >&lt;p&gt;I checked this out and it looks good to me, thank you.&lt;/p&gt;</comment>
                    <comment id="28432" author="jafingerhut" created="Thu, 10 May 2012 18:29:43 -0500"  >&lt;p&gt;clj-962-subvec-nth-throws-on-negative-index-patch2.txt dated May 10, 2012 is identical to previous patch clj-962-subvec-nth-throws-on-negative-index-patch1.txt dated Mar 29, 2012, except previous one failed to apply cleanly to latest master because of some lines of context changing in the source code.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11189" name="clj-962-subvec-nth-throws-on-negative-index-patch2.txt" size="1561" author="jafingerhut" created="Thu, 10 May 2012 18:29:43 -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>