<!--
RSS generated by JIRA (4.4#649-r158309) at Fri May 24 18:42:59 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/10011/SearchRequest-10011.xml?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>Incomplete (Clojure JIRA)</title>
        <link>http://dev.clojure.org/jira/secure/IssueNavigator.jspa?requestId=10011</link>
        <description>Incomplete tickets need something to move forward, as documented in the ticket description or comments.</description>
                <language>en-us</language>
                        <issue start="0" end="19" total="19"/>
                <build-info>
            <version>4.4</version>
            <build-number>649</build-number>
            <build-date>25-07-2011</build-date>
        </build-info>
<item>
            <title>[CLJ-1125] Clojure can leak memory when used in a servlet container</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1125</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;When used within a servlet container&lt;br/&gt;
(Jetty/Tomcat/JBossAS/Immutant/etc), the thread locals Var.dvals (used&lt;br/&gt;
to store dynamic bindings) and LockingTransaction.transaction (used to&lt;br/&gt;
store the currently active transaction(s)) prevent all of the classes&lt;br/&gt;
loaded by an application&apos;s clojure runtime from being garbage collected, &lt;br/&gt;
resulting in a memory leak.&lt;/p&gt;

&lt;p&gt;The issue comes from threads living beyond the lifetime of a&lt;br/&gt;
deployment - servlet containers use thread pools that are shared&lt;br/&gt;
across all applications within the container. Currently, the dvals and&lt;br/&gt;
transaction thread locals are not discarded when they are no longer&lt;br/&gt;
needed, causing their contents to retain a hard reference to their&lt;br/&gt;
classloaders, which, in turn, causes all of the classes loaded under&lt;br/&gt;
the application&apos;s classloader to be retained until the thread exits&lt;br/&gt;
(which is generally at JVM shutdown).&lt;/p&gt;

&lt;p&gt;I&apos;ve attached a patch that does the following:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Var.dvals is now removed when the thread bindings are popped&lt;/li&gt;
	&lt;li&gt;Var.dvals no longer has an initialValue, so checking to see if it is&lt;br/&gt;
  set will no longer set it to an empty Frame&lt;/li&gt;
	&lt;li&gt;The outer transaction in LockingTransaction.transaction now removes&lt;br/&gt;
  the thread local when it is finished&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;There is still the opportunity for memory leaks if agents or futures &lt;br/&gt;
are used, and the executors used for them are not shutdown when the&lt;br/&gt;
app is undeployed. That&apos;s a solvable problem, but should probably be&lt;br/&gt;
solved by the containers themselves (and/or the war generation tools) &lt;br/&gt;
instead of in clojure itself.&lt;/p&gt;

&lt;p&gt;This patch has a small performance impact: its use of a try/finally &lt;br/&gt;
around running transactions to remove the outer transaction adds &lt;br/&gt;
4-6 microseconds to each transaction call on my hardware.&lt;/p&gt;

&lt;p&gt;Providing an automated test for this patch is difficult - I&apos;ve tested&lt;br/&gt;
it locally with repeated deployments to a container while monitoring&lt;br/&gt;
GC and permgen. All of clojure&apos;s tests pass with it applied.&lt;/p&gt;

&lt;p&gt;The above is a condensation of:&lt;br/&gt;
&lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/3CXDe8_9G58/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/3CXDe8_9G58/discussion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&apos;m happy to provide whatever feedback/work is needed to get this&lt;br/&gt;
applied.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15882">CLJ-1125</key>
            <summary>Clojure can leak memory when used in a servlet container</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="stu">Stuart Halloway</assignee>
                                <reporter username="tcrawley">Toby Crawley</reporter>
                        <labels>
                    </labels>
                <created>Tue, 11 Dec 2012 15:01:15 -0600</created>
                <updated>Fri, 24 May 2013 11:36:08 -0500</updated>
                                                    <fixVersion>Release 1.6</fixVersion>
                                        <due></due>
                    <votes>8</votes>
                        <watches>6</watches>
                        <comments>
                    <comment id="31088" author="trptcolin" created="Mon, 13 May 2013 19:30:16 -0500"  >&lt;p&gt;This patch works great for me to avoid OOM/PermGen crashes from classloaders being retained &lt;span class=&quot;error&quot;&gt;&amp;#91;mine is a non-servlet use case&amp;#93;&lt;/span&gt;.&lt;/p&gt;</comment>
                    <comment id="31141" author="stu" created="Fri, 24 May 2013 09:43:33 -0500"  >&lt;p&gt;Does Tomcat create warnings for Clojure, as described e.g. &lt;a href=&quot;http://stackoverflow.com/questions/5292349/is-this-very-likely-to-create-a-memory-leak-in-tomcat&quot;&gt;here&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;If so, does this patch make the warnings go away?&lt;/p&gt;</comment>
                    <comment id="31142" author="tcrawley" created="Fri, 24 May 2013 09:56:14 -0500"  >&lt;p&gt;Stu: that&apos;s a good question. I&apos;ll take a look at Tomcat this afternoon.&lt;/p&gt;</comment>
                    <comment id="31143" author="stu" created="Fri, 24 May 2013 10:04:04 -0500"  >&lt;p&gt;The code that calls transaction.remove() seems unncessarily subtle.   There are two exits from the method, and only one is protected by the finally block.&lt;/p&gt;

&lt;p&gt;If the &quot;outer&quot; case was a top-level if, the logic would be more clear, and only the &quot;outer&quot; case would need try/finally, which might reduce the performance penalty in the case of deeply nested dosyncs.&lt;/p&gt;

&lt;p&gt;Did your transaction overhead of 4-6 microseconds test only one level of dosync, or many?&lt;/p&gt;</comment>
                    <comment id="31144" author="stu" created="Fri, 24 May 2013 10:13:35 -0500"  >&lt;p&gt;Because the unwind code calls &lt;tt&gt;remove&lt;/tt&gt; at the top (as opposed to &lt;tt&gt;set(null)&lt;/tt&gt;), the code should now be safe for use with Clojure-defined &lt;tt&gt;ThreadLocal&lt;/tt&gt; subclasses.&lt;/p&gt;

&lt;p&gt;Therefore, Var&apos;s use of an &lt;tt&gt;initialValue&lt;/tt&gt; should be irrelevant to this patch, and it should be possible to fix this bug with a patch half the size of the current patch, touching only &lt;tt&gt;LockingTransaction.runInTransaction&lt;/tt&gt; and &lt;tt&gt;Var.popThreadBindings&lt;/tt&gt;.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11756" name="threadlocal-removal-tcrawley-2012-12-11.diff" size="3685" author="tcrawley" created="Tue, 11 Dec 2012 15:01:15 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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-1083] Incorrect ArityException message for function names containing -&gt;</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1083</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;user=&amp;gt; (defn a-&amp;gt;b [])&lt;br/&gt;
#&apos;user/a-&amp;gt;b&lt;br/&gt;
user=&amp;gt; (a-&amp;gt;b 1)&lt;br/&gt;
ArityException Wrong number of args (1) passed to: user$a  clojure.lang.AFn.throwArity (AFn.java:437)&lt;/p&gt;

&lt;p&gt;Note that the reported function name in the stack trace is &quot;user$a&quot;, where it should be &quot;user$a-&amp;gt;b&quot; (or some mangled variant thereof?)&lt;/p&gt;

&lt;p&gt;See discussion here: &lt;a href=&quot;https://groups.google.com/d/msg/clojure/PVNoLclhhB0/_NWqyE0cPAUJ&quot;&gt;https://groups.google.com/d/msg/clojure/PVNoLclhhB0/_NWqyE0cPAUJ&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15742">CLJ-1083</key>
            <summary>Incorrect ArityException message for function names containing -&gt;</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="alexnixon">Alex Nixon</reporter>
                        <labels>
                    </labels>
                <created>Tue, 9 Oct 2012 11:18:48 -0500</created>
                <updated>Fri, 24 May 2013 11:35:12 -0500</updated>
                                    <version>Release 1.2</version>
                <version>Release 1.3</version>
                <version>Release 1.4</version>
                <version>Release 1.5</version>
                                <fixVersion>Release 1.6</fixVersion>
                                        <due></due>
                    <votes>2</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30034" author="halgari" created="Mon, 26 Nov 2012 10:27:31 -0600"  >&lt;p&gt;Fix for this defect.&lt;/p&gt;</comment>
                    <comment id="30035" author="halgari" created="Mon, 26 Nov 2012 10:30:13 -0600"  >&lt;p&gt;The throwArity now attempts to locate and call clojure.main/demunge. If it finds the function it invokes it and uses the returned string in the error. Otherwise it just throws the actual class name. This results in the following behaviour:&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (defn a-&amp;gt;b [])&lt;br/&gt;
