<!--
RSS generated by JIRA (4.4#649-r158309) at Fri May 24 13:36:24 CDT 2013

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary add field=key&field=summary to the URL of your request.
For example:
http://dev.clojure.org/jira/sr/jira.issueviews:searchrequest-xml/temp/SearchRequest.xml?jqlQuery=labels+%3D+enhancement&tempMax=1000&field=key&field=summary
-->
<!-- If you wish to do custom client-side styling of RSS, uncomment this:
<?xml-stylesheet href="http://dev.clojure.org/jira/styles/jiraxml2html.xsl" type="text/xsl"?>
-->
<rss version="0.92">
    <channel>
        <title>Clojure JIRA</title>
        <link>http://dev.clojure.org/jira/secure/IssueNavigator.jspa?reset=true&amp;jqlQuery=labels+%3D+enhancement</link>
        <description>An XML representation of a search request</description>
                <language>en-us</language>
                        <issue start="0" end="29" total="29"/>
                <build-info>
            <version>4.4</version>
            <build-number>649</build-number>
            <build-date>25-07-2011</build-date>
        </build-info>
<item>
            <title>[TTRACE-1] Two convenience predicate functions useful for IDE-tools</title>
                <link>http://dev.clojure.org/jira/browse/TTRACE-1</link>
                <project id="10084" key="TTRACE">tools.trace</project>
                        <description>&lt;p&gt;In our IDE-tool clj-ns-browser, we show the user a list of vars and make it easy to add a trace by selecting a var and clicking a button.&lt;/p&gt;

&lt;p&gt;In order to only enable the button for a var that is traceable, we use predicate &quot;var-traceable?&quot;. &lt;/p&gt;

&lt;p&gt;In order to change the button text from &quot;trace&quot; to &quot;untrace&quot;, we use predicate &quot;var-traced?&quot;.&lt;/p&gt;

&lt;p&gt;Both &quot;var-traceable?&quot; and &quot;var-traced?&quot; are aware of tools.trace internals - ideally, we would like to remain oblivious to trace&apos;s inners...&lt;/p&gt;

&lt;p&gt;Our implementations for the predicates is at: &lt;a href=&quot;https://gist.github.com/2472261&quot;&gt;https://gist.github.com/2472261&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for the great tool!&lt;/p&gt;</description>
                <environment></environment>
            <key id="15356">TTRACE-1</key>
            <summary>Two convenience predicate functions useful for IDE-tools</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="lprefontaine">Luc Pr&#233;fontaine</assignee>
                                <reporter username="franks">Frank Siebenlist</reporter>
                        <labels>
                        <label>enhancement</label>
                    </labels>
                <created>Mon, 23 Apr 2012 12:11:34 -0500</created>
                <updated>Sat, 1 Dec 2012 15:38:58 -0600</updated>
                    <resolved>Sat, 1 Dec 2012 15:38:58 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29949" author="lprefontaine" created="Wed, 14 Nov 2012 17:56:48 -0600"  >&lt;p&gt;Done, however the names where changed to traced? and traceable?.&lt;/p&gt;</comment>
                    <comment id="29951" author="lprefontaine" created="Wed, 14 Nov 2012 18:18:46 -0600"  >&lt;p&gt;Done is 0.7.4&lt;/p&gt;</comment>
                    <comment id="30132" author="lprefontaine" created="Sat, 1 Dec 2012 15:38:41 -0600"  >&lt;p&gt;Done, &quot;good&quot; version is 0.7.5 (readme &amp;amp; comments need an update in 0.7.4&quot;)&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <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>[TNS-5] Allow any valid .clj* source file to be parsed/analysed</title>
                <link>http://dev.clojure.org/jira/browse/TNS-5</link>
                <project id="10052" key="TNS">tools.namespace</project>
                        <description>&lt;p&gt;This broadens the allowed file types to anything ending with #&quot;\.clj.?$&quot;, meaning this would work for clj, cljs, cljc, cljx and possibly other Clojure implementations with their own extension in the future. &lt;/p&gt;

&lt;p&gt;This allows libraries such as codox (and possibly autodoc) to work with ClojureScript and others implementations without any modification.&lt;/p&gt;

&lt;p&gt;Note: My CA is on the way, I sent it a week ago, I am not sure if it arrived yet (it was sent from Switzerland with normal mail, with an ETA of 1 week).&lt;/p&gt;</description>
                <environment></environment>
            <key id="15810">TNS-5</key>
            <summary>Allow any valid .clj* source file to be parsed/analysed</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="stuart.sierra">Stuart Sierra</assignee>
                                <reporter username="mpenet">Max Penet</reporter>
                        <labels>
                        <label>enhancement</label>
                    </labels>
                <created>Thu, 1 Nov 2012 15:30:08 -0500</created>
                <updated>Thu, 13 Dec 2012 02:40:21 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29888" author="mpenet" created="Fri, 2 Nov 2012 06:51:22 -0500"  >&lt;p&gt;CA received it seems (I am listed on &lt;a href=&quot;http://clojure.org/contributing&quot;&gt;http://clojure.org/contributing&lt;/a&gt; ).&lt;/p&gt;</comment>
                    <comment id="29895" author="stuart.sierra" created="Fri, 2 Nov 2012 15:23:28 -0500"  >&lt;p&gt;I&apos;m not sure about this. If you&apos;re only using c.t.n.find in isolation, it&apos;s fine. But if you&apos;re using code-reloading and c.t.n.repl, it could incorrectly try to reload .cljs files in JVM Clojure.&lt;/p&gt;

&lt;p&gt;We really need &lt;span class=&quot;error&quot;&gt;&amp;#91;Feature Expressions&amp;#93;&lt;/span&gt;&lt;a href=&quot;http://dev.clojure.org/display/design/Feature+Expressions&quot;&gt;http://dev.clojure.org/display/design/Feature+Expressions&lt;/a&gt; or something like it to get away from multiple file extensions.&lt;/p&gt;

&lt;p&gt;Until then, I think it has to be optional. I don&apos;t know how best to achieve this. The APIs in c.t.n.repl and c.t.n.dir are not amenable to extension. I&apos;ll think about it.&lt;/p&gt;</comment>
                    <comment id="29906" author="mpenet" created="Tue, 6 Nov 2012 18:11:05 -0600"  >&lt;p&gt;True, I didn&apos;t realize that. &lt;/p&gt;

&lt;p&gt;Maybe using a dynamic var to hold the regex pattern (or a predicate?) could be a reasonable solution in the meantime, this would allow to rebind it in the case of codox &amp;amp; similar libs.&lt;br/&gt;
I don&apos;t really &quot;like&quot; to use dynamic vars (or regexes!), but in this case it might make sense.&lt;br/&gt;
Not to mention it would also allow more flexibility on projects where you don&apos;t want to have your clj codoxed, but only your cljs for instance.&lt;/p&gt;</comment>
                    <comment id="30026" author="mpenet" created="Sat, 24 Nov 2012 07:47:39 -0600"  >&lt;p&gt;Any thoughts on my last comment/edit? I don&apos;t think there is a single doc lib that works with cljs at the moment, it is a bit painful to be honest.&lt;/p&gt;</comment>
                    <comment id="30027" author="stuart.sierra" created="Sat, 24 Nov 2012 16:25:42 -0600"  >&lt;p&gt;Yes, I think a dynamic var would be OK. However, I would like to know of a real use case, not just a potential one.&lt;/p&gt;</comment>
                    <comment id="30223" author="mpenet" created="Thu, 13 Dec 2012 02:40:21 -0600"  >&lt;p&gt;The idea was to be able to use codox on cljs files, I tried locally but there are other problems with this approach to be able to get to cljs vars metadata. So in the end I think you were right, maybe it&apos;s better to wait for feature expressions for this. &lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11654" name="e3cd6d1fa6e0c900bc1086e4a93bbc9cb343a820.patch" size="5317" author="mpenet" created="Thu, 1 Nov 2012 15:30:08 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[TCLI-2] Allow caller-supplied parse-fn</title>
                <link>http://dev.clojure.org/jira/browse/TCLI-2</link>
                <project id="10082" key="TCLI">tools.cli</project>
                        <description>&lt;p&gt;As for :parse-fn, a function can be supplied, this&lt;br/&gt;
is useful for standard use-cases such as: -vv, or when&lt;br/&gt;
you want to build a list from values.&lt;/p&gt;

&lt;p&gt;PR: &lt;a href=&quot;https://github.com/clojure/tools.cli/pull/11&quot;&gt;https://github.com/clojure/tools.cli/pull/11&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15821">TCLI-2</key>
            <summary>Allow caller-supplied parse-fn</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="gar3thjon3s">Gareth Jones</assignee>
                                <reporter username="pyr">Pierre-Yves Ritschard</reporter>
                        <labels>
                        <label>enhancement</label>
                    </labels>
                <created>Sun, 11 Nov 2012 05:31:25 -0600</created>
                <updated>Thu, 11 Apr 2013 09:48:37 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29930" author="jafingerhut" created="Sun, 11 Nov 2012 12:38:17 -0600"  >&lt;p&gt;Pierre-Yves, there are instructions for creating patches under the headings &quot;Development&quot; and &quot;Adding patches&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;

&lt;p&gt;Submissions to this module do require the author to sign a CA.  Instructions here: &lt;a href=&quot;http://clojure.org/contributing&quot;&gt;http://clojure.org/contributing&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30926" author="pyr" created="Thu, 11 Apr 2013 09:48:06 -0500"  >&lt;p&gt;Suggested Patch&lt;/p&gt;</comment>
                    <comment id="30927" author="pyr" created="Thu, 11 Apr 2013 09:48:37 -0500"  >&lt;p&gt;Hello, now that I&apos;m a registered contributor, I attached a file as suggested in the workflow wiki&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11952" name="TCLI-2.diff" size="2868" author="pyr" created="Thu, 11 Apr 2013 09:48:06 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[LOGIC-44] ex* could expand macros in patterns</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-44</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;So, tagged data structures are probably interesting in a relational context. Say you have a relation with some default logic about dogs:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defna friendlyo [Dog-Or-Breed]
    ([:Spot] succeed)
    ([:Spike] fail)
    ([Other-Dog] (fresh [Breed] (dog-breed Other-Dog Breed) (friendlyo Breed)))
    ([(breed :miniature-dachshund)] fail)
    ([(breed :golden-retriever)] succeed)
    ;. . .)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

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

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

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