#&apos;user/a-&amp;gt;b&lt;br/&gt;
user=&amp;gt; (a-&amp;gt;b 32)&lt;br/&gt;
ArityException Wrong number of args (1) passed to: user/a-&amp;gt;b  clojure.lang.AFn.throwArity (AFn.java:449)&lt;br/&gt;
user=&amp;gt; &lt;/p&gt;</comment>
                    <comment id="31146" author="stu" created="Fri, 24 May 2013 11:35:04 -0500"  >&lt;p&gt;Timothy: Why the empty catch block? I don&apos;t see anything in the try block whose failure we would want to ignore.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11710" name="better-throw-arity-messages.diff" size="1340" author="halgari" created="Mon, 26 Nov 2012 10:27:31 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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-980] Documentation for extend-type falsely implies that &amp; is allowed in protocol fn signatures</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-980</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The documentation for extend-type contains the following example:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(extend-type MyType 
    Countable
      (cnt [c] ...)
    Foo
      (bar [x y] ...)
      (baz ([x] ...) ([x y &amp;amp; zs] ...)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;However, &lt;tt&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;x y &amp;amp; zs&amp;#93;&lt;/span&gt;&lt;/tt&gt; is not a valid parameter list for a protocol fn. The documentation should be appropriately amended.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15402">CLJ-980</key>
            <summary>Documentation for extend-type falsely implies that &amp; is allowed in protocol fn signatures</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="charles-dyfis-net">Charles Duffy</reporter>
                        <labels>
                        <label>documentation</label>
                    </labels>
                <created>Thu, 3 May 2012 12:08:35 -0500</created>
                <updated>Wed, 19 Dec 2012 08:00:13 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28599" author="jszakmeister" created="Fri, 25 May 2012 04:00:27 -0500"  >&lt;p&gt;v2 of the patch is simply converts the patch to git format.  I made sure that Mr. Duffy got proper attribution.  I also took a stab at a simple log message.  Any problems with the latter are mine, and I&apos;m happy to fix it up if necessary.&lt;/p&gt;</comment>
                    <comment id="29190" author="aaron" created="Wed, 15 Aug 2012 22:08:35 -0500"  >&lt;p&gt;This doesn&apos;t update the entire doc string. The expansion is updated, but the signature section isn&apos;t. Here&apos;s what shows up.&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; (doc extend-type)
-------------------------
clojure.core/extend-type
([t &amp;amp; specs])
Macro
  A macro that expands into an extend call. Useful when you are
  supplying the definitions explicitly inline, extend-type
  automatically creates the maps required by extend.  Propagates the
  class as a type hint on the first argument of all fns.

  (extend-type MyType 
    Countable
      (cnt [c] ...)
    Foo
      (bar [x y] ...)
      (baz ([x] ...) ([x y &amp;amp; zs] ...)))

  expands into:

  (extend MyType
   Countable
     {:cnt (fn [c] ...)}
   Foo
     {:baz (fn ([x] ...) ([x y ...] ...))
      :bar (fn [x y] ...)})
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29267" author="tsdh" created="Sat, 25 Aug 2012 06:44:49 -0500"  >&lt;p&gt;This is very much related to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1024&quot;&gt;http://dev.clojure.org/jira/browse/CLJ-1024&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;NOTE: While varargs are not supported in protocol declarations, dynamic extension of a protocol via extend (extend-type, extend-protocol) &lt;b&gt;does&lt;/b&gt; allow for varargs and also destructuring, cause the method impls are actually normal clojure functions.&lt;/p&gt;

&lt;p&gt;So if a Foo protocol declares a (foo &lt;span class=&quot;error&quot;&gt;&amp;#91;this a b c&amp;#93;&lt;/span&gt;) method, you can extend/extend-type/extend-protocol it dynamically using (foo &lt;span class=&quot;error&quot;&gt;&amp;#91;this &amp;amp; more&amp;#93;&lt;/span&gt; (do-magick)) where `a b c` are conflated into the `more` parameter.&lt;/p&gt;

&lt;p&gt;However, that doesn&apos;t work for method implementations defined by deftype, defrecord, and reify.&lt;/p&gt;

&lt;p&gt;So with respect to the facts, the example in the docstring is actually correct, so I&apos;m not sure if it should be changed.  However, what&apos;s supported in which cases should be documented better as it is right now.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11164" name="clojure--extend-type-doc-fix.diff" size="408" author="charles-dyfis-net" created="Thu, 3 May 2012 12:08:35 -0500" />
                    <attachment id="11257" name="extended-type-doc-fix-v2.patch" size="755" author="jszakmeister" created="Fri, 25 May 2012 04:00:27 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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-939] Exceptions thrown in the top level ns form are reported without file or line number</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-939</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;If there is an error in the `ns` form, an exception is thrown, which is not caught in `load`.&lt;/p&gt;

&lt;p&gt;For example, with an invalid :only clause;&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(ns clj14.myns
  (:use
   [clojure.core :only seq]))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This generates a &lt;tt&gt;Don&apos;t know how to create ISeq from: clojure.lang.Symbol&lt;/tt&gt; exception, with source file or line number.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15245">CLJ-939</key>
            <summary>Exceptions thrown in the top level ns form are reported without file or line number</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="hugoduncan">Hugo Duncan</reporter>
                        <labels>
                    </labels>
                <created>Fri, 24 Feb 2012 12:01:03 -0600</created>
                <updated>Sat, 15 Dec 2012 07:50:03 -0600</updated>
                                    <version>Release 1.3</version>
                <version>Release 1.4</version>
                                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27869" author="hugoduncan" created="Sat, 25 Feb 2012 08:26:57 -0600"  >&lt;p&gt;Corrected patch&lt;/p&gt;</comment>
                    <comment id="27923" author="jafingerhut" created="Fri, 9 Mar 2012 09:26:18 -0600"  >&lt;p&gt;Patch 0001-report-load-exception-with-file-and-line.diff fails build.  Patch 0002-report-load-exception-with-file-and-line.diff applies, builds, and tests cleanly as of March 9, 2012.  Hugo has signed a CA.&lt;/p&gt;</comment>
                    <comment id="29603" author="jafingerhut" created="Fri, 5 Oct 2012 08:13:24 -0500"  >&lt;p&gt;clj-939-report-load-exceptions-with-file-and-line-patch-v2.txt dated Oct 5 2012 is intended to be an update to Hugo Duncan&apos;s patch 0002-report-load-exceptions-with-file-and-line.diff dated Feb 25 2012.  Because of Brandon Bloom&apos;s recently commited patch adding column numbers in addition to line numbers, this is not simply updating some lines of context, but I think it is correct.  It would be good if Hugo could take a look at it and confirm.&lt;/p&gt;</comment>
                    <comment id="29924" author="stuart.sierra" created="Fri, 9 Nov 2012 09:38:21 -0600"  >&lt;p&gt;Screened.&lt;/p&gt;

&lt;p&gt;The error messages are better than what we had before. The line/column numbers are not particularly informative, probably because &lt;tt&gt;ns&lt;/tt&gt; is a macro.&lt;/p&gt;</comment>
                    <comment id="29935" author="richhickey" created="Tue, 13 Nov 2012 15:37:13 -0600"  >&lt;p&gt;This patch doesn&apos;t change the reporting on any other (e.g. nested) exceptions? It looks like it might.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10958" name="0001-report-load-exceptions-with-file-and-line.diff" size="908" author="hugoduncan" created="Fri, 24 Feb 2012 12:01:03 -0600" />
                    <attachment id="10968" name="0002-report-load-exceptions-with-file-and-line.diff" size="907" author="hugoduncan" created="Sat, 25 Feb 2012 08:26:57 -0600" />
                    <attachment id="11538" name="clj-939-report-load-exceptions-with-file-and-line-patch-v2.txt" size="934" author="jafingerhut" created="Fri, 5 Oct 2012 08:13:24 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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-866] Provide a clojure.test function to run a single test case with fixtures</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-866</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;At present, clojure.test test cases are functions and can be invoked directly.  However, in the case that the test relies on fixtures, this does not work.  Please provide a function that can run a single test case with all fixtures applied.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14902">CLJ-866</key>
            <summary>Provide a clojure.test function to run a single test case with fixtures</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="anthonygrimes">Anthony Grimes</assignee>
                                <reporter username="hugoduncan">Hugo Duncan</reporter>
                        <labels>
                    </labels>
                <created>Thu, 27 Oct 2011 08:57:55 -0500</created>
                <updated>Sat, 4 May 2013 09:36:20 -0500</updated>
                                                    <fixVersion>Release 1.6</fixVersion>
                                        <due></due>
                    <votes>8</votes>
                        <watches>5</watches>
                        <comments>
                    <comment id="29767" author="anthonygrimes" created="Mon, 22 Oct 2012 18:17:38 -0500"  >&lt;p&gt;I just added clj-866-test-vars.patch (22/Oct/12 6:09PM).&lt;/p&gt;

&lt;p&gt;I had to implement this hackishly in Leiningen a few days ago, so I&apos;m very excited to get this functionality in clojure.test itself.&lt;/p&gt;

&lt;p&gt;This patch adds a test-vars function that solves this problem (and is more general). You can test as many vars as you want with it, with fixtures. It works by grouping vars passed by their namespace and then running them all with appropriate fixtures applied. Being able to run a single test isn&apos;t the problem here, being able to run &lt;b&gt;only specific tests&lt;/b&gt; is. If we wrote a function to run one test with fixtures but we actually needed to run several, just not &lt;b&gt;all&lt;/b&gt; tests, we&apos;d end up having to run once-fixtures more than once which is wasteful. I think test-vars is a good solution that solves both this problem and the one I just mentioned.&lt;/p&gt;</comment>
                    <comment id="31049" author="alexmiller" created="Sat, 4 May 2013 09:36:20 -0500"  >&lt;p&gt;This is highly useful. Could you add a test to the patch?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11602" name="clj-866-test-vars.patch" size="1977" author="anthonygrimes" created="Mon, 22 Oct 2012 18:09:31 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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-835] defmulti doc string doesn&apos;t mention needing to be passed a var for the value of :hierarchy</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-835</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The :hierarchy option for defmulti should be passed a var, but this is not mentioned in the doc string.&lt;/p&gt;

&lt;p&gt;The error message from passing the hierarchy directly is rather cryptic:&lt;/p&gt;

&lt;p&gt;Evaluation aborted on java.lang.ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to clojure.lang.IRef (SOURCE_FORM_44:19).&lt;/p&gt;</description>
                <environment>1.2, 1.3 beta3</environment>
            <key id="14599">CLJ-835</key>
            <summary>defmulti doc string doesn&apos;t mention needing to be passed a var for the value of :hierarchy</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="hugoduncan">Hugo Duncan</reporter>
                        <labels>
                    </labels>
                <created>Fri, 2 Sep 2011 15:09:00 -0500</created>
                <updated>Wed, 19 Dec 2012 07:59:17 -0600</updated>
                                    <version>Release 1.2</version>
                                                        <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="26815" author="mbrandmeyer" created="Wed, 14 Sep 2011 15:11:10 -0500"  >&lt;p&gt;Modified doctoring to clarify the usage of &lt;tt&gt;:hierarchy&lt;/tt&gt;.&lt;/p&gt;</comment>
                    <comment id="28429" author="scottlowe" created="Thu, 10 May 2012 17:16:19 -0500"  >&lt;p&gt;New patch: &apos;0001-&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-835&quot; title=&quot;defmulti doc string doesn&amp;#39;t mention needing to be passed a var for the value of :hierarchy&quot;&gt;CLJ-835&lt;/a&gt;-Refine-doc-string-for-defmulti-hierarchy-opt.patch&apos; 10/May/12.&lt;/p&gt;

&lt;p&gt;I&apos;ve attached a new doc string patch in response to Andy Fingerhut&apos;s request posted here: &lt;a href=&quot;https://groups.google.com/forum/?fromgroups#!topic/clojure-dev/i7H82fJYL-U&quot;&gt;https://groups.google.com/forum/?fromgroups#!topic/clojure-dev/i7H82fJYL-U&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Andy&apos;s request stated &quot;Attached patch seems to have spelling mistakes, and perhaps could be worded more clearly.&quot;&lt;/p&gt;

&lt;p&gt;I hope my new patch is an improvement upon what was there.&lt;/p&gt;

&lt;p&gt;This patch supersedes &apos;0001-Clarify-docstring-for-defmulti.patch&apos; from 14/Sep/11.&lt;/p&gt;</comment>
                    <comment id="29195" author="fogus" created="Thu, 16 Aug 2012 14:49:50 -0500"  >&lt;p&gt;This is a million times better than what was there before, but (who knew!?) it could be better. A couple points of contention:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;The order under the &lt;tt&gt;:hierarchy&lt;/tt&gt; section seems off. I would start with an overview of what a hierarchy is including a definition of the global hierarchy map (it&apos;s mentioned, but glossed over). I&apos;d then move on to an example impl. Finally, I&apos;d then add the discussion starting &quot;Multimethods expect...&quot; immediately followed by an example.&lt;/li&gt;
&lt;/ul&gt;


&lt;ul&gt;
	&lt;li&gt;In the &lt;tt&gt;isa?&lt;/tt&gt; example it would be great to show the return value.&lt;/li&gt;
&lt;/ul&gt;


&lt;ul&gt;
	&lt;li&gt;You mention that the hierarchy should be supplied as a reference, which is correct, however you talk about #&apos;.  The link between e.g. var and #&apos; could be a bit more explicit. Maybe the sentence about #&apos; could be parenthetical?&lt;/li&gt;
&lt;/ul&gt;


&lt;ul&gt;
	&lt;li&gt;It&apos;s ok to finish with a very small example of its use in &lt;tt&gt;defmethod&lt;/tt&gt;, in fact a simple example specifying methods for &lt;tt&gt;::shape&lt;/tt&gt; and &lt;tt&gt;::circle&lt;/tt&gt; would clarify the intent nicely.&lt;/li&gt;
&lt;/ul&gt;
</comment>
                    <comment id="30265" author="richhickey" created="Wed, 19 Dec 2012 07:58:57 -0600"  >&lt;p&gt;Please leave examples out of docs strings. Use precise language.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10361" name="0001-Clarify-docstring-for-defmulti.patch" size="1058" author="mbrandmeyer" created="Wed, 14 Sep 2011 15:11:10 -0500" />
                    <attachment id="11188" name="0001-CLJ-835-Refine-doc-string-for-defmulti-hierarchy-opt.patch" size="1885" author="scottlowe" created="Thu, 10 May 2012 17:16:19 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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-771] Move unchecked-prim casts to clojure.unchecked</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-771</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Per Rich&apos;s comment in &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-767&quot; title=&quot;Remove support for non-primitive bit-shift operations&quot;&gt;&lt;del&gt;CLJ-767&lt;/del&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Moving unchecked coercions into unchecked ns is ok&lt;/p&gt;&lt;/blockquote&gt;</description>
                <environment></environment>
            <key id="14395">CLJ-771</key>
            <summary>Move unchecked-prim casts to clojure.unchecked</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="ataggart">Alexander Taggart</assignee>
                                <reporter username="ataggart">Alexander Taggart</reporter>
                        <labels>
                    </labels>
                <created>Thu, 7 Apr 2011 14:37:09 -0500</created>
                <updated>Wed, 13 Feb 2013 00:51:11 -0600</updated>
                                    <version>Backlog</version>
                                <fixVersion>Backlog</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="26410" author="ataggart" created="Fri, 29 Apr 2011 15:41:30 -0500"  >&lt;p&gt;Requires that patch on &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-782&quot; title=&quot;long cast is not checked for Object decimal types&quot;&gt;&lt;del&gt;CLJ-782&lt;/del&gt;&lt;/a&gt; be applied first.&lt;/p&gt;</comment>
                    <comment id="26478" author="stuart.sierra" created="Tue, 31 May 2011 10:43:16 -0500"  >&lt;p&gt;Applies on master as of commit 66a88de9408e93cf2b0d73382e662624a54c6c86&lt;/p&gt;</comment>
                    <comment id="27433" author="richhickey" created="Fri, 9 Dec 2011 08:40:16 -0600"  >&lt;p&gt;still considering when to incorporate this&lt;/p&gt;</comment>
                    <comment id="28539" author="jszakmeister" created="Sat, 19 May 2012 09:36:48 -0500"  >&lt;p&gt;v2 of the patch applies to master as of commit eccde24c7fb63679f00c64b3c70c03956f0ce2c3&lt;/p&gt;</comment>
                    <comment id="29392" author="jafingerhut" created="Fri, 7 Sep 2012 00:40:07 -0500"  >&lt;p&gt;Patch clj-771-move-unchecked-casts-patch-v3.txt dated Sep 6 2012 is the same as Alexander Taggart&apos;s patch move-unchecked-casts.patch except that it has been updated to apply cleanly to latest Clojure master.&lt;/p&gt;</comment>
                    <comment id="29729" author="jafingerhut" created="Sat, 20 Oct 2012 12:18:27 -0500"  >&lt;p&gt;Patch clj-771-move-unchecked-casts-patch-v4.txt dated Oct 20 2012 is the same as Alexander Taggart&apos;s patch move-unchecked-casts.patch except that it has been updated to apply cleanly to latest Clojure master.&lt;/p&gt;</comment>
                    <comment id="30342" author="jafingerhut" created="Tue, 1 Jan 2013 11:37:00 -0600"  >&lt;p&gt;The patch clj-771-move-unchecked-casts-patch-v4.txt applies cleanly to latest master and passes all tests.  Rich marked this ticket as Incomplete on Dec 9 2011 with the comment &quot;still considering when to incorporate this&quot; above.  Is it reasonable to change it back to Vetted or Screened so it can be considered again, perhaps after Release 1.5 is made?&lt;/p&gt;</comment>
                    <comment id="30582" author="jafingerhut" created="Wed, 13 Feb 2013 00:50:43 -0600"  >&lt;p&gt;Patch clj-771-move-unchecked-casts-patch-v5.txt dated Feb 12 2013 is the same as Alexander Taggart&apos;s patch move-unchecked-casts.patch except that it has been updated to apply cleanly to latest Clojure master.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11852" name="clj-771-move-unchecked-casts-patch-v5.txt" size="11956" author="jafingerhut" created="Wed, 13 Feb 2013 00:50:43 -0600" />
                    <attachment id="10213" name="move-unchecked-casts.patch" size="11871" author="ataggart" created="Fri, 29 Apr 2011 15:41:30 -0500" />
                    <attachment id="11235" name="move-unchecked-casts-v2.patch" size="11831" author="jszakmeister" created="Sat, 19 May 2012 09:36:48 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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-766] Implicit casting behaviour of into-array differs from &lt;primitive&gt;-array</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-766</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Current patch: byte-short-array-ctors.diff&lt;/p&gt;

&lt;p&gt;The behavior of &lt;tt&gt;byte-array&lt;/tt&gt; and &lt;tt&gt;short-array&lt;/tt&gt; is inconsistent with the other &lt;tt&gt;&amp;lt;type&amp;gt;-array&lt;/tt&gt; functions and with the &lt;tt&gt;into-array&lt;/tt&gt; function when invoked with types other than byte or short. All of the other cases upcast to Number, then extract the primitive value, allowing this operation to succeed (assuming the value is in range). &lt;tt&gt;byte-array&lt;/tt&gt; and &lt;tt&gt;short-array&lt;/tt&gt; throw a ClassCastException.&lt;/p&gt;

&lt;p&gt;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;base64v3a=&amp;gt; (into-array Byte/TYPE [1 2 3 4])  ;; int to byte ok
#&amp;lt;byte[] [B@5ee04fd&amp;gt;
base64v3a=&amp;gt; (byte-array [1 2 3 4])  ;; int to byte NOT ok!! 
ClassCastException java.lang.Long cannot be cast to java.lang.Byte
  clojure.lang.Numbers.byte_array (Numbers.java:1418)
base64v3a=&amp;gt; (long-array [1 2 3 4])  ;; int to long ok
#&amp;lt;long[] [J@3f9f4d1d&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;tt&gt;into-array&lt;/tt&gt; (via &lt;tt&gt;RT.seqToTypedArray&lt;/tt&gt;) and the other &lt;tt&gt;&amp;lt;type&amp;gt;-array&lt;/tt&gt; functions all upcast to Number (via Numbers.&amp;lt;type&amp;gt;_array}}), then obtain the proper primitive value. &lt;tt&gt;Numbers.byte-array&lt;/tt&gt; and &lt;tt&gt;Numbers.short-array&lt;/tt&gt; do casts directly to Byte and Short (yielding the ClassCastException).&lt;/p&gt;

&lt;p&gt;The attached patch makes the Byte and Short cases match the other types and the &lt;tt&gt;into-array&lt;/tt&gt; behavior. Tests are included. The submitter is a contributor.&lt;/p&gt;</description>
                <environment></environment>
            <key id="14390">CLJ-766</key>
            <summary>Implicit casting behaviour of into-array differs from &lt;primitive&gt;-array</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="toxi">Karsten Schmidt</assignee>
                                <reporter username="ataggart">Alexander Taggart</reporter>
                        <labels>
                    </labels>
                <created>Fri, 1 Apr 2011 18:45:53 -0500</created>
                <updated>Fri, 3 May 2013 20:46:29 -0500</updated>
                                    <version>Release 1.3</version>
                                <fixVersion>Release 1.6</fixVersion>
                                        <due></due>
                    <votes>3</votes>
                        <watches>6</watches>
                        <comments>
                    <comment id="26342" author="ataggart" created="Sat, 2 Apr 2011 14:04:31 -0500"  >&lt;p&gt;See &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-678&quot; title=&quot;into-array should work with all primitive types&quot;&gt;&lt;del&gt;CLJ-678&lt;/del&gt;&lt;/a&gt;.&lt;/p&gt;</comment>
                    <comment id="28631" author="jafingerhut" created="Mon, 28 May 2012 18:45:30 -0500"  >&lt;p&gt;Some more details from Alexandar Taggart: This is not a duplicate of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-678&quot; title=&quot;into-array should work with all primitive types&quot;&gt;&lt;del&gt;CLJ-678&lt;/del&gt;&lt;/a&gt;.  &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-766&quot; title=&quot;Implicit casting behaviour of into-array differs from &amp;lt;primitive&amp;gt;-array&quot;&gt;CLJ-766&lt;/a&gt; was created precisely due to the fact the the behavior of *-array is not consistent with the post-678 version of into-array.&lt;/p&gt;</comment>
                    <comment id="30688" author="toxi" created="Sat, 2 Mar 2013 17:11:43 -0600"  >&lt;p&gt;I&apos;d like to bump up this issue, since it&apos;d be great if all the (xxx-array) factory functions have the same expected behavior (i.e. not throw an exception, especially not if the values are in range). The attached patch is changing the behaviour for byte-array &amp;amp; short-array to the same pattern used as for int/long/float/double and therefore will not throw an exception for valid (even if overflown) numbers. You can find more discussion in this thread on:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://groups.google.com/forum/?hl=en&amp;amp;fromgroups=#!topic/clojure/KyQrbph-zqo&quot;&gt;https://groups.google.com/forum/?hl=en&amp;amp;fromgroups=#!topic/clojure/KyQrbph-zqo&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30689" author="jafingerhut" created="Sun, 3 Mar 2013 08:11:29 -0600"  >&lt;p&gt;Voting on a ticket (click the &quot;Vote&quot; link under the &quot;People&quot; heading while viewing the ticket on JIRA) may help draw attention to it, too.&lt;/p&gt;</comment>
                    <comment id="30695" author="jafingerhut" created="Mon, 4 Mar 2013 13:08:11 -0600"  >&lt;p&gt;Karsten, patches should be in the format created by the &quot;git format-patch&quot; command as described in the instructions under the heading &quot;Development&quot; on this page: &lt;a href=&quot;http://dev.clojure.org/display/design/JIRA+workflow&quot;&gt;http://dev.clojure.org/display/design/JIRA+workflow&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30696" author="toxi" created="Mon, 4 Mar 2013 14:05:51 -0600"  >&lt;p&gt;Sorry Andy, I used Atlassian SourceTree to create the patch and assumed it&apos;s in standard git format... I&apos;ve removed the old one and attach a (hopefully) properly formatted one. Apologies, contributing-beginners-luck!&lt;/p&gt;</comment>
                    <comment id="30850" author="stu" created="Sat, 30 Mar 2013 08:52:01 -0500"  >&lt;p&gt;While investigating this, I noticed that long-array coerces across type, e.g.&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;(seq (long-array [1.0]))
=&amp;gt; (1)
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Is this what we want? I don&apos;t think so.&lt;/p&gt;</comment>
                    <comment id="30851" author="stu" created="Sat, 30 Mar 2013 08:53:59 -0500"  >&lt;p&gt;I agree that all the numeric array constructors should work the same way, but I am not sue we should adopt long-array&apos;s approach, which allows coercion from float to integer types.&lt;/p&gt;</comment>
                    <comment id="31047" author="alexmiller" created="Fri, 3 May 2013 20:31:24 -0500"  >&lt;p&gt;I think the patch approach is valid. However, the patch does not cover the same problem in the 2-arity version of byte_array and short_array (when a size is supplied). Please update the patch to include a fix in the 2-arity version of byte_array and short_array and tests for the same. Ex: (byte-array 1 &lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt;).  &lt;/p&gt;

&lt;p&gt;Also, there is a whitespace issue in the patch - please just use spaces! &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;/Users/alex/work/code/clojure/.git/rebase-apply/patch:24: space before tab in indent.
	    	ret[i] = ((Number)s.first()).byteValue();
warning: 1 line adds whitespace errors.
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Re Stuart&apos;s comments, I don&apos;t think that&apos;s in the scope of this ticket or solution. &lt;/p&gt;</comment>
                    <comment id="31048" author="alexmiller" created="Fri, 3 May 2013 20:32:42 -0500"  >&lt;p&gt;Sending back to Karsten for the requested patch updates.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11890" name="byte-short-array-ctors.diff" size="1873" author="toxi" created="Mon, 4 Mar 2013 14:05:51 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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-445] Method/Constructor resolution does not factor in widening conversion of primitive args</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-445</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Problem:&lt;br/&gt;
When making java calls (or inlined functions), if both args and param are primitive, no widening conversion is used to locate the proper overloaded method/constructor.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;user=&amp;gt; (&lt;span class=&quot;code-object&quot;&gt;Integer&lt;/span&gt;. (&lt;span class=&quot;code-object&quot;&gt;byte&lt;/span&gt; 0))
java.lang.IllegalArgumentException: No matching ctor found &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; class java.lang.&lt;span class=&quot;code-object&quot;&gt;Integer&lt;/span&gt; (NO_SOURCE_FILE:0)
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
The above occurs because there is no &lt;span class=&quot;code-object&quot;&gt;Integer&lt;/span&gt;(&lt;span class=&quot;code-object&quot;&gt;byte&lt;/span&gt;) constructor, though it should match on &lt;span class=&quot;code-object&quot;&gt;Integer&lt;/span&gt;(&lt;span class=&quot;code-object&quot;&gt;int&lt;/span&gt;).
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;user=&amp;gt; (bit-shift-left (&lt;span class=&quot;code-object&quot;&gt;byte&lt;/span&gt; 1) 1)
Reflection warning, NO_SOURCE_PATH:3 - call to shiftLeft can&apos;t be resolved.
2&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;In the above, a call is made via reflection to Numbers.shiftLeft(Object, Object) and its associated auto-boxing, instead of directly to the perfectly adequate Numbers.shiftLeft(long, int).&lt;/p&gt;

&lt;p&gt;Workarounds:&lt;br/&gt;
Explicitly casting to the formal type.&lt;/p&gt;

&lt;p&gt;Ancillary benefits of fixing:&lt;br/&gt;
It would also reduce the amount of method overloading, e.g., RT.intCast(char), intCast(byte), intCast(short), could all be removed, since such calls would pass to RT.intCast(int).&lt;/p&gt;</description>
                <environment></environment>
            <key id="13842">CLJ-445</key>
            <summary>Method/Constructor resolution does not factor in widening conversion of primitive args</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="3" iconUrl="http://dev.clojure.org/jira/images/icons/status_inprogress.gif">In Progress</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="ataggart">Alexander Taggart</assignee>
                                <reporter username="ataggart">Alexander Taggart</reporter>
                        <labels>
                    </labels>
                <created>Wed, 29 Sep 2010 01:02:00 -0500</created>
                <updated>Mon, 20 Feb 2012 14:04:42 -0600</updated>
                                                    <fixVersion>Reviewed Backlog</fixVersion>
                                        <due></due>
                    <votes>2</votes>
                        <watches>4</watches>
                        <comments>
                    <comment id="24255" author="importer" created="Sat, 23 Oct 2010 18:43:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/445&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/445&lt;/a&gt;&lt;br/&gt;
Attachments:&lt;br/&gt;
fixbug445.diff - &lt;a href=&quot;https://www.assembla.com/spaces/clojure/documents/b6gDSUZOur36b9eJe5cbCb/download/b6gDSUZOur36b9eJe5cbCb&quot;&gt;https://www.assembla.com/spaces/clojure/documents/b6gDSUZOur36b9eJe5cbCb/download/b6gDSUZOur36b9eJe5cbCb&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="24256" author="importer" created="Sat, 23 Oct 2010 18:43:00 -0500"  >&lt;p&gt;ataggart said: [&lt;a href=&quot;file:b6gDSUZOur36b9eJe5cbCb&quot;&gt;file:b6gDSUZOur36b9eJe5cbCb&lt;/a&gt;]&lt;/p&gt;</comment>
                    <comment id="24257" author="importer" created="Sat, 23 Oct 2010 18:43:00 -0500"  >&lt;p&gt;ataggart said: Also fixes #446.&lt;/p&gt;</comment>
                    <comment id="26001" author="stu" created="Fri, 3 Dec 2010 12:50:23 -0600"  >&lt;p&gt;The patch is causing a test failure &lt;/p&gt;

&lt;div class=&quot;code panel&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] Exception in thread &lt;span class=&quot;code-quote&quot;&gt;&quot;main&quot;&lt;/span&gt; java.lang.IllegalArgumentException: 
     More than one matching method found: equiv, compiling:(clojure/pprint/cl_format.clj:428)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Can you take a look?&lt;/p&gt;</comment>
                    <comment id="26192" author="stu" created="Fri, 28 Jan 2011 12:30:18 -0600"  >&lt;p&gt;The failing test happens when trying to find the correct equiv for signature &lt;tt&gt;(Number, long)&lt;/tt&gt;. Is the compiler wrong to propose this signature, or is the resolution method wrong in not having an answer? (It thinks two signatures are tied: &lt;tt&gt;(Object, long)&lt;/tt&gt; and &lt;tt&gt;(Number, Number)&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;Exception in thread &lt;span class=&quot;code-quote&quot;&gt;&quot;main&quot;&lt;/span&gt; java.lang.IllegalArgumentException: More than one matching method found: equiv, compiling:(clojure/pprint/cl_format.clj:428)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6062)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5827)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6050)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.access$100(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:35)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$LetExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5492)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6055)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6043)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6043)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5827)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$IfExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:2372)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6055)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6043)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5827)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$InvokeExpr.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:3277)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6057)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5827)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$BodyExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5231)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$LetExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5527)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6055)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6043)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5827)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$BodyExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5231)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6055)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5827)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$IfExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:2385)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6055)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5827)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$BodyExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5231)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$LetExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5527)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6055)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6043)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5827)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$IfExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:2385)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6055)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5827)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$BodyExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5231)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$LetExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5527)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6055)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6043)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5827)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$BodyExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5231)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$FnMethod.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:4667)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$FnExpr.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:3397)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6053)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6043)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.access$100(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:35)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$DefExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:480)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6055)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5866)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyze(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:5827)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.eval(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6114)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.load(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6545)
	at clojure.lang.RT.loadResourceScript(RT.java:340)
	at clojure.lang.RT.loadResourceScript(RT.java:331)
	at clojure.lang.RT.load(RT.java:409)
	at clojure.lang.RT.load(RT.java:381)
	at clojure.core$load$fn__1427.invoke(core.clj:5308)
	at clojure.core$load.doInvoke(core.clj:5307)
	at clojure.lang.RestFn.invoke(RestFn.java:409)
	at clojure.pprint$eval3969.invoke(pprint.clj:46)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.eval(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6110)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.load(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6545)
	at clojure.lang.RT.loadResourceScript(RT.java:340)
	at clojure.lang.RT.loadResourceScript(RT.java:331)
	at clojure.lang.RT.load(RT.java:409)
	at clojure.lang.RT.load(RT.java:381)
	at clojure.core$load$fn__1427.invoke(core.clj:5308)
	at clojure.core$load.doInvoke(core.clj:5307)
	at clojure.lang.RestFn.invoke(RestFn.java:409)
	at clojure.core$load_one.invoke(core.clj:5132)
	at clojure.core$load_lib.doInvoke(core.clj:5169)
	at clojure.lang.RestFn.applyTo(RestFn.java:143)
	at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:77)
	at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28)
	at clojure.core$apply.invoke(core.clj:602)
	at clojure.core$load_libs.doInvoke(core.clj:5203)
	at clojure.lang.RestFn.applyTo(RestFn.java:138)
	at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:77)
	at clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28)
	at clojure.core$apply.invoke(core.clj:604)
	at clojure.core$use.doInvoke(core.clj:5283)
	at clojure.lang.RestFn.invoke(RestFn.java:409)
	at clojure.main$repl.doInvoke(main.clj:196)
	at clojure.lang.RestFn.invoke(RestFn.java:422)
	at clojure.main$repl_opt.invoke(main.clj:267)
	at clojure.main$main.doInvoke(main.clj:362)
	at clojure.lang.RestFn.invoke(RestFn.java:409)
	at clojure.lang.Var.invoke(Var.java:401)
	at clojure.lang.AFn.applyToHelper(AFn.java:163)
	at clojure.lang.Var.applyTo(Var.java:518)
	at clojure.main.main(main.java:37)
Caused by: java.lang.IllegalArgumentException: More than one matching method found: equiv
	at clojure.lang.Reflector.getMatchingParams(Reflector.java:639)
	at clojure.lang.Reflector.getMatchingParams(Reflector.java:578)
	at clojure.lang.Reflector.getMatchingMethod(Reflector.java:569)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$StaticMethodExpr.&amp;lt;init&amp;gt;(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:1439)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;$HostExpr$Parser.parse(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:896)
	at clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.analyzeSeq(&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6055)
	... 115 more&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="26214" author="ataggart" created="Tue, 8 Feb 2011 18:27:03 -0600"  >&lt;p&gt;In working on implementing support for vararg methods, I found a number of flaws with the previous solutions.  Please disregard them.&lt;/p&gt;

&lt;p&gt;I&apos;ve attached a single patch (reflector-compiler-numbers.diff) which is a rather substantial overhaul of the Reflector code, with some enhancements to the Compiler and Numbers code.  &lt;/p&gt;

&lt;p&gt;The patch notes:&lt;/p&gt;

&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;Moved reflection functionality from Compiler to Reflector.&lt;/li&gt;
	&lt;li&gt;Reflector supports finding overloaded methods by widening conversion, boxing conversion, and casting.&lt;/li&gt;
	&lt;li&gt;During compilation Reflector attempts to find best wildcard match.&lt;/li&gt;
	&lt;li&gt;Reflector refers to &lt;tt&gt;&amp;#42;unchecked-math*&lt;/tt&gt; when reflectively invoking methods and constructors.&lt;/li&gt;
	&lt;li&gt;Both Reflector and Compiler support variable arity java methods and constructor; backwards compatible with passing an array or nil in the vararg slot.&lt;/li&gt;
	&lt;li&gt;Added more informative error messages to Reflector.&lt;/li&gt;
	&lt;li&gt;Added tests to clojure.test-clojure.reflector.&lt;/li&gt;
	&lt;li&gt;Altered overloaded functions of clojure.lang.Numbers to service Object/double/long params; fixes some ambiguity issues and avoids unnecessary boxing in some cases.&lt;/li&gt;
	&lt;li&gt;Patch closes issues 380, 440, 445, 666, and possibly 259 (not enough detail provided).&lt;/li&gt;
&lt;/ul&gt;
</comment>
                    <comment id="26215" author="ataggart" created="Thu, 10 Feb 2011 19:35:57 -0600"  >&lt;p&gt;Updated patch to fix a bug where a concrete class with multiple identical Methods (e.g., one from an interface, another from an abstract class) would result in ambiguity.  Now resolved by arbitrary selection (this is what the original code did as well albeit not explicitly).&lt;/p&gt;</comment>
                    <comment id="26245" author="ataggart" created="Fri, 25 Feb 2011 21:29:21 -0600"  >&lt;p&gt;Updated patch to work with latest master branch.&lt;/p&gt;</comment>
                    <comment id="26289" author="stu" created="Sun, 6 Mar 2011 13:54:58 -0600"  >&lt;p&gt;patch appears to be missing test file clojure/test_clojure/reflector.clj.&lt;/p&gt;</comment>
                    <comment id="26290" author="ataggart" created="Sun, 6 Mar 2011 14:39:37 -0600"  >&lt;p&gt;Bit by git.&lt;/p&gt;

&lt;p&gt;Patch corrected to contain clojure.test-clojure.reflector.&lt;/p&gt;</comment>
                    <comment id="26300" author="stu" created="Fri, 11 Mar 2011 10:30:59 -0600"  >&lt;p&gt;Rich: I verified that the patch applied but reviewed only briefly, knowing you will want to go over this one closely.&lt;/p&gt;</comment>
                    <comment id="26301" author="stu" created="Fri, 11 Mar 2011 10:55:21 -0600"  >&lt;p&gt;After applying this patch, I am getting method missing errors:&lt;/p&gt;

&lt;div class=&quot;code panel&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.NoSuchMethodError: clojure.lang.Numbers.lt(JLjava/lang/&lt;span class=&quot;code-object&quot;&gt;Object&lt;/span&gt;;)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;but only when using compiled code, e.g. the same code works in the REPL and then fails after compilation. Haven&apos;t been able to isolate an example that I can share here yet, but hoping this will cause someone to have an &quot;a, hah&quot; moment...&lt;/p&gt;</comment>
                    <comment id="26341" author="ataggart" created="Sat, 2 Apr 2011 12:55:14 -0500"  >&lt;p&gt;The patch now contains only the minimal changes needed to support widening conversion. Cleanup of Numbers overloads, etc., can wait until this patch gets applied.  The vararg support is in a separate patch on &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-440&quot; title=&quot;java method calls cannot omit varargs&quot;&gt;CLJ-440&lt;/a&gt;.&lt;/p&gt;</comment>
                    <comment id="26370" author="redinger" created="Fri, 15 Apr 2011 12:50:43 -0500"  >&lt;p&gt;Please test patch&lt;/p&gt;</comment>
                    <comment id="26377" author="redinger" created="Thu, 21 Apr 2011 11:02:31 -0500"  >&lt;p&gt;FYI: Patch applies cleanly on master and all tests pass as of 4/21 (2011)&lt;/p&gt;</comment>
                    <comment id="26384" author="redinger" created="Fri, 22 Apr 2011 09:57:18 -0500"  >&lt;p&gt;This work is too big to take into the 1.3 beta right now. We&apos;ll revisit for a future release.&lt;/p&gt;</comment>
                    <comment id="26399" author="ataggart" created="Thu, 28 Apr 2011 13:19:50 -0500"  >&lt;p&gt;To better facilitate understanding of the changes, I&apos;ve broken them up into two patches, each with a number of isolable, incremental commits:&lt;/p&gt;

&lt;p&gt;&lt;b&gt;reorg-reflector.patch:&lt;/b&gt; Moves the reflection/invocation code from Compiler to Reflector, and eliminates redundant code.  The result is a single code base for resolving methods/constructors, which will allow for altering that mechanism without excess external coordination.  &lt;em&gt;This contains no behaviour changes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;prim-conversion.patch:&lt;/b&gt; Depends on the above. Alters the method/constructor resolution process:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;more consistent with java resolution, especially when calling pre-1.5 APIs&lt;/li&gt;
	&lt;li&gt;adds support for widening conversion of primitive numerics of the same category (this is more strict than java, and more clojuresque)&lt;/li&gt;
	&lt;li&gt;adds support for wildcard matches at compile-time (i.e., you don&apos;t need to type-hint every arg to avoid reflection).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;This also provides a base to add further features, e.g., &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-666&quot; title=&quot;Add support for Big* numeric types to Reflector&quot;&gt;CLJ-666&lt;/a&gt;.&lt;/p&gt;</comment>
                    <comment id="26406" author="ataggart" created="Fri, 29 Apr 2011 15:01:22 -0500"  >&lt;p&gt;It&apos;s documented in situ, but here are the conversion rules that the reflector uses to find methods:&lt;/p&gt;


&lt;ol&gt;
	&lt;li&gt;By Type:
	&lt;ul&gt;
		&lt;li&gt;object to ancestor type&lt;/li&gt;
		&lt;li&gt;primitive to a wider primitive of the same numeric category (new)&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;Boxing:
	&lt;ul&gt;
		&lt;li&gt;boxed number to its primitive&lt;/li&gt;
		&lt;li&gt;boxed number to a wider primitive of the same numeric category (new for Short and Byte args)&lt;/li&gt;
		&lt;li&gt;primitive to its boxed value&lt;/li&gt;
		&lt;li&gt;primitive to Number or Object (new)&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;Casting:
	&lt;ul&gt;
		&lt;li&gt;long to int&lt;/li&gt;
		&lt;li&gt;double to float&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ol&gt;
</comment>
                    <comment id="26428" author="ataggart" created="Tue, 10 May 2011 15:13:33 -0500"  >&lt;p&gt;prim-conversion-update-1.patch applies to current master.&lt;/p&gt;</comment>
                    <comment id="26429" author="ataggart" created="Wed, 11 May 2011 14:15:13 -0500"  >&lt;p&gt;Created &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-792&quot; title=&quot;Refactor method resolution code out of Compiler and into Reflector&quot;&gt;CLJ-792&lt;/a&gt; for the reflector reorg.&lt;/p&gt;</comment>
                    <comment id="27753" author="stuart.sierra" created="Fri, 17 Feb 2012 14:29:42 -0600"  >&lt;p&gt;prim-conversion-update-1.patch does not apply as of f5bcf64. &lt;/p&gt;

&lt;p&gt;Is &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-792&quot; title=&quot;Refactor method resolution code out of Compiler and into Reflector&quot;&gt;CLJ-792&lt;/a&gt; now a prerequisite of this ticket?&lt;/p&gt;</comment>
                    <comment id="27758" author="ataggart" created="Fri, 17 Feb 2012 15:15:17 -0600"  >&lt;p&gt;Yes, after the original patch was deemed &quot;too big&quot;.&lt;/p&gt;

&lt;p&gt;After this much time with no action from TPTB, feel free to kill both tickets.&lt;/p&gt;</comment>
                    <comment id="27778" author="jafingerhut" created="Mon, 20 Feb 2012 14:04:42 -0600"  >&lt;p&gt;Again, not sure if this is any help, but I&apos;ve tested starting from Clojure head as of Feb 20, 2012, applying clj-792-reorg-reflector-patch2.txt attached to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-792&quot; title=&quot;Refactor method resolution code out of Compiler and into Reflector&quot;&gt;CLJ-792&lt;/a&gt;, and then applying clj-445-prim-conversion-update-2-patch.txt attached to this ticket, and the result compiles and passes all but 2 tests.  I don&apos;t know whether those failures are easy to fix or not, or whether issues may have been introduced with these patches.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10932" name="clj-445-prim-conversion-update-2-patch.txt" size="36531" author="jafingerhut" created="Mon, 20 Feb 2012 14:04:42 -0600" />
                    <attachment id="10205" name="prim-conversion.patch" size="36375" author="ataggart" created="Fri, 29 Apr 2011 06:43:21 -0500" />
                    <attachment id="10225" name="prim-conversion-update-1.patch" size="36473" author="ataggart" created="Tue, 10 May 2011 15:13:33 -0500" />
                    <attachment id="10203" name="reorg-reflector.patch" size="73345" author="ataggart" created="Thu, 28 Apr 2011 13:19:50 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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-415] smarter assert (prints locals)</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-415</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Here is an implementation you can paste into a repl. Feedback wanted:&lt;/p&gt;