&lt;p&gt;So this should just work, no need to explicitly support macros as far as I can tell. If it&apos;s not working, then there&apos;s a bug.&lt;/p&gt;</comment>
                    <comment id="28997" author="joeosborn" created="Thu, 19 Jul 2012 17:18:48 -0500"  >&lt;p&gt;At least on 0.7.5, matching against a macro gives a runtime error:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;Exception in thread &lt;span class=&quot;code-quote&quot;&gt;&quot;main&quot;&lt;/span&gt; java.lang.ClassCastException: clojure.core.logic.LVar cannot be &lt;span class=&quot;code-keyword&quot;&gt;cast&lt;/span&gt; to clojure.lang.IFn
	at rl.core$glyph_$fn__123$fn__144$fn__165$fn__166$_inc__167$fn__168.invoke(core.clj:61)
	at clojure.core.logic.Substitutions.bind(logic.clj:211)
	at rl.core$glyph_$fn__123$fn__144$fn__165$fn__166$_inc__167.invoke(core.clj:58)
	at clojure.core.logic$fn__1056$_inc__1057.invoke(logic.clj:1160)
	at clojure.core.logic$fn__1056$_inc__1057.invoke(logic.clj:1160)
	at clojure.core.logic$fn__898$_inc__899.invoke(logic.clj:823)
	at clojure.core.logic$fn__890$fn__891.invoke(logic.clj:828)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Using a fn instead of a macro gives the same:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;Exception in thread &lt;span class=&quot;code-quote&quot;&gt;&quot;main&quot;&lt;/span&gt; java.lang.ClassCastException: clojure.core.logic.LVar cannot be &lt;span class=&quot;code-keyword&quot;&gt;cast&lt;/span&gt; to clojure.lang.IFn
	at rl.core$drawable_$fn__235$fn__248$fn__249$_inc__250$fn__251.invoke(core.clj:67)
	at clojure.core.logic.Substitutions.bind(logic.clj:211)
	at rl.core$drawable_$fn__235$fn__248$fn__249$_inc__250.invoke(core.clj:65)
	at clojure.core.logic$fn__1056$_inc__1057.invoke(logic.clj:1160)
	at clojure.core.logic$fn__894$_inc__895.invoke(logic.clj:826)
	at clojure.core.logic$fn__1056$_inc__1057.invoke(logic.clj:1160)
	at clojure.core.logic$fn__898$_inc__899.invoke(logic.clj:823)
	at clojure.core.logic$fn__898$_inc__899.invoke(logic.clj:823)
	at clojure.core.logic$fn__898$_inc__899.invoke(logic.clj:823)
	at clojure.core.logic$fn__890$fn__891.invoke(logic.clj:828)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

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

&lt;p&gt;and type-enum as a macro:&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defmacro type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; [v] `[:&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :type ~v])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;and as a fn:&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defn type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; [v] [:&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :type ~v])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I&apos;ll mess around and see if my example works in HEAD.&lt;/p&gt;</comment>
                    <comment id="28998" author="joeosborn" created="Thu, 19 Jul 2012 17:37:36 -0500"  >&lt;p&gt;Same exception with this test case in HEAD (sorry for all the facts):&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defrel thing- [Thing])
(defrel type- [Thing] [Type])
(fact thing- [0])
(fact thing- [1])
(fact thing- [2])
(fact type- [0] [:player])
(fact type- [1] [:dragon])
(fact type- [2] [:pig])
(defn type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; [t] [:type t])
(defna drawable- [Key]
  ([[Thing]] (thing- [Thing]) (fresh [Type] (type- [Thing] [Type]) (drawable- [Type])))
  ([[(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :player)]] succeed)
  ([[(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)]] succeed))

(deftest &lt;span class=&quot;code-keyword&quot;&gt;do&lt;/span&gt;-fns-work
	(is (= (run* [q] (drawable- [q])) &apos;(0 1))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

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

&lt;p&gt;Using the REPL, I checked out how (defna drawable- . . .) expands (tidied up slightly):&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(def drawable- (clojure.core/fn ([Key] 
  (clojure.core.logic/conda 
	  ((clojure.core.logic/fresh [Thing] (clojure.core.logic/== [Thing] Key) (thing- [Thing]) (fresh [Type] (type- [Thing] [Type]) (drawable- [Type])))) 
		((clojure.core.logic/fresh [type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt;] 
		  (clojure.core.logic/== [(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :player)] Key) succeed))
		((clojure.core.logic/fresh [type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt;] 
		  (clojure.core.logic/== [(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)] Key) succeed))))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

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

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

&lt;p&gt;This pattern make it seem like you want to match:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;[[:type :dragon]]&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

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

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

&lt;p&gt;My patch, fwiw, doesn&apos;t exhibit that behavior (at least for macros, haven&apos;t tested it with fns).&lt;/p&gt;</comment>
                    <comment id="29002" author="dnolen" created="Thu, 19 Jul 2012 21:11:27 -0500"  >&lt;p&gt;What I mean is don&apos;t you want the following instead?&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defna drawable- [Key]
  ([[Thing]] (thing- [Thing]) (fresh [Type] (type- [Thing] [Type]) (drawable- [Type])))
  ([(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :player)] succeed)
  ([(type-&lt;span class=&quot;code-keyword&quot;&gt;enum&lt;/span&gt; :dragon)] succeed))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Note that I removed a layer of square brackets.&lt;/p&gt;</comment>
                    <comment id="29005" author="joeosborn" created="Fri, 20 Jul 2012 10:28:39 -0500"  >&lt;p&gt;Nope! I actually want both. I&apos;m doing some temporal logic stuff and I wanted some conveniences for &quot;updating&quot; a fluent, so I wanted to distinguish between the &quot;key part&quot; and the &quot;value part&quot; of the arguments. It looks silly for facts with no &quot;value part&quot;, but it lets me write procedures and fns something like this:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defrel heldo Time Fluent)
(defrel &#172;heldo Time Fluent)
(declare fluent-obtainedo) ; most recent &apos;held&apos; not terminated by a &apos;&#172;held&apos;, or fail
(defn alter-fluent [Time Rel Key NewVal]
  ;todo: error check, ensure old != &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt;, old obtains, &lt;span class=&quot;code-keyword&quot;&gt;new&lt;/span&gt; does not obtain
  (doseq [old-val (run* [old-val] (fluent-obtainedo Time [Rel Key old-val]))]
    (fact &#172;heldo Time [Rel Key old-val]))
  (fact heldo Time [Rel Key NewVal]))
. . .
(fact heldo 0 [&apos;pos [0] [0 0]])
. . .
(alter-fluent 1 &apos;pos [0] [1 1])&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And I write all the non-temporal fluents that way too for consistency and to help prevent mistakes.&lt;/p&gt;</comment>
                    <comment id="29009" author="dnolen" created="Fri, 20 Jul 2012 14:58:13 -0500"  >&lt;p&gt;I&apos;ll try to give a closer look at this issue over the weekend.&lt;/p&gt;</comment>
                    <comment id="30787" author="dnolen" created="Sun, 17 Mar 2013 19:05:17 -0500"  >&lt;p&gt;We&apos;re thinking about a more general solution here: &lt;a href=&quot;http://github.com/clojure/core.logic/wiki/Better-syntax-support&quot;&gt;http://github.com/clojure/core.logic/wiki/Better-syntax-support&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11389" name="exstar-macros.patch" size="1931" author="joeosborn" created="Thu, 19 Jul 2012 16:32:01 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[LOGIC-35] Core.logic equivalent of multimethods</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-35</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;I need to define predicates to which I can later (and from other namespaces) attach further clauses (so not just facts). I couldn&apos;t find any such functionality in the source. Due to the extensive use of macros, hacking such a system onto core.logic from the outside is extremely difficult, if not impossible (to me at least).&lt;/p&gt;

&lt;p&gt;I&apos;d love to implement this myself too, if given an OK and rough direction.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15314">LOGIC-35</key>
            <summary>Core.logic equivalent of multimethods</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="werg">Gabriel Pickard</reporter>
                        <labels>
                        <label>enhancement</label>
                    </labels>
                <created>Mon, 2 Apr 2012 19:32:56 -0500</created>
                <updated>Fri, 28 Dec 2012 00:48:09 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28068" author="werg" created="Tue, 3 Apr 2012 18:27:45 -0500"  >&lt;p&gt;I actually did manage to tack on a prototype that covers the basic behavior I would like to see: &lt;a href=&quot;https://github.com/werg/herpderp/blob/master/src/herpderp/multo.clj&quot;&gt;https://github.com/werg/herpderp/blob/master/src/herpderp/multo.clj&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I use a set stored in a ref in the defne&apos;s metadata to manage dynamic changes to the clauses. Upon changing that set using defclause I use eval to re-define the var using defne.&lt;/p&gt;

&lt;p&gt;This might not be nice, but allows me to continue developing features against it.&lt;/p&gt;</comment>
                    <comment id="30334" author="dnolen" created="Fri, 28 Dec 2012 00:48:02 -0600"  >&lt;p&gt;I don&apos;t think the current implementation can really support this and I don&apos;t think it&apos;s wise to try to hack around the current implementation. I&apos;d be willing to consider a comprehensive solution if someone is willing to do the legwork.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[DJSON-4] Please make function write-string public </title>
                <link>http://dev.clojure.org/jira/browse/DJSON-4</link>
                <project id="10041" key="DJSON">data.json</project>
                        <description>&lt;p&gt;Please make function write-string in namespace clojure.data.json public, instead of private as it is now: for example, i&apos;m extending java.sql.Timestamp with JSONWriter protocol and i need to send ISO formatted timestamp value as string:&lt;/p&gt;

&lt;p&gt;(defn- write-timestamp &lt;span class=&quot;error&quot;&gt;&amp;#91;Timestamp out&amp;#93;&lt;/span&gt;&lt;br/&gt;
  (write-string (convert-to-iso-time (.getTime Timestamp)) out))&lt;/p&gt;

&lt;p&gt;(extend java.sql.Timestamp js/JSONWriter {:-write write-timestamp})&lt;/p&gt;</description>
                <environment></environment>
            <key id="15765">DJSON-4</key>
            <summary>Please make function write-string public </summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="janherich">Jan Herich</reporter>
                        <labels>
                        <label>enhancement</label>
                    </labels>
                <created>Mon, 22 Oct 2012 03:51:18 -0500</created>
                <updated>Sat, 27 Oct 2012 13:12:54 -0500</updated>
                    <resolved>Sat, 27 Oct 2012 13:12:54 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29829" author="stuart.sierra" created="Sat, 27 Oct 2012 13:12:54 -0500"  >&lt;p&gt;Declined. &apos;write-string&apos; is an implementation detail, not something I will commit to as a public API. Use the :value-fn option of &apos;write&apos; to handle extension to new types. Or copy the implementation of &apos;write-string&apos; into your namespace.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

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

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

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

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

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

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

<item>
            <title>[CLJS-420] Unexpected behavior with dispatch on Keyword via protocols</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-420</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;At the moment if you create a protocol and expect it to be able to dispatch on keywords you need to do it in js/String, trying to extend on cljs.core.Keyword doesn&apos;t work as keywords are just Strings.&lt;/p&gt;

&lt;p&gt;See &lt;a href=&quot;https://gist.github.com/4104635&quot;&gt;https://gist.github.com/4104635&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15829">CLJS-420</key>
            <summary>Unexpected behavior with dispatch on Keyword via protocols</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="mpenet">Max Penet</reporter>
                        <labels>
                        <label>bug</label>
                        <label>enhancement</label>
                    </labels>
                <created>Sun, 18 Nov 2012 05:32:49 -0600</created>
                <updated>Sun, 18 Nov 2012 15:27:05 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29962" author="dnolen" created="Sun, 18 Nov 2012 15:14:51 -0600"  >&lt;p&gt;This is a known issue which will have to wait for if and when Keywords and Symbols become proper types in ClojureScript.&lt;/p&gt;

&lt;p&gt;Extending js/Object is not recommended, if you actually need to add functionality to the base JS native types the convention is different from Clojure: default instead of Object, string instead of js/String. Please refer to core.cljs if you want more examples.&lt;/p&gt;</comment>
                    <comment id="29964" author="mpenet" created="Sun, 18 Nov 2012 15:27:05 -0600"  >&lt;p&gt;Thanks for the pointer about default and string, I didn&apos;t know about that. &lt;/p&gt;

&lt;p&gt;I reported the issue at the demand of bbloom. It does seem to be difficult to address without taking a (major) performance hit unfortunately.  &lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-419] Exclude cljs source file from compilation</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-419</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Scenario:&lt;/p&gt;

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


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

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

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

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

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

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

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

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




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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;Mimmo&lt;/p&gt;</comment>
                    <comment id="30259" author="dnolen" created="Tue, 18 Dec 2012 15:09:20 -0600"  >&lt;p&gt;Should be resolved by tools that use the compiler.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11752" name="0001-CLJS-419-exclude-file-or-dir-from-compilation.patch" size="19588" author="magomimmo" created="Fri, 7 Dec 2012 10:30:34 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-402] Add a facility to obtain the version information of the clojurescript build that is in use</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-402</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Currently there is no function or var defined in the clojurescript library that can be used to easily obtain the version information of the build that is in use.&lt;/p&gt;

&lt;p&gt;Without that version information, debugging and reporting of errors is more cumbersome than needed, wastes time, causes confusion discussing issues...&lt;/p&gt;

&lt;p&gt;A simple function and/or var like the ones used for clojure would be very helpful:&lt;/p&gt;

&lt;p&gt;    user=&amp;gt; (clojure-version)&lt;br/&gt;
    &quot;1.4.0&quot;&lt;br/&gt;
    user=&amp;gt; &lt;b&gt;clojure-version&lt;/b&gt;&lt;br/&gt;
    {:major 1, :minor 4, :incremental 0, :qualifier nil}&lt;/p&gt;</description>
                <environment></environment>
            <key id="15764">CLJS-402</key>
            <summary>Add a facility to obtain the version information of the clojurescript build that is in use</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="franks">Frank Siebenlist</reporter>
                        <labels>
                        <label>enhancement</label>
                    </labels>
                <created>Sun, 21 Oct 2012 14:05:58 -0500</created>
                <updated>Tue, 26 Feb 2013 07:51:04 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29739" author="franks" created="Sun, 21 Oct 2012 14:16:08 -0500"  >&lt;p&gt;Auto-generation from the build script of version_autogen.clj and version_autogen.cljs files&lt;br/&gt;
that both define the cljs.version-autogen/&lt;b&gt;clojurescript-version&lt;/b&gt; &lt;br/&gt;
with the current version info for both the clj and cljs environments&lt;/p&gt;</comment>
                    <comment id="29740" author="dnolen" created="Sun, 21 Oct 2012 15:43:41 -0500"  >&lt;p&gt;Why a separate namespace for this?&lt;/p&gt;</comment>
                    <comment id="29743" author="franks" created="Sun, 21 Oct 2012 21:15:39 -0500"  >&lt;p&gt;Good point - probably better to add the &lt;b&gt;clojurescript-version&lt;/b&gt; var to the cljs.core namespace.&lt;/p&gt;

&lt;p&gt;New patch change the build script to auto-generates the &lt;b&gt;clojurescript-version&lt;/b&gt; assignment statements in both cljs/core.clj and cljs/core.cljs to reflect the correct version info.&lt;/p&gt;

&lt;p&gt;In that way it resembles more the clojure.core use of &lt;b&gt;clojure-version&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Note that the two separate assignments for clj and cljs are needed to detect out-of-sync of repl-compiler version with the compiler used to generate the js-code that was downloaded thru the webpage.&lt;/p&gt;

&lt;p&gt;Difficult to write a test-script, but it seems to work in my repl:&lt;/p&gt;

&lt;p&gt;&amp;#8212;&lt;br/&gt;
user=&amp;gt; (require &apos;cljs.core)&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; cljs.core/&amp;#42;clojurescript-version&amp;#42;&lt;br/&gt;
{:minor 0, :revision 1515, :major 0}&lt;br/&gt;
user=&amp;gt; (run-repl-listen)&lt;br/&gt;
&quot;Type: &quot; :cljs/quit &quot; to quit&quot;&lt;br/&gt;
ClojureScript:cljs.user&amp;gt; &amp;#42;clojurescript-version&amp;#42;&lt;br/&gt;
{:revision 1515, :major 0, :minor 0}&lt;br/&gt;
ClojureScript:cljs.user&amp;gt;&lt;br/&gt;
&amp;#8212;&lt;/p&gt;</comment>
                    <comment id="29744" author="franks" created="Sun, 21 Oct 2012 21:16:37 -0500"  >&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-402&quot; title=&quot;Add a facility to obtain the version information of the clojurescript build that is in use&quot;&gt;CLJS-402&lt;/a&gt;: build script auto-generates the &lt;b&gt;clojurescript-version&lt;/b&gt; assignment statements in both cljs/core.clj and cljs/core.cljs to reflect the correct version info&lt;/p&gt;</comment>
                    <comment id="29745" author="franks" created="Mon, 22 Oct 2012 00:00:57 -0500"  >&lt;p&gt;When I tried to implement a &quot;clojurescript-version&quot; function like the &quot;clojure-version&quot; one, I (re)discovered that cljs/core.clj is not your average cli-file but some funky file used by the clojurescript compiler to bootstrap - in other words it&apos;s not a good file to require and run normal functions from your clj-environment.&lt;/p&gt;

&lt;p&gt;So I moved the &amp;#42;clojurescript-version&amp;#42; var to cljs/compiler.clj as it seemed to make sense to associate the version with the compiler.&lt;/p&gt;

&lt;p&gt;On the cljs site, I left the &amp;#42;clojurescript-version&amp;#42; in cljs/core.cljs, although I was tempted to create a cljs.compiler namespace to store that var on the cljs side to make it symmetric &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/help_16.gif&quot; height=&quot;16&quot; width=&quot;16&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;.&lt;/p&gt;

&lt;p&gt;Also added a (clojurescript-version) function to both the clj and cljs sides, with an added special-fn in the cljs/repl.clj such that you can ask for the compiler version of the repl-server from the cljs-repl.&lt;/p&gt;

&lt;p&gt;Updated 3rd patch file replaces the previous one.&lt;/p&gt;

&lt;p&gt;Just wanted to record an example of a mismatch in compilers:&lt;/p&gt;

&lt;p&gt;    user=&amp;gt; (run-repl-listen)&lt;br/&gt;
    &quot;Type: &quot; :cljs/quit &quot; to quit&quot;&lt;br/&gt;
    ClojureScript:cljs.user&amp;gt; (clojurescript-version)&lt;br/&gt;
    &quot;0.0.1515&quot;&lt;br/&gt;
    ClojureScript:cljs.user&amp;gt; (clj-clojurescript-version)&lt;br/&gt;
    &quot;0.0.1516&quot;&lt;br/&gt;
    ClojureScript:cljs.user&amp;gt;&lt;/p&gt;

&lt;p&gt;This happens when you generate the javascript from your cljs with a &quot;lein cljsbuild once&quot; command with compiler version &quot;0.0.1515&quot;,&lt;br/&gt;
then upgrade the compiler to &quot;0.0.1516&quot; and then run the cljs-repl without regenerating the javascript for the webpage-download.&lt;br/&gt;
Very obscure things can happen after that...&lt;/p&gt;</comment>
                    <comment id="29746" author="franks" created="Mon, 22 Oct 2012 00:03:22 -0500"  >&lt;p&gt;build script auto-generates the clojurescript-version assignment statements in both cljs/compiler.clj and cljs/core.cljs to reflect the correct version info&lt;br/&gt;
Function &quot;clojurescript-version&quot; is added to both compiler.clj and core.cljs to mimic equivalent &quot;clojure-version&quot;&lt;br/&gt;
Special-fn &quot;clj-clojurescript-version was added to repl.clj to obtain the compiler&apos;s clojurescript-compiler version from the cljs-repl&lt;/p&gt;</comment>
                    <comment id="29748" author="dnolen" created="Mon, 22 Oct 2012 07:06:07 -0500"  >&lt;p&gt;The patch uses sed, I&apos;m not sure this is such a great idea since whatever the patch does should probably work with whatever build setup we have on Hudson.&lt;/p&gt;</comment>
                    <comment id="29750" author="chouser@n01se.net" created="Mon, 22 Oct 2012 08:05:58 -0500"  >&lt;p&gt;Would it make sense to call this &apos;clojure-version&apos; as well, instead of clojurescript-version?  It&apos;s a map, and so various flags could be added to differentiate jvm, js, python, c, etc. runtimes.  What does ClojureCLR do?&lt;/p&gt;</comment>
                    <comment id="29753" author="franks" created="Mon, 22 Oct 2012 10:52:44 -0500"  >&lt;p&gt;sed was already used in the build script... a few lines down, the pom file is transformed with:&lt;/p&gt;

&lt;p&gt;sed &amp;#45;e s/CLOJURESCRIPT_VERSION/0.0&amp;#45;$REVISION/ &amp;lt; &quot;$POM_TEMPLATE&quot; &amp;gt; &quot;$POM_FILE&quot;&lt;/p&gt;
</comment>
                    <comment id="29754" author="franks" created="Mon, 22 Oct 2012 11:15:08 -0500"  >&lt;p&gt;A quick scan of the src-code showed that ClojureCRL uses clojure-version and &amp;#42;clojure-version&amp;#42;.&lt;/p&gt;

&lt;p&gt;However, there is less chance for confusion as you are supposedly running on the CLR already.&lt;/p&gt;

&lt;p&gt;With ClojureScript you can have these three intertwined &quot;clojure&quot; environments that are all live at the same time: the clojure version, the repl clojurescript version, and the clojurescript version used to compile the initially loaded js. Not sure if overloading the clojure-version fn-name and relying on namespaces to differentiate will be helpful... but it&apos;s not that big of a deal and I&apos;m easily persuaded otherwise - somebody should make the call and I&apos;ll change it.&lt;/p&gt;</comment>
                    <comment id="30653" author="dnolen" created="Tue, 26 Feb 2013 07:51:04 -0600"  >&lt;p&gt;Sorry just now coming back to this ticket. I think it&apos;s probably preferable that the map of properties be called the same thing everywhere. I would apply the patch with this change. I note it no longer applies to master.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11595" name="CLJS402-3rd-patch-file.diff" size="4035" author="franks" created="Mon, 22 Oct 2012 00:03:22 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJS-398] new macro cljs.core/extend-instance</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-398</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Patch introduces an extend-instance macro, similar to extend-type.&lt;br/&gt;
It doesn&apos;t extend the .prototype property, but assigns the prototype impl members to the instance itself.&lt;/p&gt;

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

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

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

&lt;p&gt;Is a syntax similar to clojure.core/extend right for specify?&lt;br/&gt;
Should I create a new ticket?&lt;/p&gt;</comment>
                    <comment id="29718" author="dnolen" created="Fri, 19 Oct 2012 19:51:02 -0500"  >&lt;p&gt;As far as I understand it the interface for specify should be the same as extend-type.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11574" name="0001-new-macro-clojure.core-extend-instance-can-be-used-t.patch" size="1975" author="bendlas" created="Fri, 19 Oct 2012 01:05:55 -0500" />
                    <attachment id="11575" name="0001-Test-for-extend-instance.patch" size="759" author="bendlas" created="Fri, 19 Oct 2012 01:05:55 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-397] Omit var reads in statement context</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-397</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Attached patch updates cljs emitter to not emit var references in statement context.&lt;br/&gt;
That causes toplevel deftypes to not return their generated type, which lets gclosure strip them if unused&lt;/p&gt;

&lt;p&gt;cljs helloworld shrinks from ~90K to ~69K&lt;/p&gt;

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

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


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

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

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

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

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

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

&lt;p&gt;Updated attached patch contains just the optimization.&lt;/p&gt;</comment>
                    <comment id="29781" author="dnolen" created="Tue, 23 Oct 2012 18:49:53 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/97e5fbd1e1597d58be35fd8320c8044ccc9d3a3d&quot;&gt;http://github.com/clojure/clojurescript/commit/97e5fbd1e1597d58be35fd8320c8044ccc9d3a3d&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11598" name="0001-CLJS-397-var-reads-in-a-statement-context-get-omitte.patch" size="858" author="bendlas" created="Mon, 22 Oct 2012 14:58:51 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-387] Add docstring from def and ns definitions to @namespaces metadata map, and make reflect functions make use of that</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-387</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The docstrings were parsed from the definitions-forms for def and ns, but not added to the @namespaces metadata map.&lt;br/&gt;
There is no :doc entry used in the ns&apos; metadata in the @namespaces.&lt;br/&gt;
No ns&apos;s :doc info is communicated to the browser in the reflect functions with reflect/doc.&lt;br/&gt;
Patch-file is attached with code-changes that add the :doc info for ns and def to the @namespaces, and enhances the reflect functions to communicate that info to the browser in the reflect/doc call.&lt;/p&gt;</description>
                <environment>clojure/clojurescript &amp;quot;0.0-1450&amp;quot;</environment>
            <key id="15734">CLJS-387</key>
            <summary>Add docstring from def and ns definitions to @namespaces metadata map, and make reflect functions make use of that</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="franks">Frank Siebenlist</reporter>
                        <labels>
                        <label>docs</label>
                        <label>enhancement</label>
                        <label>patch,</label>
                        <label>reflection</label>
                    </labels>
                <created>Sun, 7 Oct 2012 16:26:43 -0500</created>
                <updated>Wed, 17 Oct 2012 10:57:56 -0500</updated>
                    <resolved>Wed, 17 Oct 2012 10:57:56 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29659" author="dnolen" created="Mon, 15 Oct 2012 23:06:46 -0500"  >&lt;p&gt;This patch no longer applies, mind updating it?&lt;/p&gt;</comment>
                    <comment id="29661" author="franks" created="Tue, 16 Oct 2012 00:10:17 -0500"  >&lt;p&gt;This patch should apply to master version on Mon, 15 Oct 2012 22:03:19 -0700 (4defcbcf19112b9be6a4a27b5d8855552bf94948)&lt;/p&gt;</comment>
                    <comment id="29670" author="dnolen" created="Wed, 17 Oct 2012 10:57:56 -0500"  >&lt;p&gt;Excellent, fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/bef56a74f2eeecabfe0c0a28d89b455dce576ea3&quot;&gt;http://github.com/clojure/clojurescript/commit/bef56a74f2eeecabfe0c0a28d89b455dce576ea3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please at the ticket # to the commit message though, thanks! &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11563" name="add-ns-def-doc-patch.diff" size="1934" author="franks" created="Tue, 16 Oct 2012 00:10:17 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-260] Add clojure.core/shuffle implementation</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-260</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I added a simple implementation of clojure.core/shuffle, which uses goog.array&apos;s Fisher-Yates for its implementation.  Included in the patch is a test to make sure it works.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15451">CLJS-260</key>
            <summary>Add clojure.core/shuffle implementation</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="emezeske">Evan Mezeske</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch,</label>
                        <label>test</label>
                    </labels>
                <created>Thu, 17 May 2012 18:45:48 -0500</created>
                <updated>Sun, 20 May 2012 22:28:09 -0500</updated>
                    <resolved>Sun, 20 May 2012 22:28:09 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28514" author="dnolen" created="Thu, 17 May 2012 19:07:19 -0500"  >&lt;p&gt;Why don&apos;t you return a vector like Clojure does?&lt;/p&gt;</comment>
                    <comment id="28515" author="emezeske" created="Thu, 17 May 2012 19:11:13 -0500"  >&lt;p&gt;Return a vector like Clojure.&lt;/p&gt;</comment>
                    <comment id="28530" author="dnolen" created="Fri, 18 May 2012 21:23:09 -0500"  >&lt;p&gt;The patch is not correctly formatted with attribution.&lt;/p&gt;</comment>
                    <comment id="28546" author="emezeske" created="Sun, 20 May 2012 16:24:21 -0500"  >&lt;p&gt;Use git format-patch instead of git diff, to hopefully provide the right patch format.&lt;/p&gt;</comment>
                    <comment id="28547" author="dnolen" created="Sun, 20 May 2012 22:28:09 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/b06905863a9b0ce3618634d8fe0effb3aefd4063&quot;&gt;http://github.com/clojure/clojurescript/commit/b06905863a9b0ce3618634d8fe0effb3aefd4063&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11237" name="0001-Add-clojure.core-shuffle-and-a-test.patch" size="1700" author="emezeske" created="Sun, 20 May 2012 16:24:21 -0500" />
                    <attachment id="11223" name="shuffle.patch" size="1420" author="emezeske" created="Thu, 17 May 2012 18:45:48 -0500" />
                    <attachment id="11224" name="shuffle.v2.patch" size="1420" author="emezeske" created="Thu, 17 May 2012 19:11:13 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJ-1203] Fallback to hash-based comparison for non-Comparables in Util.compare()</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1203</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;I oftentimes use sorted collections, and my comparator functions usually look like that:&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;(fn [a b]
  (let [x (compare-according-to-my-use-case a b)]
    (if (zero? x)
       (compare a b)
       x)))
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

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

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

&lt;p&gt;The patch I&apos;m going to attach extends `Util.compare()` with a fallback clause that performs a `hasheq()`-based comparison.  This results in a meaningless but at least stable sorting order which suffices for use-cases like the one  shown above.&lt;/p&gt;</description>
                <environment></environment>
            <key id="16148">CLJ-1203</key>
            <summary>Fallback to hash-based comparison for non-Comparables in Util.compare()</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tsdh">Tassilo Horn</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                    </labels>
                <created>Wed, 17 Apr 2013 02:42:29 -0500</created>
                <updated>Mon, 29 Apr 2013 02:30:08 -0500</updated>
                    <resolved>Mon, 29 Apr 2013 02:30:08 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="30974" author="jafingerhut" created="Thu, 18 Apr 2013 21:01:21 -0500"  >&lt;p&gt;Patch 0001-Add-hasheq-based-fallback-to-Util.compare.patch dated Apr 17 2013 applies cleanly to latest master, but causes several unit tests in data_structures.clj to fail.  These are the kinds of things you would expect to fail with the change made in the patch, because the failing tests expect an exception to be thrown when comparing objects that don&apos;t implement Comparable, and with this patch&apos;s changes they no longer do.  If this patch&apos;s change is desired, those tests should probably be removed.&lt;/p&gt;</comment>
                    <comment id="30975" author="tsdh" created="Fri, 19 Apr 2013 02:34:51 -0500"  >&lt;p&gt;Thanks Andy, I can&apos;t believe I&apos;ve forgotten to re-run the tests. &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;

&lt;p&gt;Anyway, I&apos;m attaching a new version of the patch that deletes the few sorted-set and sorted-set-by invocations that check that an exception is thrown when creating sorted sets containing non-Comparables.&lt;/p&gt;</comment>
                    <comment id="30976" author="tsdh" created="Fri, 19 Apr 2013 02:35:28 -0500"  >&lt;p&gt;New version of the patch.&lt;/p&gt;</comment>
                    <comment id="31003" author="jafingerhut" created="Fri, 26 Apr 2013 14:47:49 -0500"  >&lt;p&gt;Tassilo, you say that one of your use cases is sorted collections.  Note that any compare function that returns 0 for two values will cause sorted sets and maps to treat the two compared values as equal, and at most one of them will get into the ordered set/map, the second treated as a duplicate, even though the values are not equal.  See &lt;a href=&quot;https://github.com/jafingerhut/thalia/blob/master/doc/other-topics/comparators.md#comparators-for-sorted-sets-and-maps-are-easy-to-get-wrong&quot;&gt;https://github.com/jafingerhut/thalia/blob/master/doc/other-topics/comparators.md#comparators-for-sorted-sets-and-maps-are-easy-to-get-wrong&lt;/a&gt; for an example (not based on your modified compare, but on a comparator that returns 0 for non-equal items).&lt;/p&gt;

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

&lt;p&gt;I&apos;m closing that ticket.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11965" name="0001-Add-hasheq-based-fallback-to-Util.compare.patch" size="3032" author="tsdh" created="Fri, 19 Apr 2013 02:35:28 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJ-1177] clojure.java.io/resource and non-ASCII characters</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1177</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;clojure.java.io/resource corrupts path containing UTF-8 characters without issuing warning.&lt;/p&gt;

&lt;div class=&quot;code panel&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;System&lt;/span&gt;/getProperty &lt;span class=&quot;code-quote&quot;&gt;&quot;java.runtime.version&quot;&lt;/span&gt;)
&lt;span class=&quot;code-quote&quot;&gt;&quot;1.8.0-ea-b79&quot;&lt;/span&gt;
user=&amp;gt; (clojure-version)
&lt;span class=&quot;code-quote&quot;&gt;&quot;1.5.0&quot;&lt;/span&gt;
user=&amp;gt; (&lt;span class=&quot;code-object&quot;&gt;System&lt;/span&gt;/getProperty &lt;span class=&quot;code-quote&quot;&gt;&quot;user.dir&quot;&lt;/span&gt;)
&lt;span class=&quot;code-quote&quot;&gt;&quot;/dir/d&#233;f&quot;&lt;/span&gt;
user=&amp;gt; (clojure.java.io/resource &lt;span class=&quot;code-quote&quot;&gt;&quot;myfile.txt&quot;&lt;/span&gt;)
#&amp;lt;URL file:/dir/d%c3%a9f/resources/myfile.txt&amp;gt;
user=&amp;gt; (slurp (clojure.java.io/resource &lt;span class=&quot;code-quote&quot;&gt;&quot;myfile.txt&quot;&lt;/span&gt;) :encoding &lt;span class=&quot;code-quote&quot;&gt;&quot;UTF-8&quot;&lt;/span&gt;)
FileNotFoundException /dir/d&#195;&#169;f/resources/myfile.txt (No such file or directory)  java.io.FileInputStream.open (FileInputStream.java:-2)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="16062">CLJ-1177</key>
            <summary>clojure.java.io/resource and non-ASCII characters</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="trevor">Trevor Wennblom</reporter>
                        <labels>
                        <label>bug</label>
                        <label>enhancement</label>
                    </labels>
                <created>Thu, 7 Mar 2013 16:54:43 -0600</created>
                <updated>Sun, 10 Mar 2013 17:56:52 -0500</updated>
                                    <version>Release 1.5</version>
                                                        <due></due>
                    <votes>1</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30713" author="jafingerhut" created="Fri, 8 Mar 2013 00:10:22 -0600"  >&lt;p&gt;Below is a workaround, at least.  I don&apos;t know, but perhaps the as-file method for URLs in io.clj of Clojure, the part that converts %hh sequences to a character with code point in the range 0 through 255, is at least partly at fault here.  I don&apos;t know right now if it is possible to modify that code to handle the general case of whatever character encoding munging is going on here to when .getResource creates the URL object.&lt;/p&gt;


&lt;p&gt;clojure.java.io/resource is documented to return a Java object of type java.net.URL, which seems like it does %hh escaping of many characters.  Reference &lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt; to a Java bug from 2001 where a Java user was surprised by the then-recent change in behavior of the getResource method &lt;span class=&quot;error&quot;&gt;&amp;#91;2&amp;#93;&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Doing a little searching I found this StackOverflow question &lt;span class=&quot;error&quot;&gt;&amp;#91;3&amp;#93;&lt;/span&gt;, which has what might be a workaround.  I tried it on my Mac OS X 10.6 system running JDK 1.6 and it seemed to work:&lt;/p&gt;

&lt;p&gt;(slurp (.getContent (clojure.java.io/resource &quot;abc&#237;d/foo.txt&quot;)))&lt;/p&gt;

&lt;p&gt;That getContent is a method for class java.net.URL &lt;span class=&quot;error&quot;&gt;&amp;#91;4&amp;#93;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt; &lt;a href=&quot;http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4466485&quot;&gt;http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4466485&lt;/a&gt;&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;2&amp;#93;&lt;/span&gt; &lt;a href=&quot;http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getResource%28java.lang.String%29&quot;&gt;http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html#getResource%28java.lang.String%29&lt;/a&gt;&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;3&amp;#93;&lt;/span&gt; &lt;a href=&quot;http://stackoverflow.com/questions/13013629/best-international-alternative-to-javas-getclass-getresource&quot;&gt;http://stackoverflow.com/questions/13013629/best-international-alternative-to-javas-getclass-getresource&lt;/a&gt;&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;4&amp;#93;&lt;/span&gt; &lt;a href=&quot;http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URL.html#getContent%28%29&quot;&gt;http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URL.html#getContent%28%29&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30716" author="trevor" created="Fri, 8 Mar 2013 09:56:22 -0600"  >&lt;p&gt;Hi Andy,&lt;/p&gt;

&lt;p&gt;Thanks for the background and suggestions, that&apos;s very helpful.&lt;/p&gt;

&lt;p&gt;I&apos;m gradually learning Clojure with no Java experience. In this case I was searching for the preferred Clojure way to access items in directories declared under :resource-paths in a Leiningen project.clj file. Perhaps clojure.java.io/resource isn&apos;t the best way to do this as it&apos;s possibly too tied to the expectation for a URI instead of a more general IRI.&lt;/p&gt;

&lt;p&gt;You&apos;re suggested workaround did work for my use case:&lt;/p&gt;

&lt;p&gt;(slurp (.getContent (clojure.java.io/resource &quot;abc&#237;d/foo.txt&quot;)))&lt;/p&gt;

&lt;p&gt;but hopefully there would be more native/direct Clojure way to accomplish the same eventually.&lt;/p&gt;

&lt;p&gt;I don&apos;t know if java.net.IDN would be useful internally as a fix in clojure.java.io/resource &#8212; I&apos;m assuming not since it wasn&apos;t added until Java 6.&lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&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;user=&amp;gt; (&lt;span class=&quot;code-keyword&quot;&gt;import&lt;/span&gt; &apos;java.net.IDN)
java.net.IDN
user=&amp;gt; (java.net.IDN/toASCII &lt;span class=&quot;code-quote&quot;&gt;&quot;/dir/d&#233;f&quot;&lt;/span&gt;)
&lt;span class=&quot;code-quote&quot;&gt;&quot;xn--/dir/df-gya&quot;&lt;/span&gt;
user=&amp;gt; (java.net.IDN/toUnicode &lt;span class=&quot;code-quote&quot;&gt;&quot;xn--/dir/df-gya&quot;&lt;/span&gt;)
&lt;span class=&quot;code-quote&quot;&gt;&quot;/dir/d&#233;f&quot;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;


&lt;p&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt;: &lt;a href=&quot;http://docs.oracle.com/javase/6/docs/api/java/net/IDN.html&quot;&gt;http://docs.oracle.com/javase/6/docs/api/java/net/IDN.html&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30717" author="jafingerhut" created="Fri, 8 Mar 2013 13:30:05 -0600"  >&lt;p&gt;Patch clj-1177-patch-v1.txt dated Mar 8 2013 is an attempt to solve this issue, in what I think may be a correct way.  As specified in RFC 3986, when taking a Unicode string and making a URL of it, it should be encoded in UTF-8 and then each individual byte is subject to the %HH hex encoding.  This patch reverses that to turn URLs into file names.&lt;/p&gt;

&lt;p&gt;Tested on Mac OS X 10.6 with a command line like this (it doesn&apos;t work without the -Dfile.encoding=UTF-8 option on my Mac, probably because the default encoding is MacRoman):&lt;/p&gt;

&lt;p&gt;% java -cp clojure.jar:path/to/resource -Dfile.encoding=UTF-8 clojure.main&lt;br/&gt;
user=&amp;gt; (require &apos;&lt;span class=&quot;error&quot;&gt;&amp;#91;clojure.java.io :as io&amp;#93;&lt;/span&gt;)&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; (io/resource &quot;abc&#237;d/foo.txt&quot;)&lt;br/&gt;
#&amp;lt;URL &lt;a href=&quot;file:/Users/jafinger/clj/clj-ns-browser/resource/abc%c3%add/foo.txt&quot;&gt;file:/Users/jafinger/clj/clj-ns-browser/resource/abc%c3%add/foo.txt&lt;/a&gt;&amp;gt;&lt;br/&gt;
user=&amp;gt; (slurp (io/resource &quot;abc&#237;d/foo.txt&quot;))&lt;br/&gt;
&quot;The quick brown fox jumped over the l&#225;zy d&#246;g!\n&quot;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11900" name="clj-1177-patch-v1.txt" size="2673" author="jafingerhut" created="Fri, 8 Mar 2013 13:30:05 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJ-1165] Forbid varargs defprotocol/definterface method declarations because those cannot be defined anyway</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1165</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Protocol, interface method declarations don&apos;t allow for varags.  Currently, for example&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;  (defprotocol FooBar
    (foo [this &amp;amp; more]))
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

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

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

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

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

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

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

&lt;p&gt;(And I wonder if we should be using ex-info for all errors going forward.)&lt;/p&gt;</comment>
                    <comment id="30853" author="tsdh" created="Sun, 31 Mar 2013 05:17:34 -0500"  >&lt;p&gt;New version of the patch that mentions both method name and argument vector, and uses ex-info as Stu suggested.&lt;/p&gt;</comment>
                    <comment id="30874" author="jafingerhut" created="Thu, 4 Apr 2013 19:24:27 -0500"  >&lt;p&gt;Presumuptuously changing Approval from Incomplete back to None, since the reason for marking it Incomplete seems to have been addressed with a new patch.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11933" name="0001-Protocol-interface-method-declarations-don-t-allow-f.patch" size="3236" author="tsdh" created="Sun, 31 Mar 2013 05:17:34 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJ-1155] Suppress tracebacks from clojure.core</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1155</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;It would be really nice if we could hide the Java traceback from the compiler when it&apos;s not relevant. When there&apos;s no Java interop, it&apos;s not useful. I can&apos;t see any case where we want the tracebacks from the compiler referencing clojure.core.&lt;/p&gt;

&lt;p&gt;Here&apos;s how a syntax error traceback looks at the moment on trunk:&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;$ more dodgy-map.clj
(defn dodgy-map []
  {:1 :2 :3})
$ java -cp target/clojure-1.5.0-master-SNAPSHOT.jar clojure.main dodgy-map.clj
Exception in thread &quot;main&quot; java.lang.RuntimeException: Map literal must contain an even number of forms, compiling:(/home/wilfred/src/clojure/dodgy-map.clj:2:13)
	at clojure.lang.Compiler.load(Compiler.java:7070)
	at clojure.lang.Compiler.loadFile(Compiler.java:7020)
	at clojure.main$load_script.invoke(main.clj:286)
	at clojure.main$script_opt.invoke(main.clj:348)
	at clojure.main$main$fn__6682.invoke(main.clj:432)
	at clojure.main$main.doInvoke(main.clj:429)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.lang.Var.invoke(Var.java:415)
	at clojure.lang.AFn.applyToHelper(AFn.java:161)
	at clojure.lang.Var.applyTo(Var.java:532)
	at clojure.main.main(main.java:37)
Caused by: java.lang.RuntimeException: Map literal must contain an even number of forms
	at clojure.lang.Util.runtimeException(Util.java:219)
	at clojure.lang.LispReader$MapReader.invoke(LispReader.java:1090)
	at clojure.lang.LispReader.readDelimitedList(LispReader.java:1145)
	at clojure.lang.LispReader$ListReader.invoke(LispReader.java:979)
	at clojure.lang.LispReader.read(LispReader.java:182)
	at clojure.lang.Compiler.load(Compiler.java:7058)
	... 10 more
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With my patch, this is simplified to:&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;$ java -cp target/clojure-1.5.0-master-SNAPSHOT.jar clojure.main dodgy-map.clj
java.lang.RuntimeException: Map literal must contain an even number of forms, compiling:(/home/wilfred/src/clojure/dodgy-map.clj:2:13)
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Another example: here&apos;s how name errors appear on trunk:&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;$ more i-dont-exist.clj
(defn no-such-variable []
  i-dont-exist)
$ java -cp target/clojure-1.5.0-master-SNAPSHOT.jar clojure.main i-dont-exist.clj
Exception in thread &quot;main&quot; java.lang.RuntimeException: Unable to resolve symbol: i-dont-exist in this context, compiling:(/home/wilfred/src/clojure/i-dont-exist.clj:1:1)
	at clojure.lang.Compiler.analyze(Compiler.java:6380)
	at clojure.lang.Compiler.analyze(Compiler.java:6322)
	at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:5708)
	at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5139)
	at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3751)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:6558)
	at clojure.lang.Compiler.analyze(Compiler.java:6361)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:6548)
	at clojure.lang.Compiler.analyze(Compiler.java:6361)
	at clojure.lang.Compiler.access$100(Compiler.java:37)
	at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:529)
	at clojure.lang.Compiler.analyzeSeq(Compiler.java:6560)
	at clojure.lang.Compiler.analyze(Compiler.java:6361)
	at clojure.lang.Compiler.analyze(Compiler.java:6322)
	at clojure.lang.Compiler.eval(Compiler.java:6623)
	at clojure.lang.Compiler.load(Compiler.java:7063)
	at clojure.lang.Compiler.loadFile(Compiler.java:7020)
	at clojure.main$load_script.invoke(main.clj:286)
	at clojure.main$script_opt.invoke(main.clj:348)
	at clojure.main$main$fn__6682.invoke(main.clj:432)
	at clojure.main$main.doInvoke(main.clj:429)
	at clojure.lang.RestFn.invoke(RestFn.java:408)
	at clojure.lang.Var.invoke(Var.java:415)
	at clojure.lang.AFn.applyToHelper(AFn.java:161)
	at clojure.lang.Var.applyTo(Var.java:532)
	at clojure.main.main(main.java:37)
Caused by: java.lang.RuntimeException: Unable to resolve symbol: i-dont-exist in this context
	at clojure.lang.Util.runtimeException(Util.java:219)
	at clojure.lang.Compiler.resolveIn(Compiler.java:6874)
	at clojure.lang.Compiler.resolve(Compiler.java:6818)
	at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6779)
	at clojure.lang.Compiler.analyze(Compiler.java:6343)
	... 25 more
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With patch:&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;$ java -cp target/clojure-1.5.0-master-SNAPSHOT.jar clojure.main i-dont-exist.clj
java.lang.RuntimeException: Unable to resolve symbol: i-dont-exist in this context, compiling:(/home/wilfred/src/clojure/i-dont-exist.clj:1:1)
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I&apos;m not familiar with the compiler internals, but I&apos;ve attached a tentative patch. Undoubtedly it isn&apos;t perfect. For one, it would be nicer to say &apos;Syntax error&apos; rather than &apos;java.lang.RuntimeException&apos;. All the tests pass with this change.&lt;/p&gt;

&lt;p&gt;Relevant mailing list discussion: &lt;a href=&quot;https://groups.google.com/forum/?fromgroups=#!searchin/clojure/wilfred/clojure/M5NlEW7HJ_c/joUY6mo6Rd8J&quot;&gt;https://groups.google.com/forum/?fromgroups=#!searchin/clojure/wilfred/clojure/M5NlEW7HJ_c/joUY6mo6Rd8J&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please let me know what you think. This would make my life easier when developing.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15984">CLJ-1155</key>
            <summary>Suppress tracebacks from clojure.core</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="wilfred">Wilfred Hughes</reporter>
                        <labels>
                        <label>enhancement</label>
                    </labels>
                <created>Fri, 1 Feb 2013 17:44:16 -0600</created>
                <updated>Fri, 29 Mar 2013 06:06:12 -0500</updated>
                    <resolved>Fri, 29 Mar 2013 06:06:12 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30837" author="stu" created="Fri, 29 Mar 2013 06:06:12 -0500"  >&lt;p&gt;It is easy for tools that consume Clojure to hide stack traces for those who do not want to see them.  If Clojure itself eats stack traces, it is impossible for those of us who &lt;b&gt;do&lt;/b&gt; want to see them to get them back.&lt;/p&gt;

&lt;p&gt;Please do this kind of work in tool (if at all) and make it optional for users.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11827" name="suppress_tracebacks.patch" size="1016" author="wilfred" created="Fri, 1 Feb 2013 17:44:16 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

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

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


&lt;p&gt;This is faster than what is done currently and can be very much faster if there is contention on the delay.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15645">CLJ-1050</key>
            <summary>Remove a lock in the common case of  deref of delay</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="nicolasoury">Nicolas Oury</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                        <label>performance</label>
                    </labels>
                <created>Sun, 26 Aug 2012 13:24:00 -0500</created>
                <updated>Tue, 18 Sep 2012 06:53:01 -0500</updated>
                    <resolved>Tue, 18 Sep 2012 06:53:01 -0500</resolved>
                            <version>Release 1.4</version>
                                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29270" author="nicolasoury" created="Mon, 27 Aug 2012 02:37:12 -0500"  >&lt;p&gt;Please close and reject. The patch is not working if val has non final fields.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11454" name="0001-No-lock-in-the-common-path-for-delays.patch" size="1177" author="nicolasoury" created="Sun, 26 Aug 2012 13:24:00 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[CLJ-1042] [PATCH] Allow negative substring indices for (subs)</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1042</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;This adds Python-style negative string indices for (subs), e.g.:&lt;/p&gt;

&lt;p&gt;(subs &quot;foo bar&quot; -3) ;; -&amp;gt; &quot;bar&quot;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15629">CLJ-1042</key>
            <summary>[PATCH] Allow negative substring indices for (subs)</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="ieure">Ian Eure</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                    </labels>
                <created>Tue, 14 Aug 2012 13:11:40 -0500</created>
                <updated>Wed, 19 Sep 2012 13:34:50 -0500</updated>
                    <resolved>Mon, 17 Sep 2012 07:07:57 -0500</resolved>
                            <version>Release 1.5</version>
                                                        <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="29196" author="jafingerhut" created="Thu, 16 Aug 2012 19:17:19 -0500"  >&lt;p&gt;Ian, thanks for the patch.  It is Rich Hickey&apos;s policy only to consider applying patches to Clojure from those who have signed a Clojure contributor agreement: &lt;a href=&quot;http://clojure.org/contributing&quot;&gt;http://clojure.org/contributing&lt;/a&gt;&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;All: clojure.string is incomplete in more important and fundamental ways than negative indexes. This sucks now, and will suck worse as more code is written in different dialects. I find myself wishing string was a contrib, so we could iterate faster.&lt;/p&gt;</comment>
                    <comment id="29500" author="jafingerhut" created="Wed, 19 Sep 2012 13:34:50 -0500"  >&lt;p&gt;Stuart: Any specific proposals for how you&apos;d like to see clojure.string improve?  If it can be made a contrib, that would be cool, but understood if that would be considered too breaking of a change.  Even if it isn&apos;t made a contrib, having tickets for improvement ideas you are willing to see means patches might get written, and they&apos;ll get in some time.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11480" name="clj-1042-negative-indices-patch3.txt" size="6402" author="ieure" created="Thu, 6 Sep 2012 12:17:30 -0500" />
                    <attachment id="11425" name="negative-subs.patch" size="3266" author="ieure" created="Tue, 14 Aug 2012 13:11:40 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;For some benchmarking details, see: &lt;a href=&quot;https://groups.google.com/d/msg/clojure/MizwTxHwLE4/hGLrMfetlP8J&quot;&gt;https://groups.google.com/d/msg/clojure/MizwTxHwLE4/hGLrMfetlP8J&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28802" author="tsdh" created="Thu, 14 Jun 2012 02:32:38 -0500"  >&lt;p&gt;Here&apos;s some benchmark:&lt;/p&gt;

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

&lt;p&gt;So for me, the patch is good and makes sense.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11307" name="0001-CLJ-1010-Add-a-left-to-right-version-of-comp-comp.patch" size="2569" author="tsdh" created="Mon, 11 Jun 2012 05:16:50 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJ-991] partition-by reducer</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-991</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description></description>
                <environment></environment>
            <key id="15428">CLJ-991</key>
            <summary>partition-by reducer</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="hiredman">Kevin Downey</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Thu, 10 May 2012 20:08:20 -0500</created>
                <updated>Mon, 4 Mar 2013 14:49:42 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29140" author="richhickey" created="Tue, 14 Aug 2012 13:52:39 -0500"  >&lt;p&gt;I&apos;d like to see something much faster than this.&lt;/p&gt;</comment>
                    <comment id="29161" author="hiredman" created="Wed, 15 Aug 2012 01:58:59 -0500"  >&lt;p&gt;For reference here is a benchmark of a non-reducers (seq based) process that uses partition-by&lt;/p&gt;

&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;user=&amp;gt; (def x (vec (range 1e6)))
#&apos;user/x
user=&amp;gt; (bench (reduce + (map count (partition-by #(or (zero? (mod % 3)) (zero? (mod % 5))) x))))
Evaluation count             : 60
             Execution time mean : 1.072157 sec  95.0% CI: (1.070606 sec, 1.073381 sec)
    Execution time std-deviation : 165.818282 ms  95.0% CI: (163.873585 ms, 168.271261 ms)
         Execution time lower ci : 972.562000 ms  95.0% CI: (972.562000 ms, 973.301850 ms)
         Execution time upper ci : 1.419148 sec  95.0% CI: (1.419148 sec, 1.419148 sec)

Found 7 outliers in 60 samples (11.6667 %)
	low-severe	 2 (3.3333 %)
	low-mild	 5 (8.3333 %)
 Variance from outliers : 85.8489 % Variance is severely inflated by outliers
nil
user=&amp;gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

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

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

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

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

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

<item>
            <title>[CLJ-982] Implement an interface? predicate to balance class?</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-982</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;clojure.core implements a class? predicate to detect if a thing is an instance of java.lang.Class. The attached patch implements interface? to further distinguish classes that are also interfaces. This gives us Clojure api for e.g., enumerating all interfaces a thing&apos;s base class implements; as in, (filter #(interface? %) (supers (class my-thing))).&lt;/p&gt;</description>
                <environment>Any</environment>
            <key id="15407">CLJ-982</key>
            <summary>Implement an interface? predicate to balance class?</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="davidrupp">David Rupp</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch</label>
                        <label>test</label>
                    </labels>
                <created>Fri, 4 May 2012 21:16:07 -0500</created>
                <updated>Sat, 9 Jun 2012 09:08:46 -0500</updated>
                    <resolved>Fri, 8 Jun 2012 12:29:30 -0500</resolved>
                            <version>Release 1.5</version>
                                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28748" author="stu" created="Fri, 8 Jun 2012 12:28:58 -0500"  >&lt;p&gt;I would prefer to see this, and other interop/reflective items, in a separate contrib lib.&lt;/p&gt;</comment>
                    <comment id="28763" author="davidrupp" created="Sat, 9 Jun 2012 09:08:46 -0500"  >&lt;p&gt;Thanks for the feedback, Stu. Is there an existing contrib lib for stuff like this? Or should I create one?&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11170" name="drupp-add-interface-predicate.diff" size="1433" author="davidrupp" created="Fri, 4 May 2012 21:16:07 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJ-920] Adds support for FreeDesktop&apos;s xdg-open in clojure.java.browse/browse-url.</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-920</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;This patch allows environments that support FreeDesktop to browse a URL in their default browser. This is important because unless the desktop environment bridges to Java (like Gnome does) the URL will be opened in a Swing window, which is not always desired.&lt;/p&gt;

&lt;p&gt;See: &lt;a href=&quot;https://github.com/clojure/clojure/pull/14&quot;&gt;https://github.com/clojure/clojure/pull/14&lt;/a&gt;&lt;/p&gt;</description>
                <environment>Any environment that supports FreeDesktop, so Linux and BSD mainly.</environment>
            <key id="15150">CLJ-920</key>
            <summary>Adds support for FreeDesktop&apos;s xdg-open in clojure.java.browse/browse-url.</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="jeremyheiler">Jeremy Heiler</reporter>
                        <labels>
                        <label>enhancement</label>
                    </labels>
                <created>Sat, 28 Jan 2012 10:45:35 -0600</created>
                <updated>Fri, 1 Mar 2013 12:47:01 -0600</updated>
                    <resolved>Wed, 29 Feb 2012 13:19:52 -0600</resolved>
                            <version>Release 1.3</version>
                                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27704" author="jafingerhut" created="Fri, 10 Feb 2012 05:08:51 -0600"  >&lt;p&gt;Is this a duplicate of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-896&quot; title=&quot;Make browse-url aware of xdg-open&quot;&gt;&lt;del&gt;CLJ-896&lt;/del&gt;&lt;/a&gt;?  Can you look at the patch there and see if there is any advantage to the patch for it vs. the one here?  Or perhaps some combination that is an improvement on them both?&lt;/p&gt;</comment>
                    <comment id="27890" author="jafingerhut" created="Wed, 29 Feb 2012 13:19:53 -0600"  >&lt;p&gt;The issue is definitely a duplicate of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-896&quot; title=&quot;Make browse-url aware of xdg-open&quot;&gt;&lt;del&gt;CLJ-896&lt;/del&gt;&lt;/a&gt;.  The proposed patches were different.  &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-896&quot; title=&quot;Make browse-url aware of xdg-open&quot;&gt;&lt;del&gt;CLJ-896&lt;/del&gt;&lt;/a&gt; now has an attached patch that is an enhancement of what Jeremy Heiler created.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10793" name="browseurl.patch" size="653" author="jeremyheiler" created="Sat, 28 Jan 2012 10:45:35 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJ-918] Vars with {:macro true} meta data do not work when loaded from AOT compiled file</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-918</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;When defining a var with &lt;tt&gt;^{:macro true&lt;/tt&gt;} the call of the binded macro does emit a warning when the definition has been AOT compiled.&lt;/p&gt;

&lt;p&gt;See example outputs with demo code here: &lt;a href=&quot;https://refheap.com/paste/389&quot;&gt;https://refheap.com/paste/389&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bronsa on #clojure created a patch: &lt;a href=&quot;http://sprunge.us/bWcc&quot;&gt;http://sprunge.us/bWcc&lt;/a&gt;&lt;/p&gt;</description>
                <environment>Tested with 1.3.0 and 1.4.0</environment>
            <key id="15145">CLJ-918</key>
            <summary>Vars with {:macro true} meta data do not work when loaded from AOT compiled file</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="3">Duplicate</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="jannschu">Jannik Schorg</reporter>
                        <labels>
                        <label>Compiler</label>
                        <label>enhancement</label>
                        <label>metadata</label>
                    </labels>
                <created>Mon, 23 Jan 2012 16:06:06 -0600</created>
                <updated>Thu, 13 Sep 2012 14:29:01 -0500</updated>
                    <resolved>Thu, 13 Sep 2012 14:29:01 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29437" author="jafingerhut" created="Thu, 13 Sep 2012 14:29:01 -0500"  >&lt;p&gt;Duplicate of &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-1021&quot; title=&quot;(let [i 5] (defmacro m [v] v) m) interprets m as a function, not a macro&quot;&gt;CLJ-1021&lt;/a&gt;.  Later ticket kept in preference to this one, because it has a patch and this one does not.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10010">New</customfieldvalue>

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

<item>
            <title>[CCACHE-27] Missing LU and LRU is linear complexity - performance</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-27</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;Profiling some code with YourKit showed a hotspot in cache statistics on (miss) for LU and LRU caches.&lt;/p&gt;

&lt;p&gt;Basically two issues:  (count (keys {....})) is a count of a seq, not efficient. Replaced with a count of the map.&lt;/p&gt;

&lt;p&gt;Secondly, (apply f anything) is slow. Profiler showed that the (apply min-key) was really slow.  This is mitigated by using a c.d.priority-map instead.   On a priority-map, (ffirst {}) or (first (peek {}).&lt;/p&gt;

&lt;p&gt;Also inverted the logic for threshold comparison.  Since there is a (build-leastness-queue) that populates statistics, should caches should favor codepaths for the state of being full all the time?&lt;/p&gt;</description>
                <environment>Mac Oracle JDK, Linux OpenJDK</environment>
            <key id="15672">CCACHE-27</key>
            <summary>Missing LU and LRU is linear complexity - performance</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="gshayban@gmail.com">Ghadi Shayban</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>performance</label>
                    </labels>
                <created>Tue, 4 Sep 2012 11:26:54 -0500</created>
                <updated>Wed, 12 Sep 2012 09:27:56 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29391" author="gshayban" created="Thu, 6 Sep 2012 22:49:14 -0500"  >&lt;p&gt;I take back the part about (apply) being slow.  I think it&apos;s more the fact that it&apos;s doing a linear scan on keys every single time.&lt;/p&gt;

&lt;p&gt;(apply) does show up a lot in a profiler, but I haven&apos;t figured out why.  (apply + (range big)) seems to even be slightly faster than (reduce +) on the same range.&lt;/p&gt;
</comment>
                    <comment id="29426" author="gshayban" created="Wed, 12 Sep 2012 09:27:56 -0500"  >&lt;p&gt;Patch in proper format&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11492" name="priority-map-fixed.patch" size="5639" author="gshayban" created="Wed, 12 Sep 2012 09:27:56 -0500" />
                    <attachment id="11475" name="priority-map.patch" size="4909" author="gshayban@gmail.com" created="Tue, 4 Sep 2012 11:26:54 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CCACHE-22] Change limit parameter name in TTLCache</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-22</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;&quot;limit&quot; is used in other caches to represent quantity, for TTL it represents time. Using the same name is confusing&lt;/p&gt;</description>
                <environment></environment>
            <key id="15309">CCACHE-22</key>
            <summary>Change limit parameter name in TTLCache</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="paraseba">Sebasti&#225;n Bernardo Galkin</reporter>
                        <labels>
                        <label>enhancement</label>
                        <label>patch,</label>
                        <label>ttl</label>
                    </labels>
                <created>Fri, 30 Mar 2012 09:05:57 -0500</created>
                <updated>Fri, 15 Jun 2012 13:49:12 -0500</updated>
                    <resolved>Fri, 15 Jun 2012 13:48:43 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28821" author="fogus" created="Fri, 15 Jun 2012 13:48:43 -0500"  >&lt;p&gt;Changed to :ttl-ms&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11027" name="Changed-limit-parameter-name-in-TTLCache.patch" size="2096" author="paraseba" created="Fri, 30 Mar 2012 09:05:57 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CCACHE-4] Added LIRS factory fn</title>
                <link>http://dev.clojure.org/jira/browse/CCACHE-4</link>
                <project id="10171" key="CCACHE">core.cache</project>
                        <description>&lt;p&gt;LIRS is implemented as a type only ATM.  There should also be a corresponding factory fn.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15048">CCACHE-4</key>
            <summary>Added LIRS factory fn</summary>
                <type id="3" iconUrl="http://dev.clojure.org/jira/images/icons/task.gif">Task</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="fogus">Fogus</assignee>
                                <reporter username="fogus">Fogus</reporter>
                        <labels>
                        <label>cache</label>
                        <label>enhancement</label>
                    </labels>
                <created>Tue, 6 Dec 2011 08:41:41 -0600</created>
                <updated>Thu, 8 Dec 2011 12:11:00 -0600</updated>
                    <resolved>Thu, 8 Dec 2011 12:11:00 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="27426" author="fogus" created="Thu, 8 Dec 2011 12:11:00 -0600"  >&lt;p&gt;Completed in f4d1bf9f1069ba875a7a6a8a65646b35c6fbfd8f&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                        </customfields>
    </item>
</channel>
</rss>