&lt;div class=&quot;code panel&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 ^{:&lt;span class=&quot;code-keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;} local-bindings
  &lt;span class=&quot;code-quote&quot;&gt;&quot;Produces a map of the names of local bindings to their values.&quot;&lt;/span&gt;
  [env]
  (let [symbols (map key env)]
    (zipmap (map (fn [sym] `(quote ~sym)) symbols) symbols)))

(defmacro &lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt;
  &quot;Evaluates expr and &lt;span class=&quot;code-keyword&quot;&gt;throws&lt;/span&gt; an exception &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; it does not evaluate to
 logical &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;.&quot;
  {:added &lt;span class=&quot;code-quote&quot;&gt;&quot;1.0&quot;&lt;/span&gt;}
  [x]
  (when *&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt;*
    (let [bindings (local-bindings &amp;amp;env)]
      `(when-not ~x
         (let [sep# (&lt;span class=&quot;code-object&quot;&gt;System&lt;/span&gt;/getProperty &lt;span class=&quot;code-quote&quot;&gt;&quot;line.separator&quot;&lt;/span&gt;)]
           (&lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; (AssertionError. (apply str &lt;span class=&quot;code-quote&quot;&gt;&quot;Assert failed: &quot;&lt;/span&gt; (pr-str &apos;~x) sep#
                                          (map (fn [[k# v#]] (str &lt;span class=&quot;code-quote&quot;&gt;&quot;\t&quot;&lt;/span&gt; k# &lt;span class=&quot;code-quote&quot;&gt;&quot; : &quot;&lt;/span&gt; v# sep#)) ~bindings)))))))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="13812">CLJ-415</key>
            <summary>smarter assert (prints locals)</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="importer">Assembla Importer</reporter>
                        <labels>
                    </labels>
                <created>Thu, 29 Jul 2010 17:45:00 -0500</created>
                <updated>Sun, 18 Nov 2012 01:06:07 -0600</updated>
                                                    <fixVersion>Approved Backlog</fixVersion>
                                        <due></due>
                    <votes>2</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="24161" author="importer" created="Tue, 24 Aug 2010 17:41:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/415&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/415&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="24162" author="importer" created="Tue, 24 Aug 2010 17:41:00 -0500"  >&lt;p&gt;alexdmiller said: A simple example I tried for illustration:&lt;/p&gt;

&lt;div class=&quot;code panel&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 1 b 2] (&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt; (= a b)))
#&amp;lt;CompilerException java.lang.AssertionError: Assert failed: (= a b)
 a : 1
 b : 2&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="24163" author="importer" created="Tue, 24 Aug 2010 17:41:00 -0500"  >&lt;p&gt;fogus said: Of course it&apos;s weird if you do something like:&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(let [x 1 y 2 z 3 a 1 b 2 c 3] (&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt; (= x y)))
java.lang.AssertionError: Assert failed: (= x y)
 x : 1
 y : 2
 z : 3
 a : 1
 b : 2
 c : 3
 (NO_SOURCE_FILE:0)
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;

So maybe it could be slightly changed to:
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;(defmacro &lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt;
  &lt;span class=&quot;code-quote&quot;&gt;&quot;Evaluates expr and &lt;span class=&quot;code-keyword&quot;&gt;throws&lt;/span&gt; an exception &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; it does not evaluate to logical &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;.&quot;&lt;/span&gt;
  {:added &lt;span class=&quot;code-quote&quot;&gt;&quot;1.0&quot;&lt;/span&gt;}
  [x]
  (when *&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt;*
    (let [bindings (local-bindings &amp;amp;env)]
      `(when-not ~x
         (let [sep#  (&lt;span class=&quot;code-object&quot;&gt;System&lt;/span&gt;/getProperty &lt;span class=&quot;code-quote&quot;&gt;&quot;line.separator&quot;&lt;/span&gt;)
               form# &apos;~x]
           (&lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; (AssertionError. (apply str &lt;span class=&quot;code-quote&quot;&gt;&quot;Assert failed: &quot;&lt;/span&gt; (pr-str form#) sep#
                                          (map (fn [[k# v#]] 
                                                 (when (some #{k#} form#) 
                                                   (str &lt;span class=&quot;code-quote&quot;&gt;&quot;\t&quot;&lt;/span&gt; k# &lt;span class=&quot;code-quote&quot;&gt;&quot; : &quot;&lt;/span&gt; v# sep#))) 
                                               ~bindings)))))))))
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;

So that. now it&apos;s just:
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;(let [x 1 y 2 z 3 a 1 b 2 c 3] (&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt; (= x y)))
java.lang.AssertionError: Assert failed: (= x y)
 x : 1
 y : 2
 (NO_SOURCE_FILE:0)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;:f&lt;/p&gt;</comment>
                    <comment id="24164" author="importer" created="Tue, 24 Aug 2010 17:41:00 -0500"  >&lt;p&gt;fogus said: Hmmm, but that fails entirely for: (let &lt;span class=&quot;error&quot;&gt;&amp;#91;x 1 y 2 z 3 a 1 b 2 c 3&amp;#93;&lt;/span&gt; (assert (= &lt;span class=&quot;error&quot;&gt;&amp;#91;x y&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;a c&amp;#93;&lt;/span&gt;))).  So maybe it&apos;s better just to print all of the locals unless you really want to get complicated.&lt;br/&gt;
:f&lt;/p&gt;</comment>
                    <comment id="24165" author="importer" created="Tue, 24 Aug 2010 17:41:00 -0500"  >&lt;p&gt;jawolfe said: See also some comments in:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://groups.google.com/group/clojure-dev/browse_frm/thread/68d49cd7eb4a4899/9afc6be4d3f8ae27?lnk=gst&amp;amp;q=assert#9afc6be4d3f8ae27&quot;&gt;http://groups.google.com/group/clojure-dev/browse_frm/thread/68d49cd7eb4a4899/9afc6be4d3f8ae27?lnk=gst&amp;amp;q=assert#9afc6be4d3f8ae27&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Plus one more suggestion to add to the mix:  in addition to / instead of printing the locals, how about saving them somewhere.  For example, the var &lt;b&gt;assert-bindings&lt;/b&gt; could be bound to the map of locals.  This way you don&apos;t run afoul of infinite/very large sequences, and allow the user to do more detailed interrogation of the bad values (especially useful when some of the locals print opaquely).&lt;/p&gt;</comment>
                    <comment id="24166" author="importer" created="Tue, 24 Aug 2010 17:41:00 -0500"  >&lt;p&gt;stuart.sierra said: Another approach, which I wil willingly donate:&lt;br/&gt;
&lt;a href=&quot;http://github.com/stuartsierra/lazytest/blob/master/src/main/clojure/lazytest/expect.clj&quot;&gt;http://github.com/stuartsierra/lazytest/blob/master/src/main/clojure/lazytest/expect.clj&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="26034" author="jweiss" created="Wed, 15 Dec 2010 13:33:52 -0600"  >&lt;p&gt;There&apos;s one more tweak to fogus&apos;s last comment, which I&apos;m actually using.  You need to flatten the quoted form before you can use &apos;some&apos; to check whether the local was used in the form:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defmacro &lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt;
  &lt;span class=&quot;code-quote&quot;&gt;&quot;Evaluates expr and &lt;span class=&quot;code-keyword&quot;&gt;throws&lt;/span&gt; an exception &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; it does not evaluate to logical &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;.&quot;&lt;/span&gt;
  {:added &lt;span class=&quot;code-quote&quot;&gt;&quot;1.0&quot;&lt;/span&gt;}
  [x]
  (when *&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt;*
    (let [bindings (local-bindings &amp;amp;env)]
      `(when-not ~x
         (let [sep#  (&lt;span class=&quot;code-object&quot;&gt;System&lt;/span&gt;/getProperty &lt;span class=&quot;code-quote&quot;&gt;&quot;line.separator&quot;&lt;/span&gt;)
               form# &apos;~x]
           (&lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; (AssertionError. (apply str &lt;span class=&quot;code-quote&quot;&gt;&quot;Assert failed: &quot;&lt;/span&gt; (pr-str form#) sep#
                                          (map (fn [[k# v#]] 
                                                 (when (some #{k#} (flatten form#)) 
                                                   (str &lt;span class=&quot;code-quote&quot;&gt;&quot;\t&quot;&lt;/span&gt; k# &lt;span class=&quot;code-quote&quot;&gt;&quot; : &quot;&lt;/span&gt; v# sep#))) 
                                               ~bindings)))))))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="26087" author="stu" created="Tue, 4 Jan 2011 20:31:17 -0600"  >&lt;p&gt;I am holding off on this until we have more solidity around &lt;a href=&quot;http://dev.clojure.org/display/design/Error+Handling&quot;&gt;http://dev.clojure.org/display/design/Error+Handling&lt;/a&gt;. (Considering, for instance, having &lt;b&gt;all&lt;/b&gt; exceptions thrown from Clojure provide access to locals.)&lt;/p&gt;

&lt;p&gt;When my pipe dream fades I will come back and screen this before the next release.&lt;/p&gt;</comment>
                    <comment id="26194" author="stu" created="Fri, 28 Jan 2011 13:14:13 -0600"  >&lt;p&gt;Why try to guess what someone wants to do with the locals (or any other context, for that matter) when you can specify a callback (see below). This would have been useful last week when I had an assertion that failed only on the CI box, where no debugger is available.&lt;/p&gt;

&lt;p&gt;Rich, at the risk of beating a dead horse, I still think this is a good idea. Debuggers are not always available, and this is an example of where a Lisp is intrinsically capable of providing better information than can be had in other environments. If you want a patch for the code below please mark waiting on me, otherwise please decline this ticket so I stop looking at it. &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(def ^:dynamic *&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt;-handler* nil)

(defn ^{:&lt;span class=&quot;code-keyword&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;true&lt;/span&gt;} local-bindings
  &lt;span class=&quot;code-quote&quot;&gt;&quot;Produces a map of the names of local bindings to their values.&quot;&lt;/span&gt;
  [env]
  (let [symbols (map key env)]
    (zipmap (map (fn [sym] `(quote ~sym)) symbols) symbols)))

(defmacro &lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt;
  [x]
  (when *&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt;*
    (let [bindings (local-bindings &amp;amp;env)]
      `(when-not ~x
         (let [sep#  (&lt;span class=&quot;code-object&quot;&gt;System&lt;/span&gt;/getProperty &lt;span class=&quot;code-quote&quot;&gt;&quot;line.separator&quot;&lt;/span&gt;)
               form# &apos;~x]
           (&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; *&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt;-handler*
             (*&lt;span class=&quot;code-keyword&quot;&gt;assert&lt;/span&gt;-handler* form# ~bindings)
             (&lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; (AssertionError. (apply str &lt;span class=&quot;code-quote&quot;&gt;&quot;Assert failed: &quot;&lt;/span&gt; (pr-str form#) sep#
                                            (map (fn [[k# v#]] 
                                                   (when (some #{k#} (flatten form#)) 
                                                     (str &lt;span class=&quot;code-quote&quot;&gt;&quot;\t&quot;&lt;/span&gt; k# &lt;span class=&quot;code-quote&quot;&gt;&quot; : &quot;&lt;/span&gt; v# sep#))) 
                                                 ~bindings))))))))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="26461" author="jweiss" created="Fri, 27 May 2011 08:16:40 -0500"  >&lt;p&gt;A slight improvement I made in my own version of this code:  flatten does not affect set literals.  So if you do (assert (some #{x} &lt;span class=&quot;error&quot;&gt;&amp;#91;a b c d&amp;#93;&lt;/span&gt;))  the value of x will not be printed.  Here&apos;s a modified flatten that does the job:&lt;/p&gt;

&lt;div class=&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;(defn symbols [sexp]
  &quot;Returns just the symbols from the expression, including those
   inside literals (sets, maps, lists, vectors).&quot;
  (distinct (filter symbol? (tree-seq coll? seq sexp))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29961" author="jafingerhut" created="Sun, 18 Nov 2012 01:06:07 -0600"  >&lt;p&gt;Attaching git format patch clj-415-assert-prints-locals-v1.txt of Stuart Halloway&apos;s version of this idea.  I&apos;m not advocating it over the other variations, just getting a file attached to the JIRA ticket.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11684" name="clj-415-assert-prints-locals-v1.txt" size="1581" author="jafingerhut" created="Sun, 18 Nov 2012 01:06:07 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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_10003" key="com.atlassian.jira.plugin.system.customfieldtypes:userpicker">
                <customfieldname>Waiting On</customfieldname>
                <customfieldvalues>
                    <customfieldvalue>richhickey</customfieldvalue>
                </customfieldvalues>
            </customfield>
                            </customfields>
    </item>

<item>
            <title>[CLJ-373] update-in with empty key paths</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-373</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;To the topic of get-in and update-in. While I realize this is not a bug it is odd and in my eyes unexpected and unwanted behavior.&lt;/p&gt;

&lt;p&gt;get-in called with an empty path returns the hashmap it was given to walk through - this is as I expect and makes a lot of sense when dynamically (with generated pathes ) walking a hash map.&lt;/p&gt;

&lt;p&gt;update-in behaves differently and while from the implementation side, it&apos;s behavior too makes sense, it does not work as expected (at least not for me) update-in with an empty map creates a new key &apos;nil&apos; so:&lt;/p&gt;

&lt;p&gt;(update-in {...} [] f) ist he same as (update-in {...} &lt;span class=&quot;error&quot;&gt;&amp;#91;nil&amp;#93;&lt;/span&gt; f) while (get-in {...} []) is not the same as (get-in {...} &lt;span class=&quot;error&quot;&gt;&amp;#91;nil&amp;#93;&lt;/span&gt;) and of cause differs from what update-in does.&lt;/p&gt;

&lt;p&gt;For automatically walking trees the behavior of get-in makes a lot more sense since the current behavior of update-in forces you to check for empty paths and if they are empty fall back to plain assoc and get (or get-in since this works):&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(&lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt;-let [r (butlast @path)]
(&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt;
  (alter m update-in r dissoc (last @path))
  (alter m update-in r assoc {:name @sr} c))
(&lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt;
  (alter m dissoc (last @path))
  (alter m assoc {:name @sr} c)))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Next argument is that update-in with an empty map working on nil isn&apos;t easy to gasp, one needs to know the implementation details to realize that it works, I think 90% of the people reading update-in with [] will not instinctively know that it works on the key nil, so changing this would most likely not break any current code, and if it would the code would be bad anyway &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/tongue.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;.&lt;/p&gt;

&lt;p&gt;Chouser has, a very nice solution on the mailing list that would fix the problem I&apos;m not sure if I&apos;m entitled to post it here since I did not wrote it but it can be found in this thread: &lt;a href=&quot;http://groups.google.com/group/clojure/browse_thread/thread/de5b20b8c3fe498b?hl=en&quot;&gt;http://groups.google.com/group/clojure/browse_thread/thread/de5b20b8c3fe498b?hl=en&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Regards,&lt;br/&gt;
Heinz&lt;/p&gt;</description>
                <environment></environment>
            <key id="13770">CLJ-373</key>
            <summary>update-in with empty key paths</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="importer">Assembla Importer</reporter>
                        <labels>
                    </labels>
                <created>Fri, 4 Jun 2010 10:31:00 -0500</created>
                <updated>Sat, 8 Sep 2012 06:13:29 -0500</updated>
                                                                            <due></due>
                    <votes>1</votes>
                        <watches>4</watches>
                        <comments>
                    <comment id="23998" author="importer" created="Fri, 8 Oct 2010 10:33:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/373&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/373&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="25938" author="chouser@n01se.net" created="Sat, 13 Nov 2010 18:37:53 -0600"  >&lt;p&gt;I&apos;ve attached my code from the g.group thread in the form of a patch, in case it&apos;s sufficient.  (Thanks to abedra for the gentle kick in the pants.)&lt;/p&gt;</comment>
                    <comment id="25974" author="stu" created="Mon, 29 Nov 2010 08:20:59 -0600"  >&lt;p&gt;Looks to me like the patch is misusing if-let, 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;(when-let [[k &amp;amp; mk] []] &lt;span class=&quot;code-quote&quot;&gt;&quot;Doh!&quot;&lt;/span&gt;) 
=&amp;gt; Doh!&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Please correct, and add tests for &lt;tt&gt;nil&lt;/tt&gt; and &lt;tt&gt;[]&lt;/tt&gt; keys (at least).&lt;/p&gt;</comment>
                    <comment id="28412" author="scottlowe" created="Tue, 8 May 2012 12:20:53 -0500"  >&lt;p&gt;I will write some tests and correct this.&lt;/p&gt;</comment>
                    <comment id="28419" author="scottlowe" created="Wed, 9 May 2012 20:39:11 -0500"  >&lt;p&gt;I&apos;m sorry to report that my good intentions of wanting to help clear some of the project backlog has created more work by way of further questions. I&apos;d also like to clarify the desired new behaviours for the test cases.&lt;/p&gt;

&lt;p&gt;Heinz proposed that an empty key sequence will not create a new nil key in the returned map.&lt;br/&gt;
He also suggested that the following behaviour changes be made (compare old and new* behaviours):&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; 
(update-in {1 2} [] (constantly {2 3}))
{nil {2 3}, 1 2}

(update-in* {1 2} [] (constantly {2 3}))
{2 3}

(update-in {1 2} [] assoc  1 3)
{nil {1 3}, 1 2}

(update-in* {1 2} [] assoc  1 3)
{1 3}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; 

&lt;p&gt;Chouser also added that nil keys should be honoured, as 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; 
(update-in* {nil 2} [nil] (constantly 3))
{nil 3}
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt; 
&lt;p&gt;I&apos;ve added a variety of tests to cover the existing behaviour and would like to confirm that the above is all that&apos;s required for new behaviour.&lt;/p&gt;

&lt;p&gt;The patch from November 2010 didn&apos;t work, but I tweaked it with a &lt;em&gt;when-let&lt;/em&gt; as Stuart suggested and placed a check for an empty sequence of keys before the &lt;em&gt;when-let&lt;/em&gt; block; because essentially, the primary behaviour change boils down to simply handling an empty sequence of keys, in addition to the existing behaviours.&lt;/p&gt;

&lt;p&gt;I&apos;m not entirely convinced that these changes are a good thing, but at least there&apos;s now something concrete for discussion. Please have a look at what is there. The good news is that at least there are some tests covering &lt;em&gt;update-in&lt;/em&gt; now.&lt;/p&gt;</comment>
                    <comment id="28596" author="jafingerhut" created="Thu, 24 May 2012 22:35:24 -0500"  >&lt;p&gt;clj-373-alter-behavior-of-update-in-with-empty-key-patch2.txt dated May 24, 2012 supersedes patch 0001-&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-373&quot; title=&quot;update-in with empty key paths&quot;&gt;CLJ-373&lt;/a&gt;&lt;del&gt;Alter-behaviour-of-update-in-with-empty-key&lt;/del&gt;.patch dated May 9, 2012.  It makes no changes to the contents of the patch except in the lines of context that have changed since the earlier patch was created.  It applies cleanly to the latest master whereas the earlier patch no longer does.  Builds and passes tests with Oracle/Apple JDK 1.6 on Mac OS X 10.6.8.&lt;/p&gt;</comment>
                    <comment id="29176" author="fogus" created="Wed, 15 Aug 2012 11:21:49 -0500"  >&lt;p&gt;This patch creates a new error mode highlighted by the following:&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;(update-in {:a 1} [] inc)

; ClassCastException clojure.lang.PersistentArrayMap cannot be cast to java.lang.Number
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The reason is that the code that executes in the event that the keys are empty (or nil) blindly assumes that the function given can be applied to the map itself. This is no problem in the case of &lt;tt&gt;assoc&lt;/tt&gt; and the like, but clearly not for &lt;tt&gt;inc&lt;/tt&gt; and many other useful functions.&lt;/p&gt;

&lt;p&gt;The old behavior was to throw an NPE and if any code relies on that fact is now broken. Maybe this is not a problem, but I&apos;m kicking it back to get a little more discussion &lt;b&gt;and&lt;/b&gt; to request that whatever the ultimate fix happens to be, its behavioral changes and error modes are noted in the docstring for &lt;tt&gt;update-in&lt;/tt&gt;.&lt;/p&gt;</comment>
                    <comment id="29407" author="gv" created="Sat, 8 Sep 2012 06:11:44 -0500"  >&lt;p&gt;I vote for changing `update-in` to support empty key vectors.&lt;/p&gt;

&lt;p&gt;Because I think &quot;(apply f m args)&quot; in case of an empty vector is the natural continuation of the usual behavior of update-in:&lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;update-in with 2 keys the second level map is updated&lt;/li&gt;
	&lt;li&gt;update-in with 1 key the first level map (child of given map) is updated&lt;/li&gt;
	&lt;li&gt;update-in with no key the given map (zero level) is updated.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Otherwise, you will always have to wrap update-in in something like the following when the keys vector is computed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;    (if (seq keys) (apply update-in m keys f args) (apply f m args))&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;To Fogus&apos; last post: (update-in {:a {:b 1}} &lt;span class=&quot;error&quot;&gt;&amp;#91;:a&amp;#93;&lt;/span&gt; inc) fails similar and is not handled with a special exception.&lt;/p&gt;



</comment>
                </comments>
                    <attachments>
                    <attachment id="11182" name="0001-CLJ-373-Alter-behaviour-of-update-in-with-empty-key-.patch" size="2922" author="scottlowe" created="Wed, 9 May 2012 20:39:11 -0500" />
                    <attachment id="10019" name="0001-Support-empty-path-in-update-in.-CLJ-373.patch" size="949" author="chouser@n01se.net" created="Sat, 13 Nov 2010 18:37:53 -0600" />
                    <attachment id="11256" name="clj-373-alter-behavior-of-update-in-with-empty-key-patch2.txt" size="2901" author="jafingerhut" created="Thu, 24 May 2012 22:35:24 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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>chouser@n01se.net</customfieldvalue>
                </customfieldvalues>
            </customfield>
                            </customfields>
    </item>

<item>
            <title>[CLJ-346] (pprint-newline :fill) is not handled correctly</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-346</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Filled pretty printing (where we try to fit as many elements on a line as possible) is being too aggressive as we can see when we try to print the following array:&lt;/p&gt;

&lt;p&gt;user&amp;gt; (binding &lt;span class=&quot;error&quot;&gt;&amp;#91;*print-right-margin* 20&amp;#93;&lt;/span&gt; (pprint (int-array (range 10))))&lt;/p&gt;

&lt;p&gt;Produces:&lt;/p&gt;

&lt;p&gt;[0,&lt;br/&gt;
 1,&lt;br/&gt;
 2,&lt;br/&gt;
 3,&lt;br/&gt;
 4, 5, 6, 7, 8, 9]&lt;/p&gt;

&lt;p&gt;Rather than &lt;/p&gt;

&lt;p&gt;[0, 1, 2, 3, 4,&lt;br/&gt;
 5, 6, 7, 8, 9]&lt;/p&gt;

&lt;p&gt;or something like that. (I haven&apos;t worked through the exact correct representation for this case).&lt;/p&gt;

&lt;p&gt;We currently only use :fill style newlines for native java arrays.&lt;/p&gt;</description>
                <environment></environment>
            <key id="13743">CLJ-346</key>
            <summary>(pprint-newline :fill) is not handled correctly</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="tomfaulhaber">Tom Faulhaber</assignee>
                                <reporter username="importer">Assembla Importer</reporter>
                        <labels>
                    </labels>
                <created>Wed, 12 May 2010 09:45:00 -0500</created>
                <updated>Mon, 29 Nov 2010 20:48:05 -0600</updated>
                                                    <fixVersion>Backlog</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="23878" author="importer" created="Tue, 24 Aug 2010 08:01:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/346&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/346&lt;/a&gt;&lt;br/&gt;
Attachments:&lt;br/&gt;
0347-pprint-update-2.diff - &lt;a href=&quot;https://www.assembla.com/spaces/clojure/documents/diLxv6y4Sr35GVeJe5cbLr/download/diLxv6y4Sr35GVeJe5cbLr&quot;&gt;https://www.assembla.com/spaces/clojure/documents/diLxv6y4Sr35GVeJe5cbLr/download/diLxv6y4Sr35GVeJe5cbLr&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="23879" author="importer" created="Tue, 24 Aug 2010 08:01:00 -0500"  >&lt;p&gt;stu said: [&lt;a href=&quot;file:diLxv6y4Sr35GVeJe5cbLr&quot;&gt;file:diLxv6y4Sr35GVeJe5cbLr&lt;/a&gt;]&lt;/p&gt;</comment>
                    <comment id="23880" author="importer" created="Tue, 24 Aug 2010 08:01:00 -0500"  >&lt;p&gt;stu said: The second patch includes the first, and adds another test.&lt;/p&gt;</comment>
                    <comment id="23881" author="importer" created="Tue, 24 Aug 2010 08:01:00 -0500"  >&lt;p&gt;tomfaulhaber said: This patch was attached to the wrong bug. It should be attached to bug #347. There is no fix for this bug yet.&lt;/p&gt;</comment>
                    <comment id="25921" author="richhickey" created="Fri, 5 Nov 2010 08:07:14 -0500"  >&lt;p&gt;Is this current?&lt;/p&gt;</comment>
                    <comment id="25980" author="stu" created="Mon, 29 Nov 2010 20:48:05 -0600"  >&lt;p&gt;Tom, this patch doesn&apos;t apply, and I am not sure why. Can you take a look?&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="10006">Incomplete</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_10003" key="com.atlassian.jira.plugin.system.customfieldtypes:userpicker">
                <customfieldname>Waiting On</customfieldname>
                <customfieldvalues>
                    <customfieldvalue>tomfaulhaber</customfieldvalue>
                </customfieldvalues>
            </customfield>
                            </customfields>
    </item>

<item>
            <title>[CLJ-322] Enhance AOT compilation process to emit classfiles only for explicitly-specified namespaces</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-322</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Summary: still needs decision on implementation approach.&lt;/p&gt;

&lt;p&gt;This was &lt;a href=&quot;https://www.assembla.com/spaces/clojure-contrib/tickets/23&quot;&gt;originally/erroneously reported&lt;/a&gt; by Howard Lewis Ship in the clojure-contrib assembla:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;My build file specifies the namespaces to AOT compile but &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; I include another namespace
(even from a JAR dependency) that is not AOT compiled, the other namespace will be compiled as well.

In my &lt;span class=&quot;code-keyword&quot;&gt;case&lt;/span&gt;, I was using clojure-contrib&apos;s clojure.contrib.str-utils2 namespace, and I got a bunch of
clojure/contrib/str_utils2 classes in my output directory.

I think that the AOT compiler should NOT precompile any namespaces that are transitively reached,
only namespaces in the set specified by the command line are appropriate.

As currently coded, you will frequently find unwanted third-party dependencies in your output JARs;
further, &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; multiple parties depend on the same JARs, &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; could cause bloating and duplication in the
eventual runtime classpath.&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Having the option of shipping either all AOT-compiled classfiles or mixed source/AOT depending upon one&apos;s distribution requirements would make that phase of work with a clojure codebase significantly easier and less error-prone.  The only question in my mind is what the default should be.  We&apos;re all used to the current behaviour, but I&apos;d guess that any nontrivial project where the form of the distributable matters (i.e. the source/AOT mix), providing as much control as possible by default makes the most sense.  Given the tooling that most people are using, it&apos;s trivial (and common practice, IIUC) to provide a comprehensive list of namespaces one wishes to compile, so making that the default shouldn&apos;t be a hurdle to anyone.  If an escape hatch is desired, a --transitive switch to clojure.lang.Compile could be added.&lt;/p&gt;</description>
                <environment></environment>
            <key id="13719">CLJ-322</key>
            <summary>Enhance AOT compilation process to emit classfiles only for explicitly-specified namespaces</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="3" iconUrl="http://dev.clojure.org/jira/images/icons/status_inprogress.gif">In Progress</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="cemerick">Chas Emerick</reporter>
                        <labels>
                    </labels>
                <created>Thu, 29 Apr 2010 00:20:00 -0500</created>
                <updated>Fri, 24 May 2013 13:25:25 -0500</updated>
                                                    <fixVersion>Release 1.6</fixVersion>
                                        <due></due>
                    <votes>12</votes>
                        <watches>11</watches>
                        <comments>
                    <comment id="23775" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/322&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/322&lt;/a&gt;&lt;br/&gt;
Attachments:&lt;br/&gt;
aot-transitivity-option-compat-322.diff - &lt;a href=&quot;https://www.assembla.com/spaces/clojure/documents/aI7Eu-HeGr35ImeJe5cbLA/download/aI7Eu-HeGr35ImeJe5cbLA&quot;&gt;https://www.assembla.com/spaces/clojure/documents/aI7Eu-HeGr35ImeJe5cbLA/download/aI7Eu-HeGr35ImeJe5cbLA&lt;/a&gt;&lt;br/&gt;
aot-transitivity-option-322.diff - &lt;a href=&quot;https://www.assembla.com/spaces/clojure/documents/aIWFiWHeGr35ImeJe5cbLA/download/aIWFiWHeGr35ImeJe5cbLA&quot;&gt;https://www.assembla.com/spaces/clojure/documents/aIWFiWHeGr35ImeJe5cbLA/download/aIWFiWHeGr35ImeJe5cbLA&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="23776" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;hlship said: I&apos;d like to reinforce this.  I&apos;ve been doing research on Clojure build tools for an upcoming talk and all of them (Maven, Leiningen, Gradle) have the same problem: the AOT compile extends from the desired namespaces (such as one containing a :gen-class)  to every reached namespace.  This is going to cause a real ugliness when application A uses libraries B and C that both depend on library D (such as clojure-contrib) and B and C are thus both bloated with duplicate, unwanted AOT compiled  classes from the library D.&lt;/p&gt;</comment>
                    <comment id="23777" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;cemerick said: This behaviour is an implementation detail of Clojure&apos;s AOT compilation process, and is orthogonal to any particular build tooling.&lt;/p&gt;

&lt;p&gt;I am working on a patch that would provide a mechanism for such tooling to disable this default behaviour.&lt;/p&gt;</comment>
                    <comment id="23778" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;cemerick said: A first cut of a change to address this issue is here (&lt;b&gt;caution, work in progress!&lt;/b&gt;):&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/cemerick/clojure/commit/6f14e0790c0d283a7e44056adf1bb3f36bb16e0e&quot;&gt;http://github.com/cemerick/clojure/commit/6f14e0790c0d283a7e44056adf1bb3f36bb16e0e&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This makes available a new recognized system property, &lt;tt&gt;clojure.compiler.transitive&lt;/tt&gt;, which defaults to &lt;tt&gt;true&lt;/tt&gt;.  When set/bound to false (i.e. &lt;tt&gt;-Dclojure.compiler.transitive=false&lt;/tt&gt; when using &lt;tt&gt;clojure.lang.Compile&lt;/tt&gt;), only the first loaded file (either the ns named in the call to &lt;tt&gt;compile&lt;/tt&gt; or each of the namespaces named as arguments to &lt;tt&gt;clojure.lang.Compile&lt;/tt&gt;) will have classfiles written to disk.&lt;/p&gt;

&lt;p&gt;This means that this compilation invocation:&lt;/p&gt;
&lt;div class=&quot;code panel&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 -cp &amp;lt;your classpath&amp;gt; -Dclojure.compiler.transitive=&lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt; clojure.lang.Compile com.bar com.baz&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;will generate classfiles only for &lt;tt&gt;com.bar&lt;/tt&gt; and &lt;tt&gt;com.baz&lt;/tt&gt;, but not for any of the namespaces or other files they load, require, or use.&lt;/p&gt;

&lt;hr /&gt;
&lt;p&gt;The only shortcoming of this WIP patch is that classfiles &lt;b&gt;are&lt;/b&gt; still generated for proxy and gen-class classes defined outside of the explicitly-named namespaces.  What I thought was a solution for this ended up breaking the loading of generated interfaces (as produced by defprotocol, etc).&lt;/p&gt;

&lt;p&gt;I&apos;ll take a second look at this before the end of the week, but wanted to get this out there so as to get any comments people might have.&lt;/p&gt;</comment>
                    <comment id="23779" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;technomancy said: Looks good, but I&apos;m having trouble getting it to work. I tried compiling from master of Chas&apos;s fork on github, but I still got the all the .class files generated with -Dclojure.compiler.transitive=false. It could be a quirk of the way I&apos;m using ant to fork off processes though. Is it possible to set it using System/setProperty, or must it be given as a property on the command-line?&lt;/p&gt;</comment>
                    <comment id="23780" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;cemerick said: Bah, that&apos;s just bad documentation. :-/&lt;/p&gt;

&lt;p&gt;The system property is only provided by &lt;tt&gt;clojure.lang.Compile&lt;/tt&gt;; the value of it drives the binding of &lt;tt&gt;clojure.core/&lt;b&gt;transitive-compile&lt;/b&gt;&lt;/tt&gt;, which has a root binding of true.&lt;/p&gt;

&lt;p&gt;You should be able to configure the transitivity the same way you configure &lt;tt&gt;&lt;b&gt;compile-path&lt;/b&gt;&lt;/tt&gt; (system prop to &lt;tt&gt;clojure.lang.Compile&lt;/tt&gt; or a direct binding when at the REPL, etc).&lt;/p&gt;

&lt;p&gt;If not, ping me in irc or elsewhere.&lt;/p&gt;</comment>
                    <comment id="23781" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;meikelbrandmeyer said: I think, excluding parts &apos;load&apos;ed is a little strong. I have some namespaces which load several parts from different files, but which belong to the same namespace. The most prominent example of such a case is clojure.core itself. I&apos;m find with stopping require and use, but load is a bit too much, I&apos;d say.&lt;/p&gt;</comment>
                    <comment id="23782" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;technomancy said: Chas: Thanks; will give that a go.&lt;/p&gt;

&lt;p&gt;Meikel: Do people actually use load outside of clojure.core? I thought it was only used there because clojure.core is a &quot;special&quot; namespace where you want more vars to be available than can reasonably fit in a single file. Splitting up a namespace into several files is quite unadvisable otherwise.&lt;/p&gt;</comment>
                    <comment id="23783" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;technomancy said: I can confirm that this works for me modulo the proxy/gen-class issue that Chas mentioned. I would love to see this in Clojure 1.2; it would really clean up a lot of build-related issues.&lt;/p&gt;</comment>
                    <comment id="23784" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;meikelbrandmeyer said: I used it several times and this is the first time, I hear that it is unadvisable to do so. Even with a lower number of Vars in the namespace (c.c is here certainly exceptional) and might be of use to split several &quot;sections&quot; of code which belong to the same namespace but have different functionality. Whether to use a big comment in the source to indicate the section or split things into subfiles is a matter of taste. But it&apos;s a perfectly reasonable thing todo.&lt;/p&gt;

&lt;p&gt;Another use case, where I use this (and c.c.lazy-xml, IIRC) is to conditionally load code depending on whether a dependency is available or not. Eg. vimclojure uses c.c.pprint and c.c.stacktrace/clj-stacktrace transparently depending on their availability.&lt;/p&gt;

&lt;p&gt;There are perfectly legal uses of load. I don&apos;t see any &quot;unadvisable&quot; here.&lt;/p&gt;</comment>
                    <comment id="23785" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;cemerick said: Thanks, Meikel; I had forgotten about that use case, as I don&apos;t use load directly myself at all.  I probably wouldn&apos;t say it&apos;s inadvisable, just mostly unnecessary.  In any case, that&apos;s a good catch.  It complicates things a bit, but we&apos;ll see what happens.  I&apos;m going to take another whack at resolving the proxy/gen-class case and narrowing the impact of nontransitivity to use and require later tonight.&lt;/p&gt;

&lt;p&gt;I agree wholeheartedly that this should be in 1.2, assuming the technical bits work out.  This has been an irritant for quite a long time.  I actually believe that nontransitivity should be the &lt;b&gt;default&lt;/b&gt; &amp;#8211; no one wants or expects to have classfiles show up for dependencies show up when a project is AOT-compiled.  I think the only negative impact would be whoever still fiddles with compilation at the REPL, and doesn&apos;t use maven or lein &amp;#8211; and even then, it&apos;s just a matter of binding another var.&lt;/p&gt;</comment>
                    <comment id="23786" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;meikelbrandmeyer said: Then the var should be added to the default bindings in the clojure.main repl. Then it&apos;s set!-able like the other vars &#65533;&#65533;&#65533; &lt;b&gt;warn-on-reflection&lt;/b&gt; and friends.&lt;/p&gt;</comment>
                    <comment id="23787" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;cemerick said: This is looking pretty good (&lt;b&gt;still WIP&lt;/b&gt;):&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/cemerick/clojure/commit/fedfb022ecef420a932b3d69c182ec7a8e5960a6&quot;&gt;http://github.com/cemerick/clojure/commit/fedfb022ecef420a932b3d69c182ec7a8e5960a6&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you again for mentioning load, Meikel: it was very helpful in resolving the proxy/gen-class issue as well.&lt;/p&gt;

&lt;p&gt;Just a single data point: the jar produced by the medium-sized project I&apos;ve been using for testing the changes has shrunk from 1.8MB to less than 1MB.  That&apos;s not the only reason this is a good change, but it&apos;s certainly a nice side-effect.&lt;/p&gt;</comment>
                    <comment id="23788" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;cemerick said: [&lt;a href=&quot;file:aIWFiWHeGr35ImeJe5cbLA&quot;&gt;file:aIWFiWHeGr35ImeJe5cbLA&lt;/a&gt;]&lt;/p&gt;</comment>
                    <comment id="23789" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;cemerick said: [&lt;a href=&quot;file:aI7Eu-HeGr35ImeJe5cbLA&quot;&gt;file:aI7Eu-HeGr35ImeJe5cbLA&lt;/a&gt;]&lt;/p&gt;</comment>
                    <comment id="23790" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;cemerick said: Patched attached.  The &lt;del&gt;compat&lt;/del&gt; one retains the current default behaviour &lt;span class=&quot;error&quot;&gt;&amp;#91;*transitive-compile* true&amp;#93;&lt;/span&gt;, the other changes the default so that transitivity is a non-default option.  At least of those I&apos;ve spoken to about this, the latter is preferred.&lt;/p&gt;

&lt;p&gt;The user impact of changing the default would be:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;The result of compiling from the REPL will change. Getting back current behaviour would require adding a &lt;span class=&quot;error&quot;&gt;&amp;#91;*transitive-compile* true&amp;#93;&lt;/span&gt; binding to the existing bindings one must set when compiling from the REPL.&lt;/li&gt;
	&lt;li&gt;The same as #1 goes for those scripting AOT compilation via &lt;tt&gt;clojure.lang.Compile&lt;/tt&gt; as well (whether by shell scripts, ant, etc).&lt;/li&gt;
	&lt;li&gt;Those using lein, clojure-maven-plugin, gradle, and others will likely have a new option provided by those tools, and perhaps a different default than the language&apos;s.  I suspect those using such tools would much prefer a change from the default behaviour in any case.&lt;/li&gt;
&lt;/ol&gt;
</comment>
                    <comment id="23791" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;hlship said: Just had a brain-storm:&lt;/p&gt;

&lt;p&gt;How about an option to support  transitive compilation, but only if the Clojure source file being compiled as a file: URL (i.e., its a local file on the file system, not a file stored in a JAR). That would make it easier to use compilation on the local project without transitively compiling imported libraries, such as clojure-contrib.&lt;/p&gt;

&lt;p&gt;So &lt;b&gt;transitive-compile&lt;/b&gt; should be a keyword, not a boolean, with values :all (for 1.1 behavior), :none (to compile only the exact specified namespaces) or :local (to compile transitively, but only for local files, not source files from JARs).&lt;/p&gt;</comment>
                    <comment id="23792" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;cemerick said: (Crossposted to the clojure-dev list)&lt;/p&gt;

&lt;p&gt;I thought about this some, and I don&apos;t think that&apos;s a good idea, at least for now.  I&apos;m uncomfortable with semantics changing depending upon where code is being loaded from &amp;#8211; which, depending upon a tool&apos;s implementation, might be undefined.  E.g. if the com.foo.bar ns is available in source form in one directory, but as classes from a jar, and classpaths aren&apos;t being constructed in a stable fashion, then the results of compilation will change.&lt;/p&gt;

&lt;p&gt;If we decide that special treatment depending upon the source of code is warranted in the future, that&apos;s a fairly straightforward thing to do w.r.t. the API &amp;#8211; we could have :all and :local as you suggest, with nil representing :none.&lt;/p&gt;</comment>
                    <comment id="23793" author="importer" created="Tue, 28 Sep 2010 00:18:00 -0500"  >&lt;p&gt;stu said: Rich is not comfortable enough with the implementation complexity of this patch (e.g. the guard clause for proxies and gen-class) to slide this in as a minor fix under the wire for 1.2. &lt;/p&gt;

&lt;p&gt;Better to live with the pain we know a little longer than ship something we don&apos;t have enough experience with to be confident.&lt;/p&gt;</comment>
                    <comment id="25949" author="cemerick" created="Fri, 19 Nov 2010 21:28:37 -0600"  >&lt;p&gt;Updated patch to cleanly apply to HEAD and address issues raised by screening done by &lt;a href=&quot;http://groups.google.com/group/clojure-dev/msg/0771729b72e04c9e&quot;&gt;Cosmin Stejerean&lt;/a&gt;.  Also includes proper tests.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Note: this patch&apos;s tests require the fix for&lt;/b&gt; &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-432&quot; title=&quot;deftype does not work if containing ns contains dashes&quot;&gt;&lt;del&gt;CLJ-432&lt;/del&gt;&lt;/a&gt;!&lt;/p&gt;</comment>
                    <comment id="25971" author="stu" created="Mon, 29 Nov 2010 07:18:41 -0600"  >&lt;p&gt;the &quot;-resolved&quot; patch resolves a conflict in main.clj&lt;/p&gt;</comment>
                    <comment id="25972" author="stu" created="Mon, 29 Nov 2010 07:25:20 -0600"  >&lt;p&gt;Several questions:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;I am getting an ant build error: &quot;/Users/stuart/repos/clojure/build.xml:137: java.io.FileNotFoundException: Could not locate clojure/test_clojure/aot/nontransitive__init.class or clojure/test_clojure/aot/nontransitive.clj on classpath:&quot;&lt;/li&gt;
	&lt;li&gt;It feels icky to have a method named writeClassFile that, under some circumstances, does &lt;b&gt;not&lt;/b&gt; write a class file, but instead loads it via a dynamic loader. Maybe this is just a naming issue.&lt;/li&gt;
	&lt;li&gt;Are there any other ways to accomplish the goals of &lt;tt&gt;&lt;b&gt;load-level&lt;/b&gt;&lt;/tt&gt;? Or, taking the other side, if we are going to have a &lt;b&gt;load-level&lt;/b&gt;, are there other possible consumers who might have different needs?&lt;/li&gt;
	&lt;li&gt;(Minor) Why the &lt;tt&gt;use :only&lt;/tt&gt; idiom instead of just &lt;tt&gt;require&lt;/tt&gt;?&lt;/li&gt;
&lt;/ol&gt;
</comment>
                    <comment id="26023" author="stuart.sierra" created="Fri, 10 Dec 2010 15:34:32 -0600"  >&lt;p&gt;An alternative approach: patch write-classes-1.diff.gz&lt;/p&gt;

&lt;p&gt;From &lt;a href=&quot;https://github.com/stuartsierra/clojure/tree/write-classes&quot;&gt;my forked branch&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What this patch does:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Keeps &apos;compile&apos; and &apos;&lt;b&gt;compile-files&lt;/b&gt;&apos; exactly the same&lt;/li&gt;
	&lt;li&gt;Adds &apos;compile-write-classes&apos; to write .class files for specifically named classes&lt;/li&gt;
	&lt;li&gt;Minor compiler changes to support this&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;This approach was prompted by the following observations:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Java interop is the dominant reason for needing .class files&lt;/li&gt;
	&lt;li&gt;Things other than namespaces can generate classes for Java interop:
	&lt;ul&gt;
		&lt;li&gt;deftype/defrecord&lt;/li&gt;
		&lt;li&gt;defprotocol&lt;/li&gt;
		&lt;li&gt;gen-class/gen-interface&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li&gt;For library releases, we want to control which .class files are emitted on a per-class basis, not per-namespace&lt;/li&gt;
	&lt;li&gt;Some legitimate uses of AOT compilation will want transitive compilation
	&lt;ul&gt;
		&lt;li&gt;Pre-compiling an entire application before release&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</comment>
                    <comment id="26024" author="cemerick" created="Fri, 10 Dec 2010 16:04:25 -0600"  >&lt;p&gt;S. Halloway: My apologies, I didn&apos;t know you had commented.  I thought that, having assigned this issue to myself, I&apos;d be notified of updates. &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/sad.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;

&lt;p&gt;FWIW, I aim to review your comments and SS&apos; approach over the weekend.&lt;/p&gt;</comment>
                    <comment id="26035" author="cemerick" created="Thu, 16 Dec 2010 07:36:22 -0600"  >&lt;p&gt;S. Halloway:&lt;/p&gt;

&lt;p&gt;1. Certainly shouldn&apos;t happen.  AFAIK, others have screened the patch, presumably with a successful build.&lt;br/&gt;
2. Agreed; given the approach, I think it&apos;s just a bad name.&lt;br/&gt;
3. Yes, I think S. Sierra&apos;s is one.  See my next comment.&lt;br/&gt;
4. Because the &lt;tt&gt;:use&lt;/tt&gt; form was already there. I&apos;ve actually been using that form of &lt;tt&gt;:use&lt;/tt&gt; more and more; I&apos;ve found that easier than occasionally having to shuffle around specs between &lt;tt&gt;:use&lt;/tt&gt; and &lt;tt&gt;:require&lt;/tt&gt;. I think I&apos;m aping Chris Houser in that regard.&lt;/p&gt;</comment>
                    <comment id="26036" author="cemerick" created="Thu, 16 Dec 2010 09:00:03 -0600"  >&lt;p&gt;I think S. Sierra&apos;s approach is fundamentally superior what I offered.  I have two suggestions: one slight perspective change (which implies no change in the actual implementation), and an idea for an even simpler approach (at least from a user perspective), in that order.&lt;/p&gt;

&lt;p&gt;While interop is the driving requirement behind AOT, I absolutely do not want to have to keep an updated enumeration of all of the classes resulting from each and every &lt;tt&gt;defrecord&lt;/tt&gt; et al. usages in my &lt;tt&gt;pom.xml&lt;/tt&gt;/&lt;tt&gt;project.clj&lt;/tt&gt; (and I wouldn&apos;t wish the task of ferreting those usages and their resulting classnames on any build tool author).&lt;/p&gt;

&lt;p&gt;Right now, &lt;tt&gt;&amp;#42;compile-write-classes&amp;#42;&lt;/tt&gt; is documented to be a set of classname strings, but could just as easily be any other function.  &lt;tt&gt;&amp;#42;compile-write-classes&amp;#42;&lt;/tt&gt; should be documented to accept any predicate function (renamed to e.g. &lt;tt&gt;&amp;#42;compile-write-class?&amp;#42;&lt;/tt&gt;?).  There&apos;s no reason why it shouldn&apos;t be bound to, e.g. &lt;tt&gt;#(re-matches #&quot;foo\.bar\.[\w&amp;#95;]+$&quot; %)&lt;/tt&gt; if I know that all my records are defined in the &lt;tt&gt;foo.bar&lt;/tt&gt; namespace.&lt;/p&gt;

&lt;p&gt;To go along with that, I think some package/classname-globbing utilities along with corresponding options to &lt;tt&gt;clojure.lang.Compile&lt;/tt&gt; would be most welcome.  Classname munging rules are not exactly obvious, and it&apos;d be good to make things a little easier for users in this regard.&lt;/p&gt;

&lt;hr /&gt;

&lt;h5&gt;&lt;a name=&quot;Anotheralternative&quot;&gt;&lt;/a&gt;Another alternative&lt;/h5&gt;
&lt;p&gt;If there&apos;s a closed set of forms that generate classes that one might reasonably be interested in having in a build result (outside of use cases for pervasive AOT), then why not have a simple option that only those forms utilize?  &lt;tt&gt;gen-class&lt;/tt&gt; and &lt;tt&gt;gen-interface&lt;/tt&gt; already do this, but reusing the all-or-nothing &lt;tt&gt;&amp;#42;compile-files&amp;#42;&lt;/tt&gt; binding; if they keyed off of a binding that implied a diminished scope (e.g. &lt;tt&gt;&amp;#42;compile-interop-forms&amp;#42;&lt;/tt&gt; &#8211; which would be &lt;tt&gt;true&lt;/tt&gt; if &lt;tt&gt;&amp;#42;compile-files&amp;#42;&lt;/tt&gt; were &lt;tt&gt;true&lt;/tt&gt;), then they&apos;d do exactly what we wanted.  Extending this approach to &lt;tt&gt;deftype&lt;/tt&gt; (and therefore &lt;tt&gt;defrecord&lt;/tt&gt;) &lt;em&gt;should&lt;/em&gt; be straightforward.&lt;/p&gt;

&lt;p&gt;An implementation of this would probably be somewhat more complicated than S. Sierra&apos;s patch, though not as complex as my original stab at the problem (i.e. no &lt;tt&gt;&amp;#42;load-level&amp;#42;&lt;/tt&gt;).  On the plus side:&lt;/p&gt;

&lt;p&gt;1. No additional configuration for users or implementation work for build tool authors, aside from the addition of the boolean diminished-scope AOT option&lt;br/&gt;
2. Class file generation would remain opaque from a build process standpoint&lt;br/&gt;
3. Future/other class-generating forms (there are a few people futzing with ASM independently, etc) can make local decisions about whether or not to participate in interop-centric classfile generation.  This might be particularly helpful if a given form emits multiple classes, making the determination of a classname-based filter fn less straightforward.&lt;/p&gt;

&lt;p&gt;I can see wanting to further restrict AOT to specific classnames in certain circumstances, in which case the above and S. Sierra&apos;s patch might be complimentary.&lt;/p&gt;</comment>
                    <comment id="26037" author="stuart.sierra" created="Thu, 16 Dec 2010 11:49:12 -0600"  >&lt;p&gt;I like the idea of &lt;tt&gt;&amp;#42;compile-interop-forms&amp;#42;&lt;/tt&gt;.  But is it always possible to determine what an &quot;interop form&quot; is?  I &lt;em&gt;think&lt;/em&gt; it is, I&apos;m just not sure.&lt;/p&gt;</comment>
                    <comment id="26915" author="arohner" created="Sun, 9 Oct 2011 12:50:17 -0500"  >&lt;p&gt;I&apos;m also in favor of compile-interop-forms. As far as determining, how about sticking metadata on the var?&lt;/p&gt;

&lt;p&gt;(defmacro ^{:interop-form true} deftype ...)&lt;/p&gt;</comment>
                    <comment id="27077" author="stuart.sierra" created="Fri, 21 Oct 2011 08:38:31 -0500"  >&lt;p&gt;Summary and design discussion on wiki at &lt;a href=&quot;http://dev.clojure.org/display/design/Transitive+AOT+Compilation&quot;&gt;http://dev.clojure.org/display/design/Transitive+AOT+Compilation&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="27367" author="stuart.sierra" created="Tue, 29 Nov 2011 18:54:01 -0600"  >&lt;p&gt;New attachment &lt;tt&gt;compile-interop-1.patch&lt;/tt&gt; has new approach: Add a third possible value for &lt;tt&gt;&amp;#42;compile-files&amp;#42;&lt;/tt&gt;. True and false keep their original meanings, but &lt;tt&gt;:interop&lt;/tt&gt; causes &lt;b&gt;only&lt;/b&gt; interop-related forms to be written out as .class files. &quot;Interop forms&quot; are gen-class, gen-interface, deftype, defrecord, defprotocol, and definterface.&lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;doesn&apos;t change existing behavior&lt;/li&gt;
	&lt;li&gt;handles common case for non-transitive AOT (interop)&lt;/li&gt;
	&lt;li&gt;minimal changes to the compiler&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;not flexible&lt;/li&gt;
&lt;/ul&gt;
</comment>
                    <comment id="27385" author="stuart.sierra" created="Fri, 2 Dec 2011 08:12:21 -0600"  >&lt;p&gt;Just realized my patch doesn&apos;t solve the transitive compilation problem. If library A loads library B, then compiling interop forms in A will also emit interop .class files in B.&lt;/p&gt;</comment>
                    <comment id="30340" author="pmoriarty" created="Tue, 1 Jan 2013 03:55:41 -0600"  >&lt;p&gt;It&apos;s disappointing to see an important issue like this still unresolved after 2.5 years. This is a real pain for us. We have a large closed source project where shipping source is not an option. This forces us to manage the AOT&apos;ing of dependencies due to the hard dependency on protocol interfaces introduced by transitive AOT compilation (see &lt;a href=&quot;https://groups.google.com/forum/?fromgroups=#!topic/clojure-dev/r3A1JOIiwVU&quot;&gt;https://groups.google.com/forum/?fromgroups=#!topic/clojure-dev/r3A1JOIiwVU&lt;/a&gt;).&lt;/p&gt;</comment>
                    <comment id="30346" author="jafingerhut" created="Tue, 1 Jan 2013 16:27:20 -0600"  >&lt;p&gt;Paul, do you have a suggestion for which of the approaches described in comments here, or on the wiki page &lt;a href=&quot;http://dev.clojure.org/display/design/Transitive+AOT+Compilation&quot;&gt;http://dev.clojure.org/display/design/Transitive+AOT+Compilation&lt;/a&gt; would be preferable solution for you?  Or perhaps even a patch that implements your preferred approach?&lt;/p&gt;</comment>
                    <comment id="30371" author="hlewisship" created="Fri, 4 Jan 2013 16:18:11 -0600"  >&lt;p&gt;Andy,&lt;/p&gt;

&lt;p&gt;I&apos;m now consulting with Paudi&apos;s organization, so I think I can speak for him (I&apos;m now the default buildmeister).&lt;/p&gt;

&lt;p&gt;I like Stuart&apos;s :interop idea, but that is somewhat orthogonal to our needs.&lt;/p&gt;

&lt;p&gt;I return to what I would like; compilation would compile specific namespaces; dependencies of those namespaces would not be compiled.&lt;/p&gt;

&lt;p&gt;To be honest, I&apos;m still a little hung up on the interop forms: especially defprotocol and friends; from a cursory glance, it appears that todays AOT compilation will compile the protocol into a Java class, then compile the namespace that references the protocol with the assumption that the protocol&apos;s Java class is available.  When we use build rules to only package our namespace&apos;s class files into the output JAR, the code fails with a NoClassDefFoundError because the protocol really needs to be recompiled, at runtime compilation, into an in-memory Java class.&lt;/p&gt;

&lt;p&gt;Obviously, supporting this correctly will be a challenge; the compiled bytecode for our namespace would ideally:&lt;br/&gt;
1) check to see if the Java class already exists and use it if so&lt;br/&gt;
2) load the necessary namespaces so as to force the creation of the Java class&lt;/p&gt;

&lt;p&gt;I can imagine any number of ways to juggle things to make this work, so I won&apos;t suggest a specific implementation.&lt;/p&gt;

&lt;p&gt;In the meantime, our workaround is to create a &quot;stub&quot; module as part of our build; it simply requires in the necessary namespaces (for example, org.clojure:core.cache); this forces an AOT compile of the dependencies and we have a special rule to package such dependencies in the stub module&apos;s output JAR.  This may not be a scalable problem, and it is expensive to identify what 3rd party dependencies require this treatment.&lt;/p&gt;</comment>
                    <comment id="31152" author="stu" created="Fri, 24 May 2013 13:25:25 -0500"  >&lt;p&gt;I am marking this incomplete because there does not yet seem to be plurality, much less consensus or unanimity, on approach.&lt;/p&gt;

&lt;p&gt;Personally I am in favor of a solution based on a predicate that gets handed the class name and compiled bits, and then can choose whether to write the class. Pretty close to Stuart Sierra&apos;s compile-write-classes.  Might be possible to flow more information than classname to the predicate.&lt;/p&gt;
</comment>
                </comments>
                    <attachments>
                    <attachment id="10035" name="0322-limit-aot-resolved.patch" size="11559" author="stu" created="Mon, 29 Nov 2010 07:18:41 -0600" />
                    <attachment id="10024" name="CLJ-322.diff" size="11478" author="cemerick" created="Fri, 19 Nov 2010 21:28:37 -0600" />
                    <attachment id="10723" name="compile-interop-1.patch" size="1443" author="stuart.sierra" created="Tue, 29 Nov 2011 18:54:01 -0600" />
                    <attachment id="10050" name="write-classes-1.diff.gz" size="1620" author="stuart.sierra" created="Fri, 10 Dec 2010 15:34:31 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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>cemerick</customfieldvalue>
                </customfieldvalues>
            </customfield>
                            </customfields>
    </item>

<item>
            <title>[CLJ-291] (take-nth 0 coll) redux...</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-291</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;I dont seem to be able make the old ticket uninvalid so here goes&lt;br/&gt;
(take-nth 0 coll) causes (at least on Solaris) infinite space and time consumption&lt;br/&gt;
It&apos;s not a printout error as the following code causes the problem too&lt;/p&gt;

&lt;p&gt;(let [j 0&lt;br/&gt;
 firstprod (apply * (doall (map #(- 1 %) (take-nth j (:props mix)))))]) ; from my parameter update function&lt;/p&gt;

&lt;p&gt;I used jvisualvm and the jvm is doing some RNI call - no clojure code is running at all&lt;br/&gt;
If left alone it will crash the jvm with all heap space consumed&lt;br/&gt;
0 is an InvalidArgument for take-nth&lt;br/&gt;
I wouldnt mind if it produced an infinite lazy sequence of nils even though thats wrong&lt;br/&gt;
It doesnt do this though it actively destroys the JVM&lt;br/&gt;
Its a bug nasty destructive and it took me half a day to figure out what was going on&lt;br/&gt;
please let someone fix it!&lt;/p&gt;</description>
                <environment></environment>
            <key id="13688">CLJ-291</key>
            <summary>(take-nth 0 coll) redux...</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="3" iconUrl="http://dev.clojure.org/jira/images/icons/status_inprogress.gif">In Progress</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="importer">Assembla Importer</reporter>
                        <labels>
                    </labels>
                <created>Thu, 8 Apr 2010 06:29:00 -0500</created>
                <updated>Fri, 10 Dec 2010 08:50:19 -0600</updated>
                                                    <fixVersion>Approved Backlog</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="23615" author="importer" created="Sun, 17 Oct 2010 09:47:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/291&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/291&lt;/a&gt;&lt;br/&gt;
Attachments:&lt;br/&gt;
fixbug291.diff - &lt;a href=&quot;https://www.assembla.com/spaces/clojure/documents/dfNhoS2Cir3543eJe5cbLA/download/dfNhoS2Cir3543eJe5cbLA&quot;&gt;https://www.assembla.com/spaces/clojure/documents/dfNhoS2Cir3543eJe5cbLA/download/dfNhoS2Cir3543eJe5cbLA&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="23616" author="importer" created="Sun, 17 Oct 2010 09:47:00 -0500"  >&lt;p&gt;bhurt said: Before this bug gets marked as invalid as well, let me point out that the problem here is that (take-nth 0 any-list) is a meaningless construction- the only question is what to do when this happens.  IMHO, the correct behavior is to throw an exception.&lt;/p&gt;</comment>
                    <comment id="23617" author="importer" created="Sun, 17 Oct 2010 09:47:00 -0500"  >&lt;p&gt;ataggart said: [&lt;a href=&quot;file:dfNhoS2Cir3543eJe5cbLA&quot;&gt;file:dfNhoS2Cir3543eJe5cbLA&lt;/a&gt;]: throws IllegalArgumentException on negative step size&lt;/p&gt;</comment>
                    <comment id="25891" author="stu" created="Fri, 29 Oct 2010 10:36:34 -0500"  >&lt;p&gt;Does calling (take-nth 0 ...) cause the problem, or only realizing the result?&lt;/p&gt;</comment>
                    <comment id="25892" author="chouser@n01se.net" created="Fri, 29 Oct 2010 11:06:01 -0500"  >&lt;p&gt;I&apos;m not seeing a problem.  Calling take-nth and even partially consuming the seq it returns works fine for me:&lt;/p&gt;

&lt;p&gt;(take 5 (take-nth 0 &lt;span class=&quot;error&quot;&gt;&amp;#91;1 2 3&amp;#93;&lt;/span&gt;))&lt;br/&gt;
;=&amp;gt; (1 1 1 1 1)&lt;/p&gt;

&lt;p&gt;Note however that it is returning an infinite lazy seq.  The example in the issue description seems to include essentially (doall &amp;lt;infinite-lazy-seq&amp;gt;) which does blow the heap:&lt;/p&gt;

&lt;p&gt;(doall (range))&lt;/p&gt;

&lt;p&gt;This issue still strikes me as invalid.&lt;/p&gt;</comment>
                    <comment id="25893" author="richhickey" created="Fri, 29 Oct 2010 11:06:02 -0500"  >&lt;p&gt;(take-nth 0 ...) returns an infinite sequence of the first item:&lt;/p&gt;

&lt;p&gt;(take 12 (take-nth 0 &lt;span class=&quot;error&quot;&gt;&amp;#91;1 2 3&amp;#93;&lt;/span&gt;))&lt;br/&gt;
=&amp;gt; (1 1 1 1 1 1 1 1 1 1 1 1)&lt;/p&gt;

&lt;p&gt;Is something other than this happening on Solaris?&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="10006">Incomplete</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-250] debug builds</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-250</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;This ticket includes two patches: &lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;a patch to set  &lt;tt&gt;&lt;b&gt;assert&lt;/b&gt;&lt;/tt&gt; when clojure.lang.RT loads, based on the presence of system property clojure.debug&lt;/li&gt;
	&lt;li&gt;expand error messages in assert to include &lt;tt&gt;local-bindings&amp;lt;/code&amp;gt; (a new macro which wraps the implicit &amp;lt;code&amp;gt;&amp;amp;env&lt;/tt&gt;)&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Things to consider before approving these patches:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;should there be an easy Clojure-level way to query if debug is enabled? (checking assert isn&apos;t the same, as debug should eventually drive other features)&lt;/li&gt;
	&lt;li&gt;assertions will now be off by default &amp;#8211; this is a change!&lt;/li&gt;
	&lt;li&gt;is the addition of the name &lt;tt&gt;local-bindings&lt;/tt&gt; to clojure.core cool?&lt;/li&gt;
&lt;/ol&gt;
</description>
                <environment></environment>
            <key id="13647">CLJ-250</key>
            <summary>debug builds</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="stu">Stuart Halloway</reporter>
                        <labels>
                    </labels>
                <created>Wed, 27 Jan 2010 17:40:00 -0600</created>
                <updated>Thu, 14 Mar 2013 13:28:51 -0500</updated>
                                    <version>Release 1.2</version>
                                <fixVersion>Approved Backlog</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="23417" author="importer" created="Tue, 24 Aug 2010 06:05:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/250&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/250&lt;/a&gt;&lt;br/&gt;
Attachments:&lt;br/&gt;
add-clojure-debug-flag.patch - &lt;a href=&quot;https://www.assembla.com/spaces/clojure/documents/aUWn50c64r35E-eJe5aVNr/download/aUWn50c64r35E-eJe5aVNr&quot;&gt;https://www.assembla.com/spaces/clojure/documents/aUWn50c64r35E-eJe5aVNr/download/aUWn50c64r35E-eJe5aVNr&lt;/a&gt;&lt;br/&gt;
assert-report-locals.patch - &lt;a href=&quot;https://www.assembla.com/spaces/clojure/documents/aUWqLSc64r35E-eJe5aVNr/download/aUWqLSc64r35E-eJe5aVNr&quot;&gt;https://www.assembla.com/spaces/clojure/documents/aUWqLSc64r35E-eJe5aVNr/download/aUWqLSc64r35E-eJe5aVNr&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="26008" author="stu" created="Tue, 7 Dec 2010 20:23:13 -0600"  >&lt;p&gt;Ignore the old patches. Considering the following implementation, please review and then move ticket to waiting on Stu:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;RT will check system property &lt;tt&gt;&quot;clojure.debug&quot;&lt;/tt&gt;, default to false&lt;/li&gt;
	&lt;li&gt;property will set the root binding for the current &lt;tt&gt;&amp;#42;assert&amp;#42;&lt;/tt&gt;, plus a new &lt;tt&gt;&amp;#42;debug&amp;#42;&lt;/tt&gt; flag. (Debug builds can and will drive other things than just asserts.)&lt;/li&gt;
	&lt;li&gt;does Compile.java need to push &lt;tt&gt;&amp;#42;assert&amp;#42;&lt;/tt&gt; or &lt;tt&gt;&amp;#42;debug&amp;#42;&lt;/tt&gt; as thread local bindings, or can they be root-bound only when compiling clojure?&lt;/li&gt;
	&lt;li&gt;will add &lt;tt&gt;&amp;#42;debug&amp;#42;&lt;/tt&gt; binding to &lt;tt&gt;clojure.main/with-bindings&lt;/tt&gt;. Anywhere else?&lt;/li&gt;
	&lt;li&gt;build.xml should not have to change &amp;#8211; system properties will flow through (and build.xml may not be around much longer anyway)&lt;/li&gt;
	&lt;li&gt;once we agree on the approach, I will ping maven plugin and lein owners so that they flow the setting through&lt;/li&gt;
	&lt;li&gt;better assertion messages will be a separate ticket&lt;/li&gt;
	&lt;li&gt;what is the interaction between &amp;#42;debug&amp;#42; and &amp;#42;unchecked-math&amp;#42;? Change checks to &lt;tt&gt;(and &amp;#42;unchecked-math&amp;#42; (not &amp;#42;debug&amp;#42;))&lt;/tt&gt;}?&lt;/li&gt;
&lt;/ol&gt;
</comment>
                    <comment id="26012" author="richhickey" created="Wed, 8 Dec 2010 11:00:04 -0600"  >&lt;p&gt;#3 - root bound only&lt;br/&gt;
#4 - should &lt;b&gt;not&lt;/b&gt; be in with-bindings for same reason as #3 - we don&apos;t want people to set! &amp;#42;debug&amp;#42; nor &amp;#42;assert&amp;#42;&lt;br/&gt;
#8 - yes, wrapping that in a helper fn&lt;/p&gt;

&lt;p&gt;#6 - my biggest reservation is that this isn&apos;t yet informed by maven best practices&lt;/p&gt;</comment>
                    <comment id="26013" author="stuart.sierra" created="Wed, 8 Dec 2010 14:09:49 -0600"  >&lt;p&gt;System properties can be passed through Maven, so I do not anticipate this being a problem.&lt;/p&gt;

&lt;p&gt;However, I would prefer &lt;tt&gt;&amp;#42;assert&amp;#42;&lt;/tt&gt; to remain true by default.&lt;/p&gt;</comment>
                    <comment id="26015" author="cemerick" created="Thu, 9 Dec 2010 07:19:33 -0600"  >&lt;p&gt;SS is correct about this approach not posing any issue for Maven.  In addition, the build could easily be set up to always emit two jars, one &quot;normal&quot;, one &quot;debug&quot;.&lt;/p&gt;

&lt;p&gt;I&apos;d suggest that, while &lt;tt&gt;clojure.debug&lt;/tt&gt; might have broad effect, additional properties should be available to provide fine-grained control over each of the additional &quot;debug&quot;-related parameterizations that might become available in the future.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;I&apos;d like to raise a couple of potentially tangential concerns (after now thinking about assertions for a bit in the above context), some or all of which may simply be a result of my lack of understanding in various areas.&lt;/p&gt;

&lt;p&gt;Looking at where &lt;tt&gt;assert&lt;/tt&gt; is used in &lt;tt&gt;core.clj&lt;/tt&gt; (only two places AFAICT: validating arguments to &lt;tt&gt;derive&lt;/tt&gt; and checking pre- and post-conditions in &lt;tt&gt;fn&lt;/tt&gt;), it would seem unwise to make it &lt;tt&gt;false&lt;/tt&gt; by default.  i.e. non-&lt;tt&gt;Named&lt;/tt&gt; values would be able to get into hierarchies, and pre- and post-conditions would simply be ignored.&lt;/p&gt;

&lt;p&gt;It&apos;s my understanding that assertions (talking here of the JVM construct, from which Clojure reuses &lt;tt&gt;AssertionError&lt;/tt&gt;) should not be used to validate arguments to public API functions, or used to validate any aspect of a function&apos;s normal operation (i.e. &lt;a href=&quot;http://download.oracle.com/javase/1.4.2/docs/guide/lang/assert.html#usage&quot;&gt;&quot;where not to use assertions&quot;&lt;/a&gt;).  That would imply that &lt;tt&gt;derive&lt;/tt&gt; should throw &lt;tt&gt;IllegalArugmentException&lt;/tt&gt; when necessary, and fn pre- and post-conditions should perhaps throw &lt;tt&gt;IllegalStateException&lt;/tt&gt; &amp;#8211; or, in any case, something other than &lt;tt&gt;AssertionError&lt;/tt&gt; via &lt;tt&gt;assert&lt;/tt&gt;.  This would match up far better with most functions in core using &lt;tt&gt;assert-args&lt;/tt&gt; rather than &lt;tt&gt;assert&lt;/tt&gt;, the former throwing &lt;tt&gt;IllegalArgumentException&lt;/tt&gt; rather than &lt;tt&gt;AssertionError&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;That leads me to the question: is &lt;tt&gt;assert&lt;/tt&gt; (and &lt;tt&gt;&amp;#42;assert&amp;#42;&lt;/tt&gt;) intended to be a Clojure construct, or a quasi-interop form?&lt;/p&gt;

&lt;p&gt;If the former, then it can roughly have whatever semantics we want, but then it seems like it should not be throwing &lt;tt&gt;AssertionError&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;If the latter, then &lt;tt&gt;AssertionError&lt;/tt&gt; is appropriate on the JVM, but then we need to take care that assertions can be enabled and disabled at runtime (without having to switch around different builds of Clojure), ideally using the host-defined switches (e.g. &lt;tt&gt;-ea&lt;/tt&gt; and friends) and likely not anything like &lt;tt&gt;&amp;#42;assert&amp;#42;&lt;/tt&gt;. I don&apos;t know if this is possible or practical at this point (I presume this would require nontrivial compiler changes).&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Hopefully the above is not water under the bridge at this point.  Thank you in advance for your forbearance. &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="26016" author="richhickey" created="Thu, 9 Dec 2010 08:08:07 -0600"  >&lt;p&gt;Thanks for the useful input Chas. Nothing is concluded yet. I think we should step back and look at the objective here, before moving forward with a solution. Being a dynamic language, there are many things we might want to validate about our programs, where the cost of checking is something we are unwilling to pay in production.&lt;/p&gt;

&lt;p&gt;Being a macro, assert has the nice property that, should &amp;#42;assert&amp;#42; not be true during compilation, it generates nil, no conditional test at all. Thus right now it is more like static conditional compilation.&lt;/p&gt;

&lt;p&gt;Java assert does have runtime toggle-ability, via &amp;#45;ea as you say. I haven&apos;t looked at the bytecode generated for Java asserts, but it might be possible for Clojure assert to do something similar, if the runtime overhead is negligible. It is quite likely that HotSpot has special code for eliding the assertion bytecode given a single check of some flag. I&apos;m just not sure that flag is &lt;a href=&quot;http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#desiredAssertionStatus()&quot;&gt;Class.desiredAssertionStatus&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Whether this turns into changes in assert or pre/post conditions, best practices etc is orthogonal and derived. Currently we don&apos;t have a facility to run without the checks. We need to choose between making them disappear during compilation (debug build) or runtime (track &amp;#45;ea) or both. Then we can look at how that is reflected in assert/pre-post and re-examine existing use of both. The &quot;where not to use assertions&quot; doc deals with them categorically, but in not considering their cost, seems unrealistic IMO. &lt;/p&gt;

&lt;p&gt;I&apos;d appreciate it if someone could look into how assert is generated and optimized by Java itself.&lt;/p&gt;</comment>
                    <comment id="26018" author="cemerick" created="Thu, 9 Dec 2010 17:04:52 -0600"  >&lt;p&gt;Bytecode issues continue to be above my pay grade, unfortunately&#8230;&lt;/p&gt;

&lt;p&gt;A few additional thoughts in response that you may or may not be juggling already:&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;assert&lt;/tt&gt; being a macro makes total sense for what it&apos;s doing.  Trouble is, &quot;compile-time&quot; is a tricky concept in Clojure: there&apos;s code-loading-time, AOT-compile-time, and transitively-AOT-compile-time.  Given that, it&apos;s entirely possible for an application deployed to a production environment that contains a patchwork of code or no code produced by &lt;tt&gt;assert&lt;/tt&gt; usages in various libraries and namespaces depending upon when those libs and ns&apos; were loaded, AOT-compiled, or their dependents AOT-compiled, and the value of &lt;tt&gt;&amp;#42;assert&amp;#42;&lt;/tt&gt; at each of those times.  Of course, this is the case for all such macros whose results are dependent upon context-dependent state (I think this was a big issue with &lt;tt&gt;clojure.contrib.logging&lt;/tt&gt;, making it only usable with log4j for a while).&lt;/p&gt;

&lt;p&gt;What&apos;s really attractive about the JVM assertion mechanism is that it can be parameterized for a given runtime on a per-package basis, if desired.  Reimplementing that concept so that &lt;tt&gt;assert&lt;/tt&gt; can be &lt;tt&gt;&amp;#42;ns&amp;#42;&lt;/tt&gt;-sensitive seems like it&apos;d be straightforward, but the compile-time complexity already mentioned remains, and the idea of having two independently-controlled assertion facilities doesn&apos;t sound fun.&lt;/p&gt;

&lt;p&gt;I know nearly nothing about the CLR, but it would appear that it doesn&apos;t provide for anything like runtime-controllable assertions.&lt;/p&gt;</comment>
                    <comment id="26068" author="stu" created="Wed, 29 Dec 2010 15:17:44 -0600"  >&lt;p&gt;The best (dated) evidence I could find says that the compiler sets a special class static final field &lt;tt&gt;$assertionsDisabled&lt;/tt&gt; based on the return of &lt;tt&gt;desiredAssertionStatus&lt;/tt&gt;. HotSpot doesn&apos;t do anything special with this, dead code elimination simply makes it go away. The code indeed compiles this way:&lt;/p&gt;

&lt;p&gt;   11:	getstatic	#6; //Field $assertionsDisabled:Z&lt;br/&gt;
   14:	ifne	33&lt;br/&gt;
   17:	lload_1&lt;br/&gt;
   18:	lconst_0&lt;br/&gt;
   19:	lcmp&lt;br/&gt;
   20:	ifeq	33&lt;br/&gt;
   23:	new	#7; //class java/lang/AssertionError&lt;br/&gt;
   26:	dup&lt;br/&gt;
   27:	ldc	#8; //String X should be zero&lt;br/&gt;
   29:	invokespecial	#9; //Method java/lang/AssertionError.&quot;&amp;lt;init&amp;gt;&quot;:(Ljava/lang/Object;)V&lt;br/&gt;
   32:	athrow&lt;/p&gt;

&lt;p&gt;Even if we were 100% sure that assertion removal was total, I would still vote for a separate Clojure-level switch, for the following reasons:&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;I have a real and pressing need to disable some assertions, and I don&apos;t need the Java interop at all. Arguably others will be in the same boat.&lt;/li&gt;
	&lt;li&gt;there will be multiple debugging facilities over time, and having a top-level &lt;b&gt;debug&lt;/b&gt; switch is convenient for Clojure users.&lt;/li&gt;
	&lt;li&gt;Java dis/enabling via command line flags is still possible as a separate feature. We could add this later as a (small) breaking change to our assert, or have a separate java-assert interop form. I am on the fence about which way to go here.&lt;/li&gt;
	&lt;li&gt;I believe it is perfectly fine to throw an &lt;tt&gt;AssertionError&lt;/tt&gt; from a non-Java-assertion-form. We don&apos;t believe in a world of a static exception hierarchy, and an assertion in production is a critical failure no matter what you call it. Even Scala does it &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt; &lt;a href=&quot;http://daily-scala.blogspot.com/2010/03/assert-require-assume.html&quot;&gt;http://daily-scala.blogspot.com/2010/03/assert-require-assume.html&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;Rich: awaiting your blessing to move forward on this.&lt;/p&gt;</comment>
                    <comment id="26100" author="richhickey" created="Fri, 7 Jan 2011 09:42:47 -0600"  >&lt;p&gt;The compiler sets $assertionsDisabled when, in static init code? Is there special support in the classloader for it? Is there a link to the best dated evidence you found?&lt;/p&gt;</comment>
                    <comment id="26101" author="stu" created="Fri, 7 Jan 2011 09:51:27 -0600"  >&lt;ol&gt;
	&lt;li&gt;Yes, in static init code&lt;/li&gt;
	&lt;li&gt;There is no special support in the classloader, per Brian Goetz (private correspondence) last week. But dead code elimination is great: &quot;The run-time cost of disabled assertions should indeed be zero for compiled code&quot;&lt;/li&gt;
&lt;/ol&gt;
</comment>
                    <comment id="26102" author="stu" created="Fri, 7 Jan 2011 09:57:17 -0600"  >&lt;p&gt;Link: Google &quot;java assert shirazi&quot;. (Not posting link because I can&apos;t tell in 10 secs whether it includes my session information.)&lt;/p&gt;</comment>
                    <comment id="30760" author="akiel" created="Thu, 14 Mar 2013 13:28:51 -0500"  >&lt;p&gt;Is there anything new on this issue? I also look for a convenient way to disable assertions in production.&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="10006">Incomplete</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_10003" key="com.atlassian.jira.plugin.system.customfieldtypes:userpicker">
                <customfieldname>Waiting On</customfieldname>
                <customfieldvalues>
                    <customfieldvalue>richhickey</customfieldvalue>
                </customfieldvalues>
            </customfield>
                            </customfields>
    </item>

<item>
            <title>[CLJ-211] Support arbitrary functional destructuring via -&gt; and -&gt;&gt;</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-211</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Support arbitrary functional destructuring, that is the use of&lt;br/&gt;
any function in any destructuring form to help unpack data in&lt;br/&gt;
arbitrary ways.&lt;/p&gt;

&lt;p&gt;The discussion began here:&lt;br/&gt;
&lt;a href=&quot;http://clojure-log.n01se.net/date/2009-11-17.html#09:31c&quot;&gt;http://clojure-log.n01se.net/date/2009-11-17.html#09:31c&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The attached patch implements the spec described here:&lt;br/&gt;
&lt;a href=&quot;http://clojure-log.n01se.net/date/2009-11-17.html#10:50a&quot;&gt;http://clojure-log.n01se.net/date/2009-11-17.html#10:50a&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;That is, the following examples would now work:&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (let &lt;span class=&quot;error&quot;&gt;&amp;#91;(-&amp;gt; str a) 1&amp;#93;&lt;/span&gt; a)&lt;br/&gt;
&quot;1&quot;&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (let [&lt;span class=&quot;error&quot;&gt;&amp;#91;a (-&amp;gt; str b) c&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;1 2&amp;#93;&lt;/span&gt;] (list a b c))&lt;br/&gt;
(1 &quot;2&quot; nil)&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (let [(-&amp;gt;&amp;gt; (map int) &lt;span class=&quot;error&quot;&gt;&amp;#91;a b&amp;#93;&lt;/span&gt;) &quot;ab&quot;] (list a b))&lt;br/&gt;
(97 98)&lt;/p&gt;</description>
                <environment></environment>
            <key id="13608">CLJ-211</key>
            <summary>Support arbitrary functional destructuring via -&gt; and -&gt;&gt;</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="3" iconUrl="http://dev.clojure.org/jira/images/icons/status_inprogress.gif">In Progress</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="importer">Assembla Importer</reporter>
                        <labels>
                    </labels>
                <created>Tue, 17 Nov 2009 10:43:00 -0600</created>
                <updated>Fri, 10 Dec 2010 08:49:03 -0600</updated>
                                                    <fixVersion>Approved Backlog</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="23273" author="importer" created="Tue, 28 Sep 2010 06:57:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/211&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/211&lt;/a&gt;&lt;br/&gt;
Attachments:&lt;br/&gt;
destructuring-fns.diff - &lt;a href=&quot;https://www.assembla.com/spaces/clojure/documents/aHWQ_W06Kr3O89eJe5afGb/download/aHWQ_W06Kr3O89eJe5afGb&quot;&gt;https://www.assembla.com/spaces/clojure/documents/aHWQ_W06Kr3O89eJe5afGb/download/aHWQ_W06Kr3O89eJe5afGb&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="23274" author="importer" created="Tue, 28 Sep 2010 06:57:00 -0500"  >&lt;p&gt;chouser@n01se.net said: [&lt;a href=&quot;file:aHWQ_W06Kr3O89eJe5afGb&quot;&gt;file:aHWQ_W06Kr3O89eJe5afGb&lt;/a&gt;]: &lt;span class=&quot;error&quot;&gt;&amp;#91;PATCH&amp;#93;&lt;/span&gt; Support -&amp;gt; and -&amp;gt;&amp;gt; in destructuring forms.&lt;/p&gt;</comment>
                    <comment id="23275" author="importer" created="Tue, 28 Sep 2010 06:57:00 -0500"  >&lt;p&gt;cgrand said: I think the current patch suffers from the problem described here &lt;a href=&quot;http://groups.google.com/group/clojure-dev/msg/80ba7fad2ff04708&quot;&gt;http://groups.google.com/group/clojure-dev/msg/80ba7fad2ff04708&lt;/a&gt; too.&lt;/p&gt;</comment>
                    <comment id="23276" author="importer" created="Tue, 28 Sep 2010 06:57:00 -0500"  >&lt;p&gt;richhickey said: so, don&apos;t use syntax-quote, just use clojure.core/-&amp;gt;&lt;/p&gt;</comment>
                    <comment id="23277" author="importer" created="Tue, 28 Sep 2010 06:57:00 -0500"  >&lt;p&gt;chouser@n01se.net said: Only -&amp;gt; and -&amp;gt;&amp;gt; are actually legal here anyway &amp;#8211; if you&apos;ve locally bound foo to -&amp;gt; there&apos;s not really any good reason to think (fn &lt;span class=&quot;error&quot;&gt;&amp;#91;(foo inc a)&amp;#93;&lt;/span&gt; a) should work.  And if you&apos;ve redefined -&amp;gt; or -&amp;gt;&amp;gt; to mean something else in your ns, do we need to catch that at compile time, or is it okay to emit the rearranged code and see what happens?&lt;/p&gt;

&lt;p&gt;In short, would &apos;#{&lt;del&gt;&amp;gt; -&amp;gt;&amp;gt; clojure.core/&lt;/del&gt;&amp;gt; clojure.core/-&amp;gt;&amp;gt;} be sufficient?&lt;/p&gt;</comment>
                    <comment id="23278" author="importer" created="Tue, 28 Sep 2010 06:57:00 -0500"  >&lt;p&gt;cgrand said: Only -&amp;gt; and -&amp;gt;&amp;gt; are legal here but what if they are aliased or shadowed? Instead of testing the symboil per se I would check, if:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;the symbol is not in &amp;amp;env&lt;/li&gt;
	&lt;li&gt;the symbol resolve to #&apos;clojure.core/&lt;del&gt;&amp;gt; or  #&apos;clojure.core/&lt;/del&gt;&amp;gt;&amp;gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(when-not (&amp;amp;env (first b)) (#{#&apos;clojure.core/-&amp;gt; #&apos;clojure.core/-&amp;gt;&amp;gt;} (resolve (first b))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;but it requires to change destructure&apos;s sig to pass the env around&lt;/p&gt;</comment>
                    <comment id="26002" author="stu" created="Fri, 3 Dec 2010 13:03:07 -0600"  >&lt;p&gt;Rich: Are you assigned to this by accident? If so, please deassign yourself.&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="10006">Incomplete</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-84] GC Issue 81:    compile gen-class fail when class returns self</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-84</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 davidhaub, Feb 14, 2009

When attempting to compile the following program, clojure fails with a
ClassNotFoundException.  It occurs because one of the methods returns the
same class that is being generated.  If the returnMe method below is
changed to &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; an &lt;span class=&quot;code-object&quot;&gt;Object&lt;/span&gt;, the compile succeeds.

Beware when testing! If the classpath contains a class file (say from a
prior successful build when the returnMe method was changed to &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; an
object), the compile will succeed.  Always clear out the
clojure.compile.path prior to compiling.

;badgenclass.clj
(ns badgenclass
  (:gen-class
     :state state
     :methods
     [[returnMe [] badgenclass]]
     :init init))
(defn -init []
  [[] nil])

(defn -returnMe [&lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;]
  &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt;)

#!/bin/sh
rm -rf classes
mkdir classes
java -cp lib/clojure.jar:classes:. -Dclojure.compile.path=classes \
clojure.lang.Compile badgenclass


Comment 1 by chouser, Mar 07, 2009

Attached is a patch that accepts strings or symbols &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; parameter and &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; class
names, and generates the appropriate bytecode without calling &lt;span class=&quot;code-object&quot;&gt;Class&lt;/span&gt;/forName.  It
fixes &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; issue, but because &apos;ns&apos; doesn&apos;t resolve :gen-class&apos;s arguments, class
names aren&apos;t checked as early anymore.  :gen-class-created classes with invalid
parameter or &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; types can even be instantiated, and no error will be reported
until the broken method is called.

One possible alternative would be to call &lt;span class=&quot;code-object&quot;&gt;Class&lt;/span&gt;/forName on any symbols given, but
allow strings to use the method given by &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; patch.  To &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; your own type, you&apos;d
need a method defined like:

  [returnMe [] &lt;span class=&quot;code-quote&quot;&gt;&quot;badgenclass&quot;&lt;/span&gt;]

Any thoughts?&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="13481">CLJ-84</key>
            <summary>GC Issue 81:    compile gen-class fail when class returns self</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="3" iconUrl="http://dev.clojure.org/jira/images/icons/status_inprogress.gif">In Progress</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="richhickey">Rich Hickey</assignee>
                                <reporter username="importer">Assembla Importer</reporter>
                        <labels>
                    </labels>
                <created>Wed, 17 Jun 2009 22:30:00 -0500</created>
                <updated>Fri, 10 Dec 2010 09:30:52 -0600</updated>
                                    <version>Approved Backlog</version>
                                <fixVersion>Approved Backlog</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="22702" author="importer" created="Tue, 28 Sep 2010 17:09:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/84&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/84&lt;/a&gt;&lt;br/&gt;
Attachments:&lt;br/&gt;
genclass-allow-unresolved-classname.patch - &lt;a href=&quot;https://www.assembla.com/spaces/clojure/documents/cWS6Aww30r3RbzeJe5afGb/download/cWS6Aww30r3RbzeJe5afGb&quot;&gt;https://www.assembla.com/spaces/clojure/documents/cWS6Aww30r3RbzeJe5afGb/download/cWS6Aww30r3RbzeJe5afGb&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="22703" author="importer" created="Tue, 28 Sep 2010 17:09:00 -0500"  >&lt;p&gt;oranenj said: [&lt;a href=&quot;file:cWS6Aww30r3RbzeJe5afGb&quot;&gt;file:cWS6Aww30r3RbzeJe5afGb&lt;/a&gt;]: on comment 1&lt;/p&gt;</comment>
                    <comment id="22704" author="importer" created="Tue, 28 Sep 2010 17:09: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="25904" author="stu" created="Sat, 30 Oct 2010 11:58:08 -0500"  >&lt;p&gt;The approach take in the initial patch (delaying resolution of symbols into classes) is fine: gen-class makes no promise about when this happens, and the dynamic approach feels more consistent with Clojure. I think the proposed (but not implemented) use of string/symbol to control when class names are resolved is a bad idea: magical and not implied by the types.&lt;/p&gt;

&lt;p&gt;Needed:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;update the patch to apply cleanly&lt;/li&gt;
	&lt;li&gt;consider whether totype could live in clojure.reflect.java. (Beware load order dependencies.)&lt;/li&gt;
&lt;/ul&gt;
</comment>
                    <comment id="25910" author="chouser@n01se.net" created="Sat, 30 Oct 2010 21:29:59 -0500"  >&lt;p&gt;Wow, 18-month-old patch, back to haunt me for Halloway&apos;een&lt;/p&gt;

&lt;p&gt;So what does it mean that the assignee is Rich, but it&apos;s waiting on me?&lt;/p&gt;</comment>
                    <comment id="25915" author="stu" created="Mon, 1 Nov 2010 09:17:22 -0500"  >&lt;p&gt;I am using Approval = Incomplete plus Waiting On = Someone to let submitters know that there is feedback waiting, and that they can move the ticket forward by acting on it. The distinction is opportunity to contribute (something has been provided to let you move forward) vs. expectation of contribution. &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="10006">Incomplete</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_10003" key="com.atlassian.jira.plugin.system.customfieldtypes:userpicker">
                <customfieldname>Waiting On</customfieldname>
                <customfieldvalues>
                    <customfieldvalue>chouser@n01se.net</customfieldvalue>
                </customfieldvalues>
            </customfield>
                            </customfields>
    </item>

<item>
            <title>[CLJ-69] GC Issue 66: Add &quot;keyset&quot; to Clojure; make .keySet for APersistentMap return IPersistentSet</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-69</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 wolfe.a.jason, Feb 04, 2009

Describe the feature/change.

Add &lt;span class=&quot;code-quote&quot;&gt;&quot;keyset&quot;&lt;/span&gt; to Clojure; make .keySet &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; APersistentMap &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; an
IPersistentSet

Was &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; discussed on the group? If so, please provide a link to the
discussion:

http:&lt;span class=&quot;code-comment&quot;&gt;//groups.google.com/group/clojure/browse_thread/thread/66e708e477ae992f/ff3d8d588068b60e?hl=en#ff3d8d588068b60e
&lt;/span&gt;
-----------------------------------------------------

A patch is attached.  Some notes:

I chose to add a &lt;span class=&quot;code-quote&quot;&gt;&quot;keyset&quot;&lt;/span&gt; function, rather than change the existing &lt;span class=&quot;code-quote&quot;&gt;&quot;keys&quot;&lt;/span&gt;,
so as to avoid breaking anything.

The corresponding RT.keyset function just calls .keySet on the argument.
I would have liked to have &lt;span class=&quot;code-quote&quot;&gt;&quot;keyset&quot;&lt;/span&gt; &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; an IPersistentSet even when
passed a (non-Clojure) java.util.Map, but &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; seems impossible to &lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt; in
sublinear time because of essentially the same limitation mentioned in the
above thread (the Map &lt;span class=&quot;code-keyword&quot;&gt;interface&lt;/span&gt; does not support getKey() or entryAt()) --
assuming, again, that &lt;span class=&quot;code-quote&quot;&gt;&quot;get&quot;&lt;/span&gt; is supposed to &lt;span class=&quot;code-keyword&quot;&gt;return&lt;/span&gt; the actual (identical?)
key in a set, and not just an .equal key.

I then changed the implementation of .keySet &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; APersistentMap to
essentially copy APersistentSet.  A more concise alternative would have
been to extend APersistentSet and override the .get method, but that made
me a bit nervous (since &lt;span class=&quot;code-keyword&quot;&gt;if&lt;/span&gt; APeristentSet changed &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; could &lt;span class=&quot;code-keyword&quot;&gt;break&lt;/span&gt;). 

Anyway, &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; is my first patch &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; the Java side of Clojure, and I&apos;m not
yet solid on the conventions and aesthetics, so
comments/questions/criticisms/requests &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; revisions are very welcome.&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="13466">CLJ-69</key>
            <summary>GC Issue 66: Add &quot;keyset&quot; to Clojure; make .keySet for APersistentMap return IPersistentSet</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="3" iconUrl="http://dev.clojure.org/jira/images/icons/status_inprogress.gif">In Progress</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="importer">Assembla Importer</reporter>
                        <labels>
                    </labels>
                <created>Wed, 17 Jun 2009 00:55:00 -0500</created>
                <updated>Fri, 10 Dec 2010 08:48:40 -0600</updated>
                                    <version>Approved Backlog</version>
                                <fixVersion>Approved Backlog</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="22640" author="importer" created="Tue, 28 Sep 2010 07:00:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/69&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/69&lt;/a&gt;&lt;br/&gt;
Attachments:&lt;br/&gt;
keyset.patch - &lt;a href=&quot;https://www.assembla.com/spaces/clojure/documents/dKgE6mw3Gr3O2PeJe5afGb/download/dKgE6mw3Gr3O2PeJe5afGb&quot;&gt;https://www.assembla.com/spaces/clojure/documents/dKgE6mw3Gr3O2PeJe5afGb/download/dKgE6mw3Gr3O2PeJe5afGb&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="22641" author="importer" created="Tue, 28 Sep 2010 07:00:00 -0500"  >&lt;p&gt;oranenj said: [&lt;a href=&quot;file:dKgE6mw3Gr3O2PeJe5afGb&quot;&gt;file:dKgE6mw3Gr3O2PeJe5afGb&lt;/a&gt;]&lt;/p&gt;</comment>
                    <comment id="22642" author="importer" created="Tue, 28 Sep 2010 07:00: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="26003" author="stu" created="Fri, 3 Dec 2010 13:12:52 -0600"  >&lt;p&gt;patch not in correct format&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="10006">Incomplete</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-5] Unintuitive error response in clojure 1.0</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-5</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;The following broken code:&lt;/p&gt;

&lt;p&gt;(let [&lt;span class=&quot;error&quot;&gt;&amp;#91;x y&amp;#93;&lt;/span&gt; {}] x)&lt;/p&gt;

&lt;p&gt;provides the following stack trace:&lt;/p&gt;

&lt;p&gt;Exception in thread &quot;main&quot; java.lang.UnsupportedOperationException: nth not supported on this type: PersistentArrayMap (test.clj:0)&lt;br/&gt;
        at clojure.lang.Compiler.eval(Compiler.java:4543)&lt;br/&gt;
        at clojure.lang.Compiler.load(Compiler.java:4857)&lt;br/&gt;
        at clojure.lang.Compiler.loadFile(Compiler.java:4824)&lt;br/&gt;
        at clojure.main$load_script__5833.invoke(main.clj:206)&lt;br/&gt;
        at clojure.main$script_opt__5864.invoke(main.clj:258)&lt;br/&gt;
        at clojure.main$main__5888.doInvoke(main.clj:333)&lt;br/&gt;
        at clojure.lang.RestFn.invoke(RestFn.java:413)&lt;br/&gt;
        at clojure.lang.Var.invoke(Var.java:346)&lt;br/&gt;
        at clojure.lang.AFn.applyToHelper(AFn.java:173)&lt;br/&gt;
        at clojure.lang.Var.applyTo(Var.java:463)&lt;br/&gt;
        at clojure.main.main(main.java:39)&lt;br/&gt;
Caused by: java.lang.UnsupportedOperationException: nth not supported on this type: PersistentArrayMap&lt;br/&gt;
        at clojure.lang.RT.nth(RT.java:800)&lt;br/&gt;
        at clojure.core$nth__3578.invoke(core.clj:873)&lt;br/&gt;
        at user$eval__1.invoke(test.clj:1)&lt;br/&gt;
        at clojure.lang.Compiler.eval(Compiler.java:4532)&lt;br/&gt;
        ... 10 more&lt;/p&gt;

&lt;p&gt;The message &quot;nth not supported on this type&quot; while correct doesn&apos;t make the cause of the error very clear.  Better error messages when destructuring would be very helpful.&lt;/p&gt;</description>
                <environment></environment>
            <key id="13402">CLJ-5</key>
            <summary>Unintuitive error response in clojure 1.0</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="importer">Assembla Importer</reporter>
                        <labels>
                    </labels>
                <created>Wed, 17 Jun 2009 02:35:00 -0500</created>
                <updated>Sat, 28 Apr 2012 22:48:40 -0500</updated>
                                                    <fixVersion>Backlog</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="22468" author="importer" created="Tue, 24 Aug 2010 10:44:00 -0500"  >&lt;p&gt;Converted from &lt;a href=&quot;http://www.assembla.com/spaces/clojure/tickets/5&quot;&gt;http://www.assembla.com/spaces/clojure/tickets/5&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="27279" author="ekoontz" created="Fri, 11 Nov 2011 19:36:54 -0600"  >&lt;p&gt;Please see the attached patch which produces a (hopefully more clear) error message as shown below (given the broken code shown in the original bug report):&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;Clojure 1.4.0-master-SNAPSHOT
user=&amp;gt; (let [x 42 y 43] (+ x y))
85
user=&amp;gt; (let [[x y] {}] x)
UnsupportedOperationException left side of binding must be a symbol (found a PersistentVector instead).  clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.checkLet (&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6545)
user=&amp;gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In addition, this patch checks the argument of (let) as shown below:&lt;/p&gt;

&lt;div class=&quot;code panel&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 42)
UnsupportedOperationException argument to (let)  must be a vector (found a &lt;span class=&quot;code-object&quot;&gt;Long&lt;/span&gt; instead).  clojure.lang.&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.checkLet (&lt;span class=&quot;code-object&quot;&gt;Compiler&lt;/span&gt;.java:6553)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="27280" author="ekoontz" created="Fri, 11 Nov 2011 19:38:24 -0600"  >&lt;p&gt;Patch produced by doing git diff against commit ba930d95fc (master branch).&lt;/p&gt;</comment>
                    <comment id="27290" author="ekoontz" created="Sun, 13 Nov 2011 23:24:45 -0600"  >&lt;p&gt;Sorry, this patch is wrong: it assumes that the left side of the binding is wrong - the &lt;tt&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;x y&amp;#93;&lt;/span&gt;&lt;/tt&gt; in :&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(let [[x y] {}] x)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;because &lt;tt&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;x y&amp;#93;&lt;/span&gt;&lt;/tt&gt; is a vector, when in fact, the left side is fine (per &lt;a href=&quot;http://clojure.org/special_forms#let&quot;&gt;http://clojure.org/special_forms#let&lt;/a&gt; : &quot;Clojure supports abstract structural binding, often called destructuring, in let binding lists&quot;.)&lt;/p&gt;

&lt;p&gt;So it&apos;s the right side (the {}) that needs to be checked and flagged as erroneous, not the &lt;tt&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;x y&amp;#93;&lt;/span&gt;&lt;/tt&gt;.&lt;/p&gt;</comment>
                    <comment id="27374" author="carinmeier" created="Wed, 30 Nov 2011 12:15:24 -0600"  >&lt;p&gt;Add patch better-error-for-let-vector-map-binding&lt;/p&gt;

&lt;p&gt;This produces the following:&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(let [[x y] {}] x)
Exception map binding to vector is not supported&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There are other cases that are not handled by this though &amp;#8212; like binding vector to a set&lt;/p&gt;
&lt;div class=&quot;code panel&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 [[x y] #{}] x)
UnsupportedOperationException nth not supported on &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; type: PersistentHashSet&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Wondering if it might be better to try convert the map to a seq to support?  Although this might be another issue.&lt;/p&gt;

&lt;p&gt;Thoughts?&lt;/p&gt;</comment>
                    <comment id="27381" author="aaron" created="Wed, 30 Nov 2011 19:12:37 -0600"  >&lt;p&gt;This seems too specific. Is this issue indicative of a larger problem that should be addressed? Even if this is the only case where bindings produce poor error messages, all the cases described above should be addressed in the patch.  &lt;/p&gt;</comment>
                    <comment id="27473" author="carinmeier" created="Fri, 16 Dec 2011 07:47:56 -0600"  >&lt;p&gt;Unfortunately, realized that this still does not cover the nested destructuring cases.  Coming to the conclusion, that my approach above is not going to work for this.&lt;/p&gt;</comment>
                    <comment id="28309" author="carinmeier" created="Sat, 28 Apr 2012 22:46:34 -0500"  >&lt;p&gt;File: clj-5-destructure-error.diff &lt;/p&gt;

&lt;p&gt;Added support for nested destructuring errors&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;let [[[x1 y1][x2 y2]] [[1 2] {}]]
;=&amp;gt; UnsupportedOperationException let cannot destructure class clojure.lang.PersistentArrayMap.&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11124" name="clj-5-destructure-error.diff" size="5796" author="carinmeier" created="Sat, 28 Apr 2012 22:46:34 -0500" />
                    <attachment id="10697" name="CLJ-5.patch" size="2009" author="ekoontz" created="Fri, 11 Nov 2011 19:38:24 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10006">Incomplete</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>