<!--
RSS generated by JIRA (4.4#649-r158309) at Fri May 24 20:53:04 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+%22patch%2C%22&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+%22patch%2C%22</link>
        <description>An XML representation of a search request</description>
                <language>en-us</language>
                        <issue start="0" end="44" total="44"/>
                <build-info>
            <version>4.4</version>
            <build-number>649</build-number>
            <build-date>25-07-2011</build-date>
        </build-info>
<item>
            <title>[MTOWER-3] BigDecimal: unnecessary reflection  used in  math functions for coercion (bigint)</title>
                <link>http://dev.clojure.org/jira/browse/MTOWER-3</link>
                <project id="10080" key="MTOWER">math.numeric-tower</project>
                        <description>&lt;p&gt;This improves performance, because no reflection has to be used (bigint):&lt;/p&gt;


&lt;p&gt;Patched:&lt;br/&gt;
clojure.math.numeric-tower&amp;gt; (time (let &lt;span class=&quot;error&quot;&gt;&amp;#91;b (BigDecimal. &amp;quot;2.2&amp;quot;)&amp;#93;&lt;/span&gt; (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;x 10000000&amp;#93;&lt;/span&gt; (round b))))&lt;br/&gt;
&quot;Elapsed time: 1640.177041 msecs&quot;                                                                                                                                                             &lt;br/&gt;
Orig:                                                                                                                                                                                         &lt;br/&gt;
clojure.math.numeric-tower&amp;gt; (time (let &lt;span class=&quot;error&quot;&gt;&amp;#91;b (BigDecimal. &amp;quot;2.2&amp;quot;)&amp;#93;&lt;/span&gt; (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;x 10000000&amp;#93;&lt;/span&gt; (round b))))&lt;br/&gt;
&quot;Elapsed time: 3498.339271 msecs&quot;&lt;/p&gt;
</description>
                <environment></environment>
            <key id="16186">MTOWER-3</key>
            <summary>BigDecimal: unnecessary reflection  used in  math functions for coercion (bigint)</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="markengelberg">Mark Engelberg</assignee>
                                <reporter username="juergenhoetzel">J&#252;rgen H&#246;tzel</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 13 May 2013 14:48:19 -0500</created>
                <updated>Mon, 13 May 2013 14:48:19 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                                <attachments>
                    <attachment id="11990" name="0001-Use-coercion-and-rounding-methods-provided-by-BigDec.patch" size="1195" author="juergenhoetzel" created="Mon, 13 May 2013 14:48:19 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[LOGIC-64] Support inequalities in finite domain sugar</title>
                <link>http://dev.clojure.org/jira/browse/LOGIC-64</link>
                <project id="10020" key="LOGIC">core.logic</project>
                        <description>&lt;p&gt;The attached patch enables the follow code:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(run* [x]
  (infd x (interval 0 9))
  (eqfd (!= 6 (* 2 x))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can also substitute != with &amp;lt;, &amp;gt;, &amp;gt;=, or &amp;lt;=&lt;/p&gt;</description>
                <environment></environment>
            <key id="15786">LOGIC-64</key>
            <summary>Support inequalities in finite domain sugar</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="dnolen">David Nolen</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Fri, 26 Oct 2012 22:37:35 -0500</created>
                <updated>Sat, 27 Oct 2012 11:33:23 -0500</updated>
                    <resolved>Sat, 27 Oct 2012 11:33:23 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29827" author="dnolen" created="Sat, 27 Oct 2012 11:33:23 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/core.logic/commit/423639c62584c0100f295cc87c1cf2f721e986e3&quot;&gt;http://github.com/clojure/core.logic/commit/423639c62584c0100f295cc87c1cf2f721e986e3&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11623" name="LOGIC-64-v1.patch" size="1843" author="bbloom" created="Fri, 26 Oct 2012 22:39:09 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[JDBC-31] distinct? throws clojure.lang.ArityException, when  applied with no arguments</title>
                <link>http://dev.clojure.org/jira/browse/JDBC-31</link>
                <project id="10021" key="JDBC">java.jdbc</project>
                        <description>&lt;p&gt;HSQLDB returns an empty ResultSet when using (.getGeneratedKeys stmt)&lt;br/&gt;
and no keys are generated. So this Exception is thrown for each record&lt;br/&gt;
without generated keys.&lt;/p&gt;

&lt;p&gt;While this Exception is caught in do-prepared-return-keys, this can lead to a huge overhead caused by the JVM exception handling. I did a performance test. &lt;/p&gt;

&lt;p&gt;Before 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;clojure.java.test-jdbc&amp;gt; (time (sql/with-connection hsqldb-db (count (apply sql/insert-records :dummy  (map #(hash-map :name (str %) :id %) (range 10000))))))
&quot;Elapsed time: 3429.346743 msecs&quot;
10000
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After 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; clojure.java.test-jdbc&amp;gt; (time (sql/with-connection hsqldb-db (count (apply sql/insert-records :dummy  (map #(hash-map :name (str %) :id %) (range 10000))))))
&quot;Elapsed time: 1397.444753 msecs&quot;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15438">JDBC-31</key>
            <summary>distinct? throws clojure.lang.ArityException, when  applied with no arguments</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="seancorfield">Sean Corfield</assignee>
                                <reporter username="juergenhoetzel">J&#252;rgen H&#246;tzel</reporter>
                        <labels>
                        <label>patch,</label>
                        <label>performance</label>
                    </labels>
                <created>Sat, 12 May 2012 11:51:01 -0500</created>
                <updated>Sun, 10 Jun 2012 17:24:42 -0500</updated>
                    <resolved>Sun, 10 Jun 2012 17:24:42 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28770" author="seancorfield" created="Sun, 10 Jun 2012 17:24:42 -0500"  >&lt;p&gt;Thanx for the patch!&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11208" name="0001-add-make-cols-unique-test-case-empty-cols.patch" size="906" author="juergenhoetzel" created="Sat, 12 May 2012 11:51:01 -0500" />
                    <attachment id="11209" name="0002-distinct-throws-clojure.lang.ArityException-when-app.patch" size="1576" author="juergenhoetzel" created="Sat, 12 May 2012 11:51: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>[JDBC-29] Performance improvement (Remove intermediate lazy sequence in resultset-seq)</title>
                <link>http://dev.clojure.org/jira/browse/JDBC-29</link>
                <project id="10021" key="JDBC">java.jdbc</project>
                        <description>&lt;p&gt;This improves performance on large result sets by up to 30%.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15424">JDBC-29</key>
            <summary>Performance improvement (Remove intermediate lazy sequence in resultset-seq)</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="seancorfield">Sean Corfield</assignee>
                                <reporter username="juergenhoetzel">J&#252;rgen H&#246;tzel</reporter>
                        <labels>
                        <label>patch,</label>
                        <label>performance</label>
                    </labels>
                <created>Thu, 10 May 2012 11:21:14 -0500</created>
                <updated>Thu, 10 May 2012 12:09:00 -0500</updated>
                    <resolved>Thu, 10 May 2012 12:09:00 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28422" author="seancorfield" created="Thu, 10 May 2012 12:09:00 -0500"  >&lt;p&gt;Nice catch!&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11183" name="0001-Don-t-create-intermediate-lazy-sequences-of-vectors.patch" size="970" author="juergenhoetzel" created="Thu, 10 May 2012 11:21:14 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                                                                                            </customfields>
    </item>

<item>
            <title>[DXML-1] Stack overflow when parsing huge XML file</title>
                <link>http://dev.clojure.org/jira/browse/DXML-1</link>
                <project id="10077" key="DXML">data.xml</project>
                        <description>&lt;p&gt;This is using Ryan Senior&apos;s new 0.0.3-SNAPSHOT.&lt;/p&gt;

&lt;p&gt;While trying to parse a huge XML file (7.5 GB compressed, a dump of Wikipedia), got a stack overflow error. Some digging turned up this bug:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6440214&quot;&gt;http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6440214&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Modifying &lt;tt&gt;clojure.data.xml/source-seq&lt;/tt&gt; to disable the &lt;tt&gt;IS_COALESCING&lt;/tt&gt; property got rid of the error.&lt;/p&gt;

&lt;p&gt;The old lazy-xml contrib code worked (although used up tons more memory).&lt;/p&gt;

&lt;p&gt;Attached is a patch that adds keyword options to &lt;tt&gt;source-seq&lt;/tt&gt;, &lt;tt&gt;parse&lt;/tt&gt;, and &lt;tt&gt;parse-str&lt;/tt&gt;, allowing the consumer to disable coalescing and sidestep the upstream bug.&lt;/p&gt;</description>
                <environment>OS X</environment>
            <key id="15218">DXML-1</key>
            <summary>Stack overflow when parsing huge XML file</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="ryansenior">Ryan Senior</assignee>
                                <reporter username="jkkramer">Justin Kramer</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Fri, 10 Feb 2012 09:13:18 -0600</created>
                <updated>Tue, 20 Mar 2012 08:05:15 -0500</updated>
                    <resolved>Tue, 20 Mar 2012 08:05:15 -0500</resolved>
                                                                    <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27971" author="ryansenior" created="Tue, 20 Mar 2012 08:05:15 -0500"  >&lt;p&gt;Thanks Justin!&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10903" name="data-xml-kwopts.patch" size="3539" author="jkkramer" created="Fri, 10 Feb 2012 09:13:18 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-441] Require implicit &apos;do nodes for all blocks in AST</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-441</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Discussion here: &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/6CVTsW1EQn4/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/6CVTsW1EQn4/discussion&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15886">CLJS-441</key>
            <summary>Require implicit &apos;do nodes for all blocks in AST</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Wed, 12 Dec 2012 13:15:48 -0600</created>
                <updated>Fri, 21 Dec 2012 17:36:42 -0600</updated>
                    <resolved>Fri, 21 Dec 2012 17:36:42 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30220" author="bbloom" created="Wed, 12 Dec 2012 13:18:34 -0600"  >&lt;p&gt;This patch depends on the patch at &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-440&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-440&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30221" author="bbloom" created="Wed, 12 Dec 2012 15:18:35 -0600"  >&lt;p&gt;This patch would also address &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-416&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-416&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="30280" author="dnolen" created="Fri, 21 Dec 2012 17:36:42 -0600"  >&lt;p&gt;Fixed &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/764565e9e7696379ada5ac8168b20ee5f9cde6a2&quot;&gt;http://github.com/clojure/clojurescript/commit/764565e9e7696379ada5ac8168b20ee5f9cde6a2&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11760" name="CLJS-441-v001.patch" size="11443" author="bbloom" created="Wed, 12 Dec 2012 13:18:34 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-440] Replace :is-loop flag in AST with distinct :loop op</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-440</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Discussion here: &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/6CVTsW1EQn4/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/6CVTsW1EQn4/discussion&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15885">CLJS-440</key>
            <summary>Replace :is-loop flag in AST with distinct :loop op</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Wed, 12 Dec 2012 13:07:03 -0600</created>
                <updated>Fri, 21 Dec 2012 17:12:07 -0600</updated>
                    <resolved>Fri, 21 Dec 2012 17:12:07 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30219" author="bbloom" created="Wed, 12 Dec 2012 13:14:35 -0600"  >&lt;p&gt;Whoops. Accidentally made a Clojure issue instead of a ClojureScript issue. Moved the ticket and reuploaded patch with correct ticket #&lt;/p&gt;</comment>
                    <comment id="30278" author="dnolen" created="Fri, 21 Dec 2012 17:12:07 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/26b2541cd66d3139eca354434a56137218b17d09&quot;&gt;http://github.com/clojure/clojurescript/commit/26b2541cd66d3139eca354434a56137218b17d09&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11758" name="CLJS-1126-v001.patch" size="2339" author="bbloom" created="Wed, 12 Dec 2012 13:08:21 -0600" />
                    <attachment id="11759" name="CLJS-440-v001.patch" size="2339" author="bbloom" created="Wed, 12 Dec 2012 13:14:35 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-437] Missing &quot;Too few arguments to if&quot; check</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-437</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;(if) and (if 1) both return nil. JVM clojure throws &quot;Too few arguments to if&quot;.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15874">CLJS-437</key>
            <summary>Missing &quot;Too few arguments to if&quot; check</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Thu, 6 Dec 2012 15:10:10 -0600</created>
                <updated>Fri, 7 Dec 2012 00:03:55 -0600</updated>
                    <resolved>Fri, 7 Dec 2012 00:03:55 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30182" author="dnolen" created="Fri, 7 Dec 2012 00:03:55 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/9abeb143f66ad6d92756c2dd702966f63ae76c27&quot;&gt;https://github.com/clojure/clojurescript/commit/9abeb143f66ad6d92756c2dd702966f63ae76c27&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11750" name="CLJS-437-v001.patch" size="759" author="bbloom" created="Thu, 6 Dec 2012 15:11:24 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-432] Include line and file information in error messages</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-432</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Just as the ana/warning function did, now errors and assertions include line and file source information. I needed this sorely.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15862">CLJS-432</key>
            <summary>Include line and file information in error messages</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Wed, 28 Nov 2012 17:47:55 -0600</created>
                <updated>Fri, 30 Nov 2012 11:25:39 -0600</updated>
                    <resolved>Fri, 30 Nov 2012 11:25:39 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30081" author="bbloom" created="Wed, 28 Nov 2012 18:13:04 -0600"  >&lt;p&gt;Added v2 of patch that will handle any exception during parsing. Similar could be done during code generation. This approach seems much more robust and less invasive.&lt;/p&gt;</comment>
                    <comment id="30082" author="bbloom" created="Wed, 28 Nov 2012 23:15:18 -0600"  >&lt;p&gt;That v2 was made hastily. Upon further thought, it seems broken in the face of recursive analysis. I think the right thing, if we prefer the exception catching approach, is to rethrow as a custom exception type, which would be allowed through un-re-wrapped.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(&lt;span class=&quot;code-keyword&quot;&gt;try&lt;/span&gt;
  (parse-form ...)
  (&lt;span class=&quot;code-keyword&quot;&gt;catch&lt;/span&gt; AnalysisError e
    &lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; e)
  (&lt;span class=&quot;code-keyword&quot;&gt;catch&lt;/span&gt; Throwable e
    (&lt;span class=&quot;code-keyword&quot;&gt;throw&lt;/span&gt; (AnalysisError. env e))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="30089" author="dnolen" created="Thu, 29 Nov 2012 11:32:25 -0600"  >&lt;p&gt;I don&apos;t have a problem with the approach in the first patch. I don&apos;t really see how a less invasive patch is even possible - you still need to pass the environment to some assertion check if you are going to throw a custom exception as well.&lt;/p&gt;</comment>
                    <comment id="30092" author="bbloom" created="Thu, 29 Nov 2012 14:28:12 -0600"  >&lt;p&gt;v3 of patch fixes issue with v2&lt;/p&gt;</comment>
                    <comment id="30093" author="bbloom" created="Thu, 29 Nov 2012 14:50:44 -0600"  >&lt;p&gt;v4 of patch as discussed in irc&lt;/p&gt;</comment>
                    <comment id="30096" author="bbloom" created="Thu, 29 Nov 2012 14:57:54 -0600"  >&lt;p&gt;v5 also catches error from parse-invoke&lt;/p&gt;</comment>
                    <comment id="30102" author="bbloom" created="Thu, 29 Nov 2012 17:05:46 -0600"  >&lt;p&gt;v6 improves errors in repl as discussed in IRC&lt;/p&gt;</comment>
                    <comment id="30109" author="dnolen" created="Fri, 30 Nov 2012 11:25:39 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/af4ab91754d30f082b117b40c07ea94d0063c0d6&quot;&gt;http://github.com/clojure/clojurescript/commit/af4ab91754d30f082b117b40c07ea94d0063c0d6&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11721" name="CLJS-432-v001.patch" size="14888" author="bbloom" created="Wed, 28 Nov 2012 17:48:43 -0600" />
                    <attachment id="11722" name="CLJS-432-v002.patch" size="6487" author="bbloom" created="Wed, 28 Nov 2012 18:13:04 -0600" />
                    <attachment id="11727" name="CLJS-432-v003.patch" size="6637" author="bbloom" created="Thu, 29 Nov 2012 14:28:12 -0600" />
                    <attachment id="11728" name="CLJS-432-v004.patch" size="2228" author="bbloom" created="Thu, 29 Nov 2012 14:50:44 -0600" />
                    <attachment id="11730" name="CLJS-432-v005.patch" size="2380" author="bbloom" created="Thu, 29 Nov 2012 14:57:54 -0600" />
                    <attachment id="11732" name="CLJS-432-v006.patch" size="3934" author="bbloom" created="Thu, 29 Nov 2012 17:05:46 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-431] namespace and name fail on &apos;/</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-431</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Both the &apos;namespace and the &apos;name functions use .lastIndexOf to search for &quot;/&quot;. This fails on the division symbol if you don&apos;t provide a starting index to search from.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15861">CLJS-431</key>
            <summary>namespace and name fail on &apos;/</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Tue, 27 Nov 2012 04:17:27 -0600</created>
                <updated>Fri, 30 Nov 2012 11:56:54 -0600</updated>
                    <resolved>Fri, 30 Nov 2012 11:56:54 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30111" author="dnolen" created="Fri, 30 Nov 2012 11:56:54 -0600"  >&lt;p&gt;fixed in commit 5ac15039c685af19810dc5b35f06a496be1f3369&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11713" name="CLJS-431-v001.patch" size="1800" author="bbloom" created="Tue, 27 Nov 2012 04:18:37 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-424] Internal representation of keywords can not be differentiated by printable characters</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-424</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Currently, Symbols are represented by (str \uFDD1 \&apos; name) and keywords are represented by (str \uFDD0 \&apos; name)&lt;/p&gt;

&lt;p&gt;The \uFDDX character is not printable, so it appears as a little box when printed in a javascript repl such as the browser&apos;s console. The following character is always a \&apos; regardless of whether the object is a symbol or a keyword. This has bitten me during debugging on several occasions. The attached patch changes keywords to be represented internally by (str \uFFD1 \: name)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15838">CLJS-424</key>
            <summary>Internal representation of keywords can not be differentiated by printable characters</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 19 Nov 2012 17:33:48 -0600</created>
                <updated>Sat, 22 Dec 2012 15:45:34 -0600</updated>
                    <resolved>Sat, 22 Dec 2012 15:45:34 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="30302" author="dnolen" created="Sat, 22 Dec 2012 15:45:34 -0600"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/21eab986826bd7a9e852712aaeda647a5de59b3b&quot;&gt;http://github.com/clojure/clojurescript/commit/21eab986826bd7a9e852712aaeda647a5de59b3b&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11689" name="CLJS-424-v1.patch" size="1526" author="bbloom" created="Mon, 19 Nov 2012 17:35:47 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-416] emit-block doesn&apos;t use context argument</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-416</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;emit-block currently has arguments &lt;span class=&quot;error&quot;&gt;&amp;#91;context statements ret&amp;#93;&lt;/span&gt; but the context argument is never used and all call sites always draw statements and ret from the same block AST node. The attach patch simplifies emit-block and all call sites to use arguments [{:keys &lt;span class=&quot;error&quot;&gt;&amp;#91;statement ret&amp;#93;&lt;/span&gt;}]&lt;/p&gt;</description>
                <environment></environment>
            <key id="15819">CLJS-416</key>
            <summary>emit-block doesn&apos;t use context argument</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="2">Declined</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Fri, 9 Nov 2012 18:20:54 -0600</created>
                <updated>Fri, 21 Dec 2012 17:30:54 -0600</updated>
                    <resolved>Fri, 21 Dec 2012 17:30:54 -0600</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="30279" author="bbloom" created="Fri, 21 Dec 2012 17:30:54 -0600"  >&lt;p&gt;Obsoleted by &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-441&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-441&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11670" name="CLJS-316-v1.patch" size="5148" author="bbloom" created="Fri, 9 Nov 2012 18:22:08 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-409] Small code cleanup for emitting goog.provide statements</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-409</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Just abstracts out a duplicated piece of code.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15787">CLJS-409</key>
            <summary>Small code cleanup for emitting goog.provide statements</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Sat, 27 Oct 2012 16:07:40 -0500</created>
                <updated>Sat, 27 Oct 2012 16:52:59 -0500</updated>
                    <resolved>Sat, 27 Oct 2012 16:52:59 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29833" author="dnolen" created="Sat, 27 Oct 2012 16:52:59 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/d8f490e9b958a43e97b34808e76d977f29fee8c9&quot;&gt;http://github.com/clojure/clojurescript/commit/d8f490e9b958a43e97b34808e76d977f29fee8c9&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11625" name="CLJS-409-v1.patch" size="1733" author="bbloom" created="Sat, 27 Oct 2012 16:08:54 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-408] Include :form on fn :methods in AST</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-408</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;All core CLJS AST nodes include a :form key. Several quasi-nodes similarly include their originating code forms. Although :fn nodes include their :form, it varies between single and multiple arity functions. I&apos;ve found it easier to assume multiple arities and always analyze :methods directly. Unfortunately, the methods lack :form keys. This simple patch exposes the form of each method, simplifying function transformations.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15779">CLJS-408</key>
            <summary>Include :form on fn :methods in AST</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Wed, 24 Oct 2012 17:01:35 -0500</created>
                <updated>Sat, 27 Oct 2012 16:52:42 -0500</updated>
                    <resolved>Sat, 27 Oct 2012 16:52:42 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29832" author="dnolen" created="Sat, 27 Oct 2012 16:52:42 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3ea4a9309346a2a2d0983dc535b9b00531bfc90f&quot;&gt;http://github.com/clojure/clojurescript/commit/3ea4a9309346a2a2d0983dc535b9b00531bfc90f&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11610" name="CLJS-408-v1.patch" size="1564" author="bbloom" created="Wed, 24 Oct 2012 17:03:42 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-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-370] Incorrect behavior of integer? for integral floating point expressions</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-370</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;This includes infinity, exponential expressions, etc.&lt;/p&gt;

&lt;p&gt;See: &lt;a href=&quot;http://stackoverflow.com/questions/3885817/how-to-check-if-a-number-is-float-or-integer&quot;&gt;http://stackoverflow.com/questions/3885817/how-to-check-if-a-number-is-float-or-integer&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15671">CLJS-370</key>
            <summary>Incorrect behavior of integer? for integral floating point expressions</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 3 Sep 2012 15:28:18 -0500</created>
                <updated>Wed, 5 Sep 2012 11:40:48 -0500</updated>
                    <resolved>Wed, 5 Sep 2012 10:07:21 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="29349" author="dnolen" created="Mon, 3 Sep 2012 16:26:17 -0500"  >&lt;p&gt;changing the behavior of integer? outside of a more comprehensive numeric discussion is low priority. The current implementation is already suboptimal in its coercion of numbers to strings.&lt;/p&gt;</comment>
                    <comment id="29350" author="bbloom" created="Mon, 3 Sep 2012 17:31:31 -0500"  >&lt;p&gt;I&apos;m not changing the behavior of integer?, I&apos;m fixing it. Also, regarding the suboptimal nature of string coercion, the following benchmark seems to show this isn&apos;t an issue at all:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;Benchmarking with V8
[n 5], (old-integer? n), 1000000 runs, 0 msecs
[n 5.5], (old-integer? n), 1000000 runs, 0 msecs
[n 5.0E300], (old-integer? n), 1000000 runs, 0 msecs
[n &quot;&quot;], (old-integer? n), 1000000 runs, 0 msecs
[n 5], (integer? n), 1000000 runs, 0 msecs
[n 5.5], (integer? n), 1000000 runs, 0 msecs
[n 5.0E300], (integer? n), 1000000 runs, 0 msecs
[n &quot;&quot;], (integer? n), 1000000 runs, 0 msecs


Benchmarking with SpiderMonkey
[n 5], (old-integer? n), 1000000 runs, 0 msecs
[n 5.5], (old-integer? n), 1000000 runs, 0 msecs
[n 5.0E300], (old-integer? n), 1000000 runs, 0 msecs
[n &quot;&quot;], (old-integer? n), 1000000 runs, 0 msecs
[n 5], (integer? n), 1000000 runs, 0 msecs
[n 5.5], (integer? n), 1000000 runs, 0 msecs
[n 5.0E300], (integer? n), 1000000 runs, 0 msecs
[n &quot;&quot;], (integer? n), 1000000 runs, 0 msecs


Benchmarking with JavaScriptCore
[n 5], (old-integer? n), 1000000 runs, 0 msecs
[n 5.5], (old-integer? n), 1000000 runs, 0 msecs
[n 5.0E300], (old-integer? n), 1000000 runs, 0 msecs
[n &quot;&quot;], (old-integer? n), 1000000 runs, 0 msecs
[n 5], (integer? n), 1000000 runs, 0 msecs
[n 5.5], (integer? n), 1000000 runs, 0 msecs
[n 5.0E300], (integer? n), 1000000 runs, 0 msecs
[n &quot;&quot;], (integer? n), 1000000 runs, 0 msecs&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29357" author="dnolen" created="Tue, 4 Sep 2012 10:02:32 -0500"  >&lt;p&gt;Those benchmarks are not revealing anything. Advanced compilation is eliminating that code. Try with :simple or :whitespace.&lt;/p&gt;</comment>
                    <comment id="29373" author="bbloom" created="Tue, 4 Sep 2012 23:13:39 -0500"  >&lt;p&gt;&lt;b&gt;sigh&lt;/b&gt; I&apos;ve once again shown my profiling ineptitude. Here&apos;s results running with whitespace optimizations:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;Benchmarking with V8
[n 5], (old-integer? n), 1000000 runs, 924 msecs
[n 5.5], (old-integer? n), 1000000 runs, 1097 msecs
[n 5.0E300], (old-integer? n), 1000000 runs, 1009 msecs
[n &quot;&quot;], (old-integer? n), 1000000 runs, 77 msecs
[n 5], (integer? n), 1000000 runs, 210 msecs
[n 5.5], (integer? n), 1000000 runs, 556 msecs
[n 5.0E300], (integer? n), 1000000 runs, 731 msecs
[n &quot;&quot;], (integer? n), 1000000 runs, 78 msecs


Benchmarking with SpiderMonkey
[n 5], (old-integer? n), 1000000 runs, 236 msecs
[n 5.5], (old-integer? n), 1000000 runs, 362 msecs
[n 5.0E300], (old-integer? n), 1000000 runs, 2885 msecs
[n &quot;&quot;], (old-integer? n), 1000000 runs, 94 msecs
[n 5], (integer? n), 1000000 runs, 216 msecs
[n 5.5], (integer? n), 1000000 runs, 230 msecs
[n 5.0E300], (integer? n), 1000000 runs, 1360 msecs
[n &quot;&quot;], (integer? n), 1000000 runs, 98 msecs


Benchmarking with JavaScriptCore
[n 5], (old-integer? n), 1000000 runs, 471 msecs
[n 5.5], (old-integer? n), 1000000 runs, 467 msecs
[n 5.0E300], (old-integer? n), 1000000 runs, 771 msecs
[n &quot;&quot;], (old-integer? n), 1000000 runs, 212 msecs
[n 5], (integer? n), 1000000 runs, 882 msecs
[n 5.5], (integer? n), 1000000 runs, 756 msecs
[n 5.0E300], (integer? n), 1000000 runs, 851 msecs
[n &quot;&quot;], (integer? n), 1000000 runs, 213 msecs&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Seems like a win on V8 &amp;amp; SpiderMonkey, but a small loss on JavaScriptCore.&lt;/p&gt;</comment>
                    <comment id="29374" author="dnolen" created="Tue, 4 Sep 2012 23:40:29 -0500"  >&lt;p&gt;The slow down on JSC gives me pause. WebKit is ubiquitous in the mobile space. &lt;/p&gt;

&lt;p&gt;I&apos;m also not convinced we need to handle Infinity or NaN (though others may differ on that point). Perhaps we can in some debug mode intelligently detect and error out precisely where these kinds of mistakes may occur.&lt;/p&gt;</comment>
                    <comment id="29375" author="bbloom" created="Wed, 5 Sep 2012 01:19:27 -0500"  >&lt;p&gt;It seems like a bad precedent to favor micro-optimization over correctness when speed is easily obtainable through platform interop.&lt;/p&gt;

&lt;p&gt;Infinity, NaN, and floating point exponentiation expressions are not integers. I changed the function&apos;s behavior to match JVM Clojure&apos;s. We&apos;re going to need a reliable integer predicate if we want to implement ratios and other compound numeric types. &lt;/p&gt;

&lt;p&gt;If you need need a fast predicate for numbers, the number? predicate only checks type. It&apos;s behavior also matches JVM Clojure&apos;s: it accepts infinity, NaN, etc. If you need a fast integer test, but insist that edge cases like 5e300 are exceptional and ignorable, then you can micro-optimize by calling the necessary javascript primitives yourself.&lt;/p&gt;</comment>
                    <comment id="29378" author="dnolen" created="Wed, 5 Sep 2012 09:55:28 -0500"  >&lt;p&gt;On my machine your patch is slower across all JS engines w/ JSC faring the worst at nearly 2X. I do agree that the behavior is better. However moving forward this means that even simple functions like even? are 100X slower than their Clojure JVM counterparts. There&apos;s nothing &quot;micro-optimization&quot; about 2 orders of magnitude.&lt;/p&gt;</comment>
                    <comment id="29379" author="dnolen" created="Wed, 5 Sep 2012 10:06:12 -0500"  >&lt;p&gt;Oops after a lot more testing and playing around with your patch I turned out to be very wrong! It looks your patch + a boolean type hint is a win across the board on all engines, both in terms of performance and correctness.&lt;/p&gt;</comment>
                    <comment id="29380" author="dnolen" created="Wed, 5 Sep 2012 10:07:21 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/3c210d9430b30ffeac9600ae4851e1c347c2cced&quot;&gt;http://github.com/clojure/clojurescript/commit/3c210d9430b30ffeac9600ae4851e1c347c2cced&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29382" author="bbloom" created="Wed, 5 Sep 2012 11:40:48 -0500"  >&lt;p&gt;Heh. Performance is hard &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11474" name="CLJS-370-v1.patch" size="1708" author="bbloom" created="Mon, 3 Sep 2012 15:29:58 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-369] gensyms break re-analyze; prevents variable shadowing analysis</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-369</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;From my email discussion with dnolon before making this patch:&lt;/p&gt;

&lt;p&gt;The current analyzer does some trickery to prepare for emitting to JavaScript. Among this trickery is gensyms for locals (including &quot;this&quot;), the new $ prefix on some namespaces, uniqify on parameters, and more. This must be mildly annoying for people writing alternate compiler backends, but for the most part non-blocking because &lt;b&gt;fewer&lt;/b&gt; symbol collisions should never be an additional problem for a target language with different symbol resolution rules. &lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;snip lots more text&amp;#93;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Consider what an ANF transform would look like for the :let form:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(defmethod anf :let
  [{:keys [env bindings statements ret form] :as ast}]
  (let [bindings (mapcat (fn [{:keys [sym init] :as binding}]
                           [name (anf init)])
                         bindings)
        body-env (-&amp;gt; bindings last :env)]
    (ana/analyze env `(~(first form) [~@(map :form bindings)]
                          ~@(anf-block (assoc ast :env body-env))))))&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Simple enough, right? This walks each binding, ANF transforms the init expression, gets the environment in which to analyze the body, and then analyzes a new let (or loop) statement with the modified bindings.&lt;/p&gt;

&lt;p&gt;Unfortunately, this doesn&apos;t work. When the ana/analyze call happens, body-env contains gensymed locals. The result is that body-env is invalidated by the outer analyze call, which is re-generating the symbols for the local variables. If you take the gensyms out of analyze-let, then analyze becomes pure (modulo def forms) and this code magically becomes correct. I&apos;ve run into this same problem anywhere gensyms are used in analyze.&lt;/p&gt;



&lt;p&gt;Commit message on the patch:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;AST Changes
    
    * Anywhere a binding was introduced &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; a local used to be a symbol,
      now it is a map with a :name key and potentially a :shadow key.
    
    * Bindings vectors are no longer alternating symbols, then init maps.
      Instead, the are a vector of maps of the shape described &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; locals
      plus an :init key.
    
    * The :gthis key &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; functions has been replaced with :type, which
      is the symbol describing the type name of the enclosing deftype form.
    
    * recur frames now expose :params as binding maps, instead of :names
    
    Benefits:
    
    * Shadowed variables are now visible to downstream AST transforms.
    
    * :tag, :mutable, and other metadata are now uniform across ops
    
    * Eliminates usages of gensym inside the analyzer, which was a source
      of state that made the analyzer impossible to use &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; some
      transformations of let, letfn, etc which require re-analyzing forms.
    
    * Removes JavaScript shadowing semantics from the analyze phase.&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15664">CLJS-369</key>
            <summary>gensyms break re-analyze; prevents variable shadowing analysis</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Sat, 1 Sep 2012 19:14:31 -0500</created>
                <updated>Wed, 17 Oct 2012 10:53:50 -0500</updated>
                    <resolved>Mon, 15 Oct 2012 23:02:04 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29339" author="dnolen" created="Mon, 3 Sep 2012 13:13:19 -0500"  >&lt;p&gt;Can we please get the ticket number in the first line of the patch? If you look at the ClojureScript commit history you can see the convention that&apos;s been adopted. Thanks!&lt;/p&gt;</comment>
                    <comment id="29340" author="bbloom" created="Mon, 3 Sep 2012 14:02:11 -0500"  >&lt;p&gt;Reworded commit message to meet new convention.&lt;/p&gt;</comment>
                    <comment id="29563" author="dnolen" created="Fri, 28 Sep 2012 17:55:25 -0500"  >&lt;p&gt;Can we put the shadow patch in another ticket with the patch referencing the new ticket #. Thanks!&lt;/p&gt;</comment>
                    <comment id="29564" author="bbloom" created="Fri, 28 Sep 2012 18:11:14 -0500"  >&lt;p&gt;Not sure what good a separate ticket would do. How about this new title?&lt;/p&gt;</comment>
                    <comment id="29573" author="dnolen" created="Sat, 29 Sep 2012 12:39:59 -0500"  >&lt;p&gt;They are separate patches. One is a enhancement to the compiler. The other one is an enhancement to my simplistic shadowing solution using the improvements to the compiler in the other enhancement. Thanks!&lt;/p&gt;</comment>
                    <comment id="29582" author="bbloom" created="Sun, 30 Sep 2012 12:34:53 -0500"  >&lt;p&gt;Are you talking about the namespace shadowing? This patch affects &lt;b&gt;all variable shadowing&lt;/b&gt;. For example, (fn &lt;span class=&quot;error&quot;&gt;&amp;#91;x x&amp;#93;&lt;/span&gt; x) will produce `function (x x__$1) { return x__$1; }` instead of `function (x_&lt;em&gt;G12 x&lt;/em&gt;_G13) { return x__G13; }` or something like that.&lt;/p&gt;

&lt;p&gt;I&apos;m not sure how I can break this patch down into smaller pieces. All of the gensyms were there before to eliminate potential shadowing; the two issues are tightly related. If you eliminated all the gensyms, the compiler would work fine... unless you shadowed a variable (which several tests cover).&lt;/p&gt;

&lt;p&gt;Have you studied the patch? Can you suggest a concrete way to break it up into smaller patches? I&apos;m not sure it&apos;s worth the trouble.&lt;/p&gt;</comment>
                    <comment id="29589" author="dnolen" created="Wed, 3 Oct 2012 10:59:38 -0500"  >&lt;p&gt;Right sorry, makes sense now. I will review both patches more closely. Thanks again.&lt;/p&gt;</comment>
                    <comment id="29654" author="dnolen" created="Mon, 15 Oct 2012 22:43:24 -0500"  >&lt;p&gt;I&apos;ve finally found some time go through this patch. It&apos;s great but it no longer applies to master. If I get an updated patch I&apos;;; apply promptly. Thank you very much and sorry for the delay.&lt;/p&gt;</comment>
                    <comment id="29656" author="dnolen" created="Mon, 15 Oct 2012 23:01:50 -0500"  >&lt;p&gt;Went ahead and applied it, only needed a minor change. &lt;/p&gt;</comment>
                    <comment id="29657" author="dnolen" created="Mon, 15 Oct 2012 23:02:04 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/19afb31a52504293ba2182c584b1867917316662&quot;&gt;http://github.com/clojure/clojurescript/commit/19afb31a52504293ba2182c584b1867917316662&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29660" author="bbloom" created="Mon, 15 Oct 2012 23:45:14 -0500"  >&lt;p&gt;Awesome. Glad to see this applied.&lt;/p&gt;

&lt;p&gt;Off topic: I like to keep tabs on my open source contributions semi-automatically using the author information stored in git. Sadly, your minor change switched the author to you. If it&apos;s not too much to ask, could you please preserve the author info in the future? Either via a separate fixup commit, or by using the --author flag when editing commits. Thanks!&lt;/p&gt;</comment>
                    <comment id="29669" author="dnolen" created="Wed, 17 Oct 2012 10:53:50 -0500"  >&lt;p&gt;Brandon, yep of course! I didn&apos;t know about the --author flag otherwise I would have used it. Thanks again.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11471" name="CLJS-369-v2.patch" size="19887" author="bbloom" created="Mon, 3 Sep 2012 14:02:11 -0500" />
                    <attachment id="11469" name="shadowing.patch" size="19861" author="bbloom" created="Sat, 1 Sep 2012 19:40:09 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-360] Analyzer incorrectly merges metadata when redefining vars</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-360</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I&apos;m experimenting with using the analyzer for some more sophisticated macros, including a CPS transform and control constructs. During interactive development, I discovered that the analyzer is incorrectly merging metadata on vars when redefining them. This patch changes redef&apos;s to replace, rather than merge, existing var metadata.&lt;/p&gt;


&lt;p&gt;The patch does not include a test, since the tests don&apos;t currently muck with the analyzer directly. Here&apos;s some code you can play with in your repl:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(require &apos;[cljs.analyzer :as ana])
(require &apos;[cljs.compiler :as comp])

(def env (ana/empty-env))

(defn show-foo [form]
  (ana/analyze env form)
  (-&amp;gt; @ana/namespaces (get &apos;cljs.user) :defs (get &apos;x) :foo))

(show-foo &apos;(def ^{:foo 1} x 1))

(show-foo &apos;(def ^{:foo 2} x 1))

(show-foo &apos;(def x 1))  ; before patch, &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; returns 2. After patch, nil.&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15646">CLJS-360</key>
            <summary>Analyzer incorrectly merges metadata when redefining vars</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Sun, 26 Aug 2012 18:22:15 -0500</created>
                <updated>Fri, 31 Aug 2012 11:29:48 -0500</updated>
                    <resolved>Fri, 31 Aug 2012 11:29:48 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29269" author="bbloom" created="Sun, 26 Aug 2012 18:27:39 -0500"  >&lt;p&gt;Also, the patch makes the behavior match JVM Clojure:&lt;/p&gt;

&lt;p&gt;user=&amp;gt; (def ^:foo x)&lt;br/&gt;
#&apos;user/x&lt;br/&gt;
user=&amp;gt; (:foo (meta #&apos;x))&lt;br/&gt;
true&lt;br/&gt;
user=&amp;gt; (def x)&lt;br/&gt;
#&apos;user/x&lt;br/&gt;
user=&amp;gt; (:foo (meta #&apos;x))&lt;br/&gt;
nil&lt;/p&gt;</comment>
                    <comment id="29323" author="dnolen" created="Fri, 31 Aug 2012 09:29:14 -0500"  >&lt;p&gt;Can we get a patch without whitespace changes? Thanks!&lt;/p&gt;</comment>
                    <comment id="29331" author="bbloom" created="Fri, 31 Aug 2012 11:22:41 -0500"  >&lt;p&gt;Updated patch: no longer changes indent/whitespace and resolves conflict with change that happened to master since original patch.&lt;/p&gt;</comment>
                    <comment id="29332" author="dnolen" created="Fri, 31 Aug 2012 11:29:48 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/8355d1eacff667b77551bb60699d5c85b2f15298&quot;&gt;http://github.com/clojure/clojurescript/commit/8355d1eacff667b77551bb60699d5c85b2f15298&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11464" name="redef-meta-2.patch" size="1698" author="bbloom" created="Fri, 31 Aug 2012 11:22:41 -0500" />
                    <attachment id="11455" name="redef-meta.patch" size="3351" author="bbloom" created="Sun, 26 Aug 2012 18:22:15 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

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

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

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

&lt;p&gt;What weird error are you getting? Works for me :-P&lt;/p&gt;</comment>
                    <comment id="28902" author="bbloom" created="Sun, 24 Jun 2012 22:33:08 -0500"  >&lt;p&gt;Updating 2nd benchmark in description to include the EMPTY optimization&lt;/p&gt;</comment>
                    <comment id="28903" author="dnolen" created="Mon, 25 Jun 2012 06:33:47 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/c60df78e2fd318109a9338a87277c11565b506ae&quot;&gt;http://github.com/clojure/clojurescript/commit/c60df78e2fd318109a9338a87277c11565b506ae&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11345" name="making-sets.patch" size="4523" author="bbloom" created="Sun, 24 Jun 2012 20:47:21 -0500" />
                    <attachment id="11346" name="making-sets-squashed.patch" size="3826" author="bbloom" created="Sun, 24 Jun 2012 22:24:08 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-321] Support with-out-str</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-321</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Attached patch implements with-out-str macro in terms of goog.string.StringBuffer and &lt;b&gt;print-fn&lt;/b&gt; via .append&lt;/p&gt;

&lt;p&gt;The attached patch also fixes &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-319&quot; title=&quot;missing spaces when printing the same thing more than once&quot;&gt;&lt;del&gt;CLJS-319&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15544">CLJS-321</key>
            <summary>Support with-out-str</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="ohpauleez">Paul deGrandis</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 18 Jun 2012 03:15:53 -0500</created>
                <updated>Mon, 22 Oct 2012 18:06:13 -0500</updated>
                    <resolved>Mon, 22 Oct 2012 18:06:13 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28857" author="dnolen" created="Mon, 18 Jun 2012 08:44:33 -0500"  >&lt;p&gt;Patch looks mostly OK. Did you do any basic benchmarking? It would be nice to know that this doesn&apos;t slow down printing of Clojure objects.&lt;/p&gt;</comment>
                    <comment id="28869" author="bbloom" created="Mon, 18 Jun 2012 17:03:49 -0500"  >&lt;p&gt;Yes, I ran this:&lt;/p&gt;

&lt;p&gt;(time (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;i 5000&amp;#93;&lt;/span&gt; (prn-str {:foo &lt;span class=&quot;error&quot;&gt;&amp;#91;1 &amp;quot;two&amp;quot; &amp;#39;three&amp;#93;&lt;/span&gt;}))&lt;/p&gt;

&lt;p&gt;before patch: 29988 msecs&lt;br/&gt;
after patch:  28751 msecs&lt;/p&gt;

&lt;p&gt;Effectively identical.&lt;/p&gt;</comment>
                    <comment id="28873" author="dnolen" created="Mon, 18 Jun 2012 20:56:29 -0500"  >&lt;p&gt;on V8? JSC? SM?&lt;/p&gt;</comment>
                    <comment id="28877" author="bbloom" created="Tue, 19 Jun 2012 00:35:25 -0500"  >&lt;p&gt;I had run it in a browser repl, but I forget which. I added a benchmark and re-ran it in all three. It was a tiny bit slower, so I went to investigate and discovered that I haven&apos;t the slightest clue how to predict or interpret Javascript engine performance numbers. Hell, Chrome&apos;s console seems to have completely random performance, where as the Node.js repl seems to be more consistent. I&apos;ll get my shit together and see if I can fix this up. Hopefully will have time to look at it tomorrow.&lt;/p&gt;</comment>
                    <comment id="28878" author="laczoka" created="Tue, 19 Jun 2012 03:54:22 -0500"  >&lt;p&gt;jsperf.com was a great help to me when prototyping PersistentVector&apos;s first CLJS implementation&lt;/p&gt;

&lt;p&gt;it&apos;s very-very handy and easy to use and keep updated if necessary&lt;/p&gt;

&lt;p&gt;e.g.&lt;br/&gt;
&lt;a href=&quot;http://jsperf.com/persistentvector-norecur-js/12&quot;&gt;http://jsperf.com/persistentvector-norecur-js/12&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29296" author="dnolen" created="Wed, 29 Aug 2012 20:42:40 -0500"  >&lt;p&gt;Thanks Brandon, let&apos;s hold off on this one until we can resolve &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-340&quot; title=&quot;improve pr-str performance&quot;&gt;&lt;del&gt;CLJS-340&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="29761" author="ohpauleez" created="Mon, 22 Oct 2012 16:57:35 -0500"  >&lt;p&gt;I attached an updated patch (that I&apos;m using internally for a personal project) of just the with-out-str macro code.&lt;/p&gt;</comment>
                    <comment id="29762" author="dnolen" created="Mon, 22 Oct 2012 17:00:27 -0500"  >&lt;p&gt;Thanks Paul. Could we get a patch with tests included?&lt;/p&gt;</comment>
                    <comment id="29763" author="ohpauleez" created="Mon, 22 Oct 2012 17:02:02 -0500"  >&lt;p&gt;No problem - on it right now.&lt;/p&gt;</comment>
                    <comment id="29764" author="ohpauleez" created="Mon, 22 Oct 2012 17:18:44 -0500"  >&lt;p&gt;Updated with one additional piece I needed to bring over from my branch (:dynamic on &lt;b&gt;print-fn&lt;/b&gt;) and two tests: one using print and one using the raw &lt;b&gt;print-fn&lt;/b&gt;.&lt;/p&gt;</comment>
                    <comment id="29765" author="dnolen" created="Mon, 22 Oct 2012 18:06:13 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/eab6032e6ba22571e5c4f821707bf5de8075e757&quot;&gt;http://github.com/clojure/clojurescript/commit/eab6032e6ba22571e5c4f821707bf5de8075e757&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11601" name="cljs-321-with-out-str.diff" size="2571" author="ohpauleez" created="Mon, 22 Oct 2012 17:17:33 -0500" />
                    <attachment id="11600" name="cljs-321-with-out-str.diff" size="942" author="ohpauleez" created="Mon, 22 Oct 2012 16:55:57 -0500" />
                    <attachment id="11333" name="with-out-str.patch" size="5552" author="bbloom" created="Mon, 18 Jun 2012 03:15:53 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-320] memfn not supported</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-320</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The docs say &quot;it almost always preferable to do this directly now&quot;, but this was one more thing that slowed down the porting of a small piece of JVM Clojure code for me. I&apos;m of the opinion that parity with Clojure proper is desirable where it doesn&apos;t hurt platform interop or performance.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15543">CLJS-320</key>
            <summary>memfn not supported</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 18 Jun 2012 01:49:07 -0500</created>
                <updated>Mon, 18 Jun 2012 21:01:52 -0500</updated>
                    <resolved>Mon, 18 Jun 2012 21:01:52 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28858" author="dnolen" created="Mon, 18 Jun 2012 08:53:21 -0500"  >&lt;p&gt;Can we get a simple test with this patch?&lt;/p&gt;</comment>
                    <comment id="28868" author="bbloom" created="Mon, 18 Jun 2012 16:55:06 -0500"  >&lt;p&gt;Updated patch with tests&lt;/p&gt;</comment>
                    <comment id="28875" author="dnolen" created="Mon, 18 Jun 2012 21:01:52 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/8965df74d424ed41beb3990a55d775d2d851aacd&quot;&gt;http://github.com/clojure/clojurescript/commit/8965df74d424ed41beb3990a55d775d2d851aacd&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11332" name="memfn.patch" size="615" author="bbloom" created="Mon, 18 Jun 2012 01:49:07 -0500" />
                    <attachment id="11338" name="memfn-with-tests.patch" size="1494" author="bbloom" created="Mon, 18 Jun 2012 16:55:06 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-319] missing spaces when printing the same thing more than once</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-319</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;E.g. (println 1 1) prints &quot;11\n&quot; instead of &quot;1 1\n&quot;.&lt;/p&gt;

&lt;p&gt;Here&apos;s the culprit:&lt;br/&gt;
&lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L6136-6137&quot;&gt;https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L6136-6137&lt;/a&gt;&lt;/p&gt;</description>
                <environment>9ad79e1c</environment>
            <key id="15542">CLJS-319</key>
            <summary>missing spaces when printing the same thing more than once</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="tomoj">Tom Jack</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 18 Jun 2012 01:20:51 -0500</created>
                <updated>Thu, 5 Jul 2012 15:06:57 -0500</updated>
                    <resolved>Thu, 5 Jul 2012 15:06:57 -0500</resolved>
                                                                    <due></due>
                    <votes>1</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28855" author="bbloom" created="Mon, 18 Jun 2012 02:14:02 -0500"  >&lt;p&gt;Both pr-with-opts and pr-sb are affected. See:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L6107&quot;&gt;https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L6107&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28856" author="bbloom" created="Mon, 18 Jun 2012 03:16:07 -0500"  >&lt;p&gt;Patch here: &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-321&quot; title=&quot;Support with-out-str&quot;&gt;&lt;del&gt;CLJS-321&lt;/del&gt;&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28888" author="bbloom" created="Thu, 21 Jun 2012 18:19:32 -0500"  >&lt;p&gt;Attaching a simple patch for this bug instead of fixing it along side with-out-str&lt;/p&gt;</comment>
                    <comment id="28955" author="dnolen" created="Thu, 5 Jul 2012 15:06:57 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/280ea95938883f97be82267d109342178a2e47aa&quot;&gt;http://github.com/clojure/clojurescript/commit/280ea95938883f97be82267d109342178a2e47aa&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11341" name="cljs-319.patch" size="2283" author="bbloom" created="Thu, 21 Jun 2012 18:19:32 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-304] Comparing a js/Date to nil throws</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-304</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;(= (js/Date.) nil)&lt;/p&gt;</description>
                <environment></environment>
            <key id="15515">CLJS-304</key>
            <summary>Comparing a js/Date to nil throws</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Tue, 5 Jun 2012 21:28:33 -0500</created>
                <updated>Mon, 18 Jun 2012 20:59:50 -0500</updated>
                    <resolved>Mon, 18 Jun 2012 20:59:50 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28728" author="bbloom" created="Tue, 5 Jun 2012 22:27:40 -0500"  >&lt;p&gt;D&apos;oh! Sorry, this patch causes a warning:&lt;/p&gt;

&lt;p&gt;WARNING: Use of undeclared Var cljs.core/instance? at line 384 &lt;/p&gt;</comment>
                    <comment id="28839" author="dnolen" created="Sun, 17 Jun 2012 12:06:56 -0500"  >&lt;p&gt;updated patch please.&lt;/p&gt;</comment>
                    <comment id="28849" author="bbloom" created="Sun, 17 Jun 2012 16:28:40 -0500"  >&lt;p&gt;Sorry, forgot about this ticket. Attached patch has two additional commits: 1st stops calling .getTime with list/EMPTY via unecessary &apos;() and the 2nd moves instance? from the &quot;preds&quot; to &quot;fundamentals&quot; section of core.cljs.&lt;/p&gt;</comment>
                    <comment id="28859" author="dnolen" created="Mon, 18 Jun 2012 09:01:57 -0500"  >&lt;p&gt;Thanks can we collapse the patch into one commit?&lt;/p&gt;</comment>
                    <comment id="28867" author="bbloom" created="Mon, 18 Jun 2012 16:45:07 -0500"  >&lt;p&gt;Same as patch 2 with commits squashed&lt;/p&gt;</comment>
                    <comment id="28874" author="dnolen" created="Mon, 18 Jun 2012 20:59:50 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/80726438d7375eb72cd4ea82a7ea676d3237b6ce&quot;&gt;http://github.com/clojure/clojurescript/commit/80726438d7375eb72cd4ea82a7ea676d3237b6ce&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11329" name="date-equiv2.patch" size="2820" author="bbloom" created="Sun, 17 Jun 2012 16:28:40 -0500" />
                    <attachment id="11337" name="date-equiv3.patch" size="2137" author="bbloom" created="Mon, 18 Jun 2012 16:45:07 -0500" />
                    <attachment id="11295" name="date-equiv.patch" size="731" author="bbloom" created="Tue, 5 Jun 2012 21:28:33 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-301] Inline instance?</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-301</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;See discussion on &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-300&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-300&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a low priority patch for inlining instanceof checks. I don&apos;t know if it has any significant performance improvement, but the patch was sort of a side effect of my work on &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-300&quot; title=&quot;RegExp objects print incorrectly&quot;&gt;&lt;del&gt;CLJS-300&lt;/del&gt;&lt;/a&gt;, so I figured I&apos;d bundle it up and share it here in case someone wants to test it&apos;s perf impact and apply if it is a win.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15512">CLJS-301</key>
            <summary>Inline instance?</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Tue, 5 Jun 2012 00:58:11 -0500</created>
                <updated>Sat, 22 Dec 2012 16:33:35 -0600</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="30299" author="dnolen" created="Sat, 22 Dec 2012 15:29:01 -0600"  >&lt;p&gt;This will probably result in a minor performance boost, but it is nice to get another jsSTAR out of core.cljs. If you update the patch to work on master, I will apply it.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11775" name="CLJS-301-v002.patch" size="2180" author="bbloom" created="Sat, 22 Dec 2012 16:33:35 -0600" />
                    <attachment id="11293" name="inline-instanceof.patch" size="2704" author="bbloom" created="Tue, 5 Jun 2012 00:58:11 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

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

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

&lt;p&gt;Unfortunately, this is blocked by the same GClosure issue as &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-68&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-68&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15511">CLJS-300</key>
            <summary>RegExp objects print incorrectly</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch</label>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 4 Jun 2012 15:43:37 -0500</created>
                <updated>Mon, 4 Jun 2012 23:52:42 -0500</updated>
                    <resolved>Mon, 4 Jun 2012 23:52:42 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28711" author="dnolen" created="Mon, 4 Jun 2012 15:58:24 -0500"  >&lt;p&gt;The simplest solution is to add a RegExp case to pr-seq.&lt;/p&gt;</comment>
                    <comment id="28712" author="bbloom" created="Mon, 4 Jun 2012 18:09:44 -0500"  >&lt;p&gt;That was surprisingly not that simple...&lt;/p&gt;

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

&lt;p&gt;Attached patch fixes printing of RegExp objects and also enables calling (instance? js/RegExp X) without triggering the warning. Sadly, any more complex expression which evaluates to js/RegExp, or any higher order usage of instance? against that type will still trigger the warning.&lt;/p&gt;</comment>
                    <comment id="28713" author="bbloom" created="Mon, 4 Jun 2012 19:15:32 -0500"  >&lt;p&gt;As discussed, will make a separate ticket for inlining &apos;instance? and will (defn regexp? &lt;span class=&quot;error&quot;&gt;&amp;#91;o&amp;#93;&lt;/span&gt; (js* &quot;~{o} instanceof RegExp&quot;))&lt;/p&gt;</comment>
                    <comment id="28715" author="bbloom" created="Mon, 4 Jun 2012 20:46:21 -0500"  >&lt;p&gt;Updated with simplified patch&lt;/p&gt;</comment>
                    <comment id="28716" author="dnolen" created="Mon, 4 Jun 2012 23:52:42 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/63cd8ce9c7c9a8864deb676f2b855b8018698d57&quot;&gt;http://github.com/clojure/clojurescript/commit/63cd8ce9c7c9a8864deb676f2b855b8018698d57&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11292" name="print-regexp2.patch" size="1955" author="bbloom" created="Mon, 4 Jun 2012 20:42:37 -0500" />
                    <attachment id="11291" name="print-regex.patch" size="3663" author="bbloom" created="Mon, 4 Jun 2012 18:10:01 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-297] Eliminate :meta, :vector, :set, and :map ops</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-297</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The attached patch eliminates the :meta, :set, :vector, and :map ops.&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&lt;p&gt;I read Raphael&apos;s notes and he and I have a email thread going on too. With that in mind, this is a step towards untangling the architectural layers of the compiler. By better segregating parse from emit, it will be easier to break the analyzer out from the code generation backend.&lt;/p&gt;</comment>
                    <comment id="28700" author="dnolen" created="Sun, 3 Jun 2012 17:12:28 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/a9d1dc6a043e8a6367492a2cf8622f73f2a947f9&quot;&gt;http://github.com/clojure/clojurescript/commit/a9d1dc6a043e8a6367492a2cf8622f73f2a947f9&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11285" name="emit-munge.patch" size="24104" author="bbloom" created="Sat, 2 Jun 2012 18:20:49 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-289] Represent ast :children as a vector of keys</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-289</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;See discussion here: &lt;a href=&quot;https://groups.google.com/d/topic/clojure-dev/vZLVKmKX0oc/discussion&quot;&gt;https://groups.google.com/d/topic/clojure-dev/vZLVKmKX0oc/discussion&lt;/a&gt;&lt;/p&gt;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<item>
            <title>[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>[CLJS-215] js-obj function broken</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-215</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The js-obj macro is fine, but the js-obj function was incorrectly using &quot;{foo: bar}&quot; expecting &quot;foo&quot; to be evaluated as a variable, instead of as a string key.&lt;/p&gt;

&lt;p&gt;Since we have the js-obj macro for speed, I just deleted the broken overloads, so now all the non-zero arity cases simply call gobject&lt;/p&gt;</description>
                <environment></environment>
            <key id="15378">CLJS-215</key>
            <summary>js-obj function broken</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Sun, 29 Apr 2012 16:49:02 -0500</created>
                <updated>Sun, 29 Apr 2012 17:08:26 -0500</updated>
                    <resolved>Sun, 29 Apr 2012 17:08:26 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28319" author="dnolen" created="Sun, 29 Apr 2012 17:08:26 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/f4a3ef43dc70aed4f15045836d709989a95ef6f7&quot;&gt;https://github.com/clojure/clojurescript/commit/f4a3ef43dc70aed4f15045836d709989a95ef6f7&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11129" name="js-obj-fn.patch" size="1477" author="bbloom" created="Sun, 29 Apr 2012 16:49:02 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <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-211] apply does not work on IFn objects in CLJS</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-211</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-135&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-135&lt;/a&gt; fixed this for multimethods, but the same issue applies to anyone who implements IFn.&lt;/p&gt;

&lt;p&gt;The attached patch fixes this by modifying extend-type to emit an apply method on the extended object&apos;s prototype.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15373">CLJS-211</key>
            <summary>apply does not work on IFn objects in CLJS</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Fri, 27 Apr 2012 23:01:14 -0500</created>
                <updated>Sat, 28 Apr 2012 12:50:06 -0500</updated>
                    <resolved>Sat, 28 Apr 2012 12:50:06 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28299" author="bbloom" created="Sat, 28 Apr 2012 02:31:39 -0500"  >&lt;p&gt;Updated with patch!&lt;/p&gt;

&lt;p&gt;Worth noting: String has an implementation of IFn and manually defines prototype.apply. I contemplated deleting it, since this makes it unnecessary, however, my general purpose implementation is probably a tad slower. Maybe, maybe not. Depends on how Google&apos;s inlining does. I figured: make it work, then make it fast. So I didn&apos;t bother profiling them and left the existing implementation there.&lt;/p&gt;</comment>
                    <comment id="28300" author="dnolen" created="Sat, 28 Apr 2012 12:50:06 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/ddd8199b324997cfe0537be66372162b41ce8293&quot;&gt;https://github.com/clojure/clojurescript/commit/ddd8199b324997cfe0537be66372162b41ce8293&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11119" name="apply1.patch" size="6024" author="bbloom" created="Sat, 28 Apr 2012 02:31:39 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-210] Implement Var form, var-get, and var? in CLJS</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-210</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;See discussion of Vars in CLJS here: &lt;a href=&quot;http://dev.clojure.org/display/design/Dynamic+Binding&quot;&gt;http://dev.clojure.org/display/design/Dynamic+Binding&lt;/a&gt;&lt;br/&gt;
My goal is to eventually implement dynamic scope capture, via bound-fn and friends. The attached patch is a step in that direction.&lt;/p&gt;

&lt;p&gt;This patch adds support for parsing the (var foo) form. The #&apos; reader macro is provided by JVM Clojure.&lt;/p&gt;

&lt;p&gt;#&apos;foo emits code to construct a Var object. In this patch, each invocation of &apos;var will create a unique Var object. This means they are &apos;= by fully qualified symbol, but not &apos;identical?. Simple memoization would fix that, but I&apos;m not going to bother until I get to Dynamic Var objects.&lt;/p&gt;

&lt;p&gt;The main advantage of this level of Var support is for the interactive development convenience of being able to defer dereferencing top-levels. For example, (def fog (comp f #&apos;g)) will pick up redefinitions of &apos;g, but not of &apos;f.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15372">CLJS-210</key>
            <summary>Implement Var form, var-get, and var? in CLJS</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Fri, 27 Apr 2012 22:51:28 -0500</created>
                <updated>Sun, 28 Oct 2012 21:03:58 -0500</updated>
                                                                            <due></due>
                    <votes>0</votes>
                        <watches>2</watches>
                        <comments>
                    <comment id="28306" author="bbloom" created="Sat, 28 Apr 2012 22:07:59 -0500"  >&lt;p&gt;I found two issues with this patch:&lt;/p&gt;

&lt;p&gt;1) I never used the IVar that I declared :-P&lt;/p&gt;

&lt;p&gt;2) (apply #&apos;+ (range 100)) throws &quot;Invalid arity: 101&quot; &amp;#8211; this is related to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-211&quot;&gt;http://dev.clojure.org/jira/browse/CLJS-211&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I&apos;ll look into fixing both. However, we should discuss supporting variable arity protocol methods...&lt;/p&gt;</comment>
                    <comment id="28843" author="dnolen" created="Sun, 17 Jun 2012 12:17:02 -0500"  >&lt;p&gt;any support for reified vars is a low priority for the foreseeable future.&lt;/p&gt;</comment>
                    <comment id="29336" author="bbloom" created="Sat, 1 Sep 2012 19:46:14 -0500"  >&lt;p&gt;Reified vars (and binding frames!) are a requirement for a CPS transform to be correct with respect to dynamic bindings.&lt;/p&gt;</comment>
                    <comment id="29419" author="tomoj" created="Mon, 10 Sep 2012 17:11:30 -0500"  >&lt;p&gt;+1 towards bound-fn and friends. I had an explanation written here but now I see &quot;async Javascript (ie. nearly all Javascript) makes the binding macro effectively useless without bound-fn&quot;. Indeed.&lt;/p&gt;</comment>
                    <comment id="29850" author="bendlas" created="Sun, 28 Oct 2012 19:34:02 -0500"  >&lt;p&gt;bound-fn could also be implemented by setting / resetting bound vars before / after the wrapped fn, similar to binding. We would just need to add tracking of the currently rebound dynamic vars.&lt;br/&gt;
That should also be CPS - friendly, no?&lt;/p&gt;</comment>
                    <comment id="29858" author="tomoj" created="Sun, 28 Oct 2012 21:03:58 -0500"  >&lt;p&gt;I&apos;ve considered that and would love to see it happen.&lt;/p&gt;

&lt;p&gt;But what about:&lt;/p&gt;

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;(def ^:dynamic *foo* 3)
(set! *foo* 4)
(def f (bound-fn [] *foo*))
(set! *foo* 5)
(f)&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11118" name="vars1.patch" size="6275" author="bbloom" created="Fri, 27 Apr 2012 22:51:28 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-177] js-&gt;clj should convert JavaScript null to Clojure nil</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-177</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;Prior to commit ebf45f5 &lt;span class=&quot;error&quot;&gt;&amp;#91;A&amp;#93;&lt;/span&gt;, js-&amp;gt;clj converted JavaScript null to Clojure nil without any errors.&lt;/p&gt;

&lt;p&gt;As of commit ebf45f5 (related to &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-175&quot; title=&quot;js-&amp;gt;clj loops infinitely on some native objects&quot;&gt;&lt;del&gt;CLJS-175&lt;/del&gt;&lt;/a&gt;), js-&amp;gt;clj throws a TypeError when it encounters JavaScript null:&lt;/p&gt;

&lt;p&gt;    TypeError: Cannot read property &apos;constructor&apos; of null&lt;br/&gt;
    b===c}function q(b,c){return gb.call(e,b,c)}function pb(b){return b.construct&lt;br/&gt;
                                                                    ^&lt;br/&gt;
    TypeError: Cannot read property &apos;constructor&apos; of null&lt;/p&gt;

&lt;p&gt;The attached patch &lt;span class=&quot;error&quot;&gt;&amp;#91;B&amp;#93;&lt;/span&gt; adds a test to demonstrate the issue and provides a suggested fix.&lt;/p&gt;

&lt;p&gt;Note: &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-175&quot; title=&quot;js-&amp;gt;clj loops infinitely on some native objects&quot;&gt;&lt;del&gt;CLJS-175&lt;/del&gt;&lt;/a&gt; intentionally limited the types of objects it would attempt to convert to Clojure code. For example, &lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJS-175&quot; title=&quot;js-&amp;gt;clj loops infinitely on some native objects&quot;&gt;&lt;del&gt;CLJS-175&lt;/del&gt;&lt;/a&gt; notes that conversion &quot;doesn&apos;t make sense for something like Date or RegExp.&quot; I agree for those types of objects, but &quot;null&quot; seems straightforward enough that it should be converted.&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;error&quot;&gt;&amp;#91;A&amp;#93;&lt;/span&gt; &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/ebf45f5&quot;&gt;https://github.com/clojure/clojurescript/commit/ebf45f5&lt;/a&gt;&lt;br/&gt;
&lt;span class=&quot;error&quot;&gt;&amp;#91;B&amp;#93;&lt;/span&gt; Also viewable here: &lt;a href=&quot;https://github.com/jasonrudolph/clojurescript/compare/master...js-null-to-clj-nil&quot;&gt;https://github.com/jasonrudolph/clojurescript/compare/master...js-null-to-clj-nil&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15325">CLJS-177</key>
            <summary>js-&gt;clj should convert JavaScript null to Clojure nil</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="jasonrudolph">Jason Rudolph</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Tue, 10 Apr 2012 18:43:51 -0500</created>
                <updated>Tue, 10 Apr 2012 19:38:02 -0500</updated>
                    <resolved>Tue, 10 Apr 2012 19:38:01 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28099" author="dnolen" created="Tue, 10 Apr 2012 19:38:02 -0500"  >&lt;p&gt;Fixed, &lt;a href=&quot;http://github.com/clojure/clojurescript/commit/9319579acfc4fc9dbcf6e79f611afad707f97579&quot;&gt;http://github.com/clojure/clojurescript/commit/9319579acfc4fc9dbcf6e79f611afad707f97579&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11034" name="js-null-to-clj-nil.diff" size="2959" author="jasonrudolph" created="Tue, 10 Apr 2012 18:43: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="10002">Code and Test</customfieldvalue>

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

<item>
            <title>[CLJS-176] Track line &amp; column in generated JS (needed for SourceMaps)</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-176</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;The attached patch modifies the ClojureScript compiler by replacing all calls to print, println, emits, etc, such that all code generation funnels through the new emitx and emitln. The emitx and emitln functions track &lt;b&gt;position&lt;/b&gt; as a 2-tuple vector of &lt;span class=&quot;error&quot;&gt;&amp;#91;line, column&amp;#93;&lt;/span&gt;, zero-based. The line and column information is a prerequisite for generating correct source maps. NOTE: This is the position in the &lt;b&gt;generated JavaScript source&lt;/b&gt;, not the :line and :column metadata from the Clojure reader.&lt;/p&gt;

&lt;p&gt;In the emitln function, there are a few commented out lines which constitute a &quot;test&quot;. Basically, it causes the compiler to append a line number // comment on each line of the generated source. The comments are horizontally aligned at 120 characters, so you can quickly visually inspect for alignment bugs. Unfortunately, I&apos;m not really sure how better to test this, or to ensure that this keeps working until the rest of SourceMaps gets implemented &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; In theory, as long as no one prints anything directly, always using emitx and emitln, nothing should break.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15320">CLJS-176</key>
            <summary>Track line &amp; column in generated JS (needed for SourceMaps)</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 9 Apr 2012 02:16:09 -0500</created>
                <updated>Tue, 17 Apr 2012 12:57:22 -0500</updated>
                    <resolved>Sun, 15 Apr 2012 14:12:41 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28103" author="bbloom" created="Thu, 12 Apr 2012 00:03:14 -0500"  >&lt;p&gt;This patch is now out of date. I&apos;d be happy to update it, but the compiler moves fast enough that I&apos;ll wait for general feedback. I don&apos;t want to have to constantly re-update this patch.&lt;/p&gt;</comment>
                    <comment id="28106" author="dnolen" created="Thu, 12 Apr 2012 11:03:47 -0500"  >&lt;p&gt;emitx is a little too ambiguous for my tastes. What about emit-ln and emit-str? Other options? Once we decide on names I&apos;d be happy to merge this in quickly.&lt;/p&gt;</comment>
                    <comment id="28108" author="bbloom" created="Thu, 12 Apr 2012 13:39:42 -0500"  >&lt;p&gt;This patch removes a function that was called emits (note the &quot;s&quot;). It simply called emit inside a with-out-string.&lt;/p&gt;

&lt;p&gt;The emitx function in this patch isn&apos;t that simple. It does some special handling of nil, maps, seqs, functions, etc. It creates a mini DSL for emitting code, so that I didn&apos;t have to drastically rewrite all the places that used (print (emit-str ...)) and similar before.&lt;/p&gt;

&lt;p&gt;I decided not to call it emit-str to avoid confusion with the old emits function, as well as to differentiate the behavior from prn-str and the others, which return a string without affecting the previously set &lt;b&gt;out&lt;/b&gt;. Quite honestly, the best name for it is simply &quot;emit&quot;, but that honor goes to the current multi-method, which is probably best named &quot;emit-ast&quot;. I don&apos;t think it&apos;s worth the churn to rename that.&lt;/p&gt;

&lt;p&gt;Either way, I&apos;m not too picky. If you have a preferred name, I&apos;ll update the patch to whatever you like.&lt;/p&gt;</comment>
                    <comment id="28109" author="dnolen" created="Thu, 12 Apr 2012 14:42:56 -0500"  >&lt;p&gt;It&apos;s a big patch, it&apos;s not clear to me why you need emitx to handle all those cases. Can you point out specific lines? Thanks.&lt;/p&gt;</comment>
                    <comment id="28121" author="bbloom" created="Thu, 12 Apr 2012 17:50:52 -0500"  >&lt;p&gt;Any line that used to use &apos;emits was potentially problematic because it allowed things to be printed out of order. Consider this:&lt;/p&gt;

&lt;p&gt;(let &lt;span class=&quot;error&quot;&gt;&amp;#91;xyz (with-out-str (print-mystery))&amp;#93;&lt;/span&gt;&lt;br/&gt;
  (println &quot;abc&quot;)&lt;br/&gt;
  (println xyz)&lt;br/&gt;
  (println &quot;123&quot;))&lt;/p&gt;

&lt;p&gt;How many newlines were printed? At what column is &quot;123&quot; printed? Without knowing the contents of &apos;xyz, there is no way to know. You could split by occurrences of &lt;br clear=&quot;all&quot; /&gt;n in &apos;xyz, but that would negatively affect performance and doesn&apos;t alleviate the need to funnel all printing through a single choke point.&lt;/p&gt;

&lt;p&gt;Instead, I opted to restructure to something like this:&lt;/p&gt;

&lt;p&gt;(let &lt;a href=&quot;#(emit-mystery)&quot;&gt;xyz #(emit-mystery)&lt;/a&gt;&lt;br/&gt;
  (emitln &quot;abc&quot;)&lt;br/&gt;
  (xyz)&lt;br/&gt;
  (emitln &quot;123&quot;))&lt;/p&gt;

&lt;p&gt;So that&apos;s why &apos;emitx handles &apos;fn? and the :else case. &apos;map? is for handling the ast &apos;emit multi-method. &apos;nil? and &apos;seq? are convinces for common cases. The behavior is similar to expansion of seqs in Hiccup. There are numerous examples of each.&lt;/p&gt;</comment>
                    <comment id="28131" author="dnolen" created="Fri, 13 Apr 2012 08:23:17 -0500"  >&lt;p&gt;K I understand that patch quite a bit better now. Makes sense. I still think emitx is not a great name. Lets stick with emits.&lt;/p&gt;</comment>
                    <comment id="28138" author="bbloom" created="Fri, 13 Apr 2012 14:16:47 -0500"  >&lt;p&gt;I just looked through the source and renaming &apos;emit to &apos;emit-ast and &apos;emitx to &apos;emit wouldn&apos;t actually be that much churn. There are only one or two references to &apos;emit outside of the &apos;defmethod calls. Also, anyone who calls &apos;emit, expecting &apos;emit-ast, will still get the right result. I&apos;ll go with that, unless you feel strongly about &apos;emits.&lt;/p&gt;

&lt;p&gt;Hopefully, I&apos;ll find time to update the patch this weekend.&lt;/p&gt;

&lt;p&gt;Is there a resource regarding testing the compiler? Wiki page or something? I&apos;ve been diffing the output of the Twitter sample, but it would be nice to have a more rigorous test harness.&lt;/p&gt;</comment>
                    <comment id="28139" author="bbloom" created="Fri, 13 Apr 2012 14:29:11 -0500"  >&lt;p&gt;Sorry, shouldn&apos;t write comments before I have my coffee &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;I know about this page: &lt;a href=&quot;https://github.com/clojure/clojurescript/wiki/Running-the-tests&quot;&gt;https://github.com/clojure/clojurescript/wiki/Running-the-tests&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But that page mentions &quot;make sure the repl hasn&apos;t broken&quot;. I&apos;m assuming that the test coverage for the compiler isn&apos;t good enough to accept patches without additional manual testing. Is that a correct assumption? What&apos;s your test process? I&apos;d like to minimize the effort for you to accept patches in the future.&lt;/p&gt;</comment>
                    <comment id="28140" author="dnolen" created="Fri, 13 Apr 2012 15:01:53 -0500"  >&lt;p&gt;I see no compelling reason to switch to emit-ast. Lets just stick with emit, emits, emitln please.&lt;/p&gt;

&lt;p&gt;As far as testing, I normally just test using ./script/test. Issues w/ Browser REPL tend to crop up if someone is messing with closure.clj or the REPL source itself. It&apos;s simple to test and I don&apos;t mind doing that.&lt;/p&gt;</comment>
                    <comment id="28145" author="bbloom" created="Sat, 14 Apr 2012 19:49:49 -0500"  >&lt;p&gt;Updated with patch 2. Please don&apos;t make me merge more optimizations &lt;img class=&quot;emoticon&quot; src=&quot;http://dev.clojure.org/jira/images/icons/emoticons/smile.gif&quot; height=&quot;20&quot; width=&quot;20&quot; align=&quot;absmiddle&quot; alt=&quot;&quot; border=&quot;0&quot;/&gt;&lt;/p&gt;</comment>
                    <comment id="28146" author="bbloom" created="Sat, 14 Apr 2012 19:54:18 -0500"  >&lt;p&gt;You want attachment 11052, not 11051&lt;/p&gt;</comment>
                    <comment id="28148" author="dnolen" created="Sun, 15 Apr 2012 14:12:41 -0500"  >&lt;p&gt;Fixed, &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/e4c6ae4e0639efaa648efa351c366a2f686be51e&quot;&gt;https://github.com/clojure/clojurescript/commit/e4c6ae4e0639efaa648efa351c366a2f686be51e&lt;/a&gt;&lt;/p&gt;</comment>
                    <comment id="28167" author="bbloom" created="Mon, 16 Apr 2012 23:52:19 -0500"  >&lt;p&gt;Apparently I missed one println call on line 443. I&apos;ve attached uninit-var-print.patch to correct it.&lt;/p&gt;

&lt;p&gt;I hope you see updates to this issue, even though it&apos;s resolved. It seems really heavyweight to use a JIRA ticket for such a trivial change. Let me know if I really should have.&lt;/p&gt;</comment>
                    <comment id="28168" author="dnolen" created="Tue, 17 Apr 2012 12:57:22 -0500"  >&lt;p&gt;Fixed in master, thanks.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11032" name="track-pos-1.diff" size="30068" author="bbloom" created="Mon, 9 Apr 2012 02:16:09 -0500" />
                    <attachment id="11052" name="track-pos-2.patch" size="30531" author="bbloom" created="Sat, 14 Apr 2012 19:49:22 -0500" />
                    <attachment id="11059" name="uninit-var-print.patch" size="759" author="bbloom" created="Mon, 16 Apr 2012 23:49:50 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-169] Forward slashes should not be escaped in javascript strings</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-169</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;cljs.compiler/escape-char incorrectly escapes forward slashes.&lt;/p&gt;

&lt;p&gt;Generally, this isn&apos;t a problem because most Javascript engines treat unknown escape sequences as non-escape sequences. However, I ran into a JSON parser that barfs on it while working on source-maps. I tried to use escape-string for producing the JSON-based source-map by reusing the existing compiler functions for emitting valid Javascript.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15294">CLJS-169</key>
            <summary>Forward slashes should not be escaped in javascript strings</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Sun, 25 Mar 2012 23:35:07 -0500</created>
                <updated>Fri, 30 Mar 2012 15:21:25 -0500</updated>
                    <resolved>Fri, 30 Mar 2012 15:21:25 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="28061" author="dnolen" created="Fri, 30 Mar 2012 15:21:25 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/29d60c7eb2c79768e2e2a2c572a4e4eff132946d&quot;&gt;https://github.com/clojure/clojurescript/commit/29d60c7eb2c79768e2e2a2c572a4e4eff132946d&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11009" name="no-escape-slash.diff" size="656" author="bbloom" created="Sun, 25 Mar 2012 23:35: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="10001">Code</customfieldvalue>

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

<item>
            <title>[CLJS-164] Add missing core printing functions</title>
                <link>http://dev.clojure.org/jira/browse/CLJS-164</link>
                <project id="10040" key="CLJS">ClojureScript</project>
                        <description>&lt;p&gt;I&apos;ve attached a patch which adds a few missing printing functions to ClojureScript core.&lt;/p&gt;

&lt;p&gt;New functions:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;prn-str&lt;/li&gt;
	&lt;li&gt;print-str&lt;/li&gt;
	&lt;li&gt;println-str&lt;/li&gt;
&lt;/ul&gt;
</description>
                <environment></environment>
            <key id="15284">CLJS-164</key>
            <summary>Add missing core printing functions</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="5" iconUrl="http://dev.clojure.org/jira/images/icons/status_resolved.gif">Resolved</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="bbloom">Brandon Bloom</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Sun, 18 Mar 2012 18:44:05 -0500</created>
                <updated>Fri, 30 Mar 2012 15:20:55 -0500</updated>
                    <resolved>Fri, 30 Mar 2012 15:20:55 -0500</resolved>
                                                                    <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="27968" author="dnolen" created="Mon, 19 Mar 2012 12:14:19 -0500"  >&lt;p&gt;Mind adding the related tests?&lt;/p&gt;</comment>
                    <comment id="28008" author="bbloom" created="Sun, 25 Mar 2012 23:16:27 -0500"  >&lt;p&gt;New diff with tests.&lt;/p&gt;

&lt;p&gt;Sorry I didn&apos;t get to these sooner. I&apos;m set as &quot;watching&quot; this issue, but I didn&apos;t get emailed when you commented.&lt;/p&gt;</comment>
                    <comment id="28060" author="dnolen" created="Fri, 30 Mar 2012 15:20:55 -0500"  >&lt;p&gt;fixed, &lt;a href=&quot;https://github.com/clojure/clojurescript/commit/3a3d9b1e3ab8858f26711a8860f48619736eba2d&quot;&gt;https://github.com/clojure/clojurescript/commit/3a3d9b1e3ab8858f26711a8860f48619736eba2d&lt;/a&gt;&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10997" name="pr-fns.diff" size="3036" author="bbloom" created="Sun, 18 Mar 2012 18:44:05 -0500" />
                    <attachment id="11008" name="pr-fns-with-tests.diff" size="3917" author="bbloom" created="Sun, 25 Mar 2012 23:16:27 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <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-1084] (object-array [1]) is ~3x slower than (object-array (rseq [1]))</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1084</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;{{user=&amp;gt; (time (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;_ 10000000&amp;#93;&lt;/span&gt; (object-array &lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt;)))&lt;br/&gt;
&quot;Elapsed time: 1178.116257 msecs&quot;&lt;br/&gt;
nil&lt;br/&gt;
user=&amp;gt; (time (dotimes &lt;span class=&quot;error&quot;&gt;&amp;#91;_ 10000000&amp;#93;&lt;/span&gt; (object-array (rseq &lt;span class=&quot;error&quot;&gt;&amp;#91;1&amp;#93;&lt;/span&gt;))))&lt;br/&gt;
&quot;Elapsed time: 422.42248 msecs&quot;&lt;br/&gt;
nil}}&lt;/p&gt;


&lt;p&gt;This appears to be because PersistentVector$ChunkedSeq does not implement Counted, so RT.count is iterating the ChunkedSeq to get its count.&lt;/p&gt;</description>
                <environment></environment>
            <key id="15743">CLJ-1084</key>
            <summary>(object-array [1]) is ~3x slower than (object-array (rseq [1]))</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="pjstadig">Paul Stadig</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Tue, 9 Oct 2012 14:07:53 -0500</created>
                <updated>Sat, 20 Oct 2012 09:53:42 -0500</updated>
                    <resolved>Sat, 20 Oct 2012 09:53:42 -0500</resolved>
                            <version>Release 1.4</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>1</votes>
                        <watches>1</watches>
                        <comments>
                    <comment id="29623" author="pjstadig" created="Tue, 9 Oct 2012 14:11:21 -0500"  >&lt;p&gt;I don&apos;t believe this is Major priority, but I cannot edit the ticket after having created it.&lt;/p&gt;</comment>
                    <comment id="29633" author="tsdh" created="Thu, 11 Oct 2012 10:17:56 -0500"  >&lt;p&gt;This patch makes PersistentVector$ChunkedSeq implement Counted.&lt;/p&gt;

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

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

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

&lt;p&gt;Before:&lt;/p&gt;
&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;(time (dotimes [_ 10000000] (object-array [1])))
;&quot;Elapsed time: 1668.346997 msecs&quot;
(time (dotimes [_ 10000000] (object-array (rseq [1]))))
;&quot;Elapsed time: 662.820591 msecs&quot;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After:&lt;/p&gt;
&lt;div class=&quot;preformatted panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;preformattedContent panelContent&quot;&gt;
&lt;pre&gt;(time (dotimes [_ 10000000] (object-array [1])))
;&quot;Elapsed time: 757.084577 msecs&quot;
(time (dotimes [_ 10000000] (object-array (rseq [1]))))
;&quot;Elapsed time: 680.602921 msecs&quot;
&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                    <comment id="29693" author="stu" created="Fri, 19 Oct 2012 13:46:44 -0500"  >&lt;p&gt;Two patches to be applied together, the 10/19 patch adds tests and updates to latest test.generative.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11551" name="0001-Make-PersistentVector-ChunkedSeq-implement-Counted.patch" size="1168" author="tsdh" created="Thu, 11 Oct 2012 10:17:56 -0500" />
                    <attachment id="11580" name="CLJ-1084-tests.patch" size="1575" author="stu" created="Fri, 19 Oct 2012 13:46:44 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10007">Ok</customfieldvalue>

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

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

<item>
            <title>[CLJ-1020] clojure.inspector/inspect-table gives up when first element of coll is nil</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-1020</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;clojure.inspector/inspect-table gives up when first element of coll is nil. The patch provided is rather trivial...instead of blindly choosing the first element (which might be nil), it would be more convenient to choose the first element that is NOT nil and use its keys for columns...a similar issue exists with clojure.pprint/print-table where the keys of the first element are used (if not provided explicitly). The same is not true for &apos;inspect-table&apos; though. As a result, one cannot &apos;inspect&apos; a collection of maps where the first element is nil. My (trivial) patch looks for the first element which is NOT nil and uses its keys instead. Maps have to have the same length anyway so no problems there...&lt;/p&gt;</description>
                <environment>Ubuntu 12.04, Java 7, Clojure 1.4</environment>
            <key id="15563">CLJ-1020</key>
            <summary>clojure.inspector/inspect-table gives up when first element of coll is nil</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="1" iconUrl="http://dev.clojure.org/jira/images/icons/status_open.gif">Open</status>
                    <resolution id="-1">Unresolved</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="jimpil">Dimitrios Piliouras</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 2 Jul 2012 05:26:42 -0500</created>
                <updated>Thu, 13 Sep 2012 14:30:24 -0500</updated>
                                    <version>Release 1.4</version>
                                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="28981" author="jafingerhut" created="Thu, 12 Jul 2012 13:01:18 -0500"  >&lt;p&gt;clj-1020-inspect-table-skip-nil-rows-patch1.txt of July 12, 2012 is identical to inspector.patch of July 2, 2012, except it is in the desired git format.  Proper attribution is given to author Dimitrios Piliouras in the patch.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11379" name="clj-1020-inspect-table-skip-nil-rows-patch1.txt" size="722" author="jafingerhut" created="Thu, 12 Jul 2012 13:01:18 -0500" />
                    <attachment id="11359" name="inspector.patch" size="329" author="jimpil" created="Mon, 2 Jul 2012 05:26:42 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                                                                            <customfield id="customfield_10010" key="com.pyxis.greenhopper.jira:gh-global-rank">
                <customfieldname>Global Rank</customfieldname>
                <customfieldvalues>
                    
                </customfieldvalues>
            </customfield>
                                            <customfield id="customfield_10000" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Patch</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10001">Code</customfieldvalue>

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

<item>
            <title>[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-963] Support pretty printing namespace declarations under code-dispatch</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-963</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;Currently when you print code with an (ns ) declaration in it, the ns declaration comes out kind of messy. This patch makes that beautiful. &lt;/p&gt;</description>
                <environment>all</environment>
            <key id="15307">CLJ-963</key>
            <summary>Support pretty printing namespace declarations under code-dispatch</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="4" iconUrl="http://dev.clojure.org/jira/images/icons/priority_minor.gif">Minor</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="stuart.sierra">Stuart Sierra</assignee>
                                <reporter username="tomfaulhaber">Tom Faulhaber</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Thu, 29 Mar 2012 20:38:10 -0500</created>
                <updated>Sat, 1 Sep 2012 08:37:48 -0500</updated>
                    <resolved>Sat, 1 Sep 2012 08:37:48 -0500</resolved>
                            <version>Release 1.2</version>
                <version>Release 1.3</version>
                                <fixVersion>Release 1.5</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>0</watches>
                        <comments>
                    <comment id="29260" author="stuart.sierra" created="Fri, 24 Aug 2012 08:30:19 -0500"  >&lt;p&gt;Screened.&lt;/p&gt;

&lt;p&gt;It&apos;s not perfect, but an improvement.&lt;/p&gt;

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

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;user=&amp;gt; (with-pprint-dispatch code-dispatch (pprint &apos;(ns com.some-example.my-app (:require clojure.string [clojure.set :as set] [clojure.java.io :refer (file reader)]))))
(ns
  com.some-example.my-app
  (:require
    clojure.string
    [clojure.set :as set]
    [clojure.java.io :refer (file reader)]))
nil&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;

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

&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;user=&amp;gt; (with-pprint-dispatch code-dispatch (pprint &apos;(ns com.some-example.my-app (:require clojure.string [clojure.set :as set] [clojure.java.io :refer (file reader)]))))
(ns com.some-example.my-app
  (:require clojure.string [clojure.set :as set]
            [clojure.java.io :refer (file reader)]))
nil&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="11026" name="pprint-ns-patch.diff" size="9569" author="tomfaulhaber" created="Thu, 29 Mar 2012 20:38:11 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10007">Ok</customfieldvalue>

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

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

<item>
            <title>[CLJ-953] drop-while doc string wrong, nil instead of logical false</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-953</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;&quot;Returns a lazy sequence of the items in coll starting from the first
-  item &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; which (pred item) returns nil.&quot;
+  item &lt;span class=&quot;code-keyword&quot;&gt;for&lt;/span&gt; which (pred item) returns logical &lt;span class=&quot;code-keyword&quot;&gt;false&lt;/span&gt;.&quot;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;</description>
                <environment></environment>
            <key id="15279">CLJ-953</key>
            <summary>drop-while doc string wrong, nil instead of logical false</summary>
                <type id="4" iconUrl="http://dev.clojure.org/jira/images/icons/improvement.gif">Enhancement</type>
                                <priority id="5" iconUrl="http://dev.clojure.org/jira/images/icons/priority_trivial.gif">Trivial</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="alan@thinkrelevance.com">Alan Dipert</assignee>
                                <reporter username="spoon16">Eric Schoonover</reporter>
                        <labels>
                        <label>documentation</label>
                        <label>patch,</label>
                    </labels>
                <created>Thu, 15 Mar 2012 16:50:50 -0500</created>
                <updated>Fri, 30 Mar 2012 09:16:31 -0500</updated>
                    <resolved>Fri, 30 Mar 2012 09:16:31 -0500</resolved>
                            <version>Release 1.3</version>
                                <fixVersion>Release 1.4</fixVersion>
                                        <due></due>
                    <votes>0</votes>
                        <watches>1</watches>
                                <attachments>
                    <attachment id="10992" name="take-while_doc_string_CLJ-953.diff" size="732" author="spoon16" created="Thu, 15 Mar 2012 16:55:04 -0500" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10007">Ok</customfieldvalue>

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

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

<item>
            <title>[CLJ-886] java.io/do-copy can garble multibyte characters</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-886</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;See comments in fix:&lt;/p&gt;

&lt;p&gt;(defmethod do-copy &lt;span class=&quot;error&quot;&gt;&amp;#91;InputStream Writer&amp;#93;&lt;/span&gt; &lt;span class=&quot;error&quot;&gt;&amp;#91;#^InputStream input #^Writer output opts&amp;#93;&lt;/span&gt;&lt;br/&gt;
  ;; WRONG! if the buffer boundry falls in the middle of a multibyte character, we will get garbled results.&lt;br/&gt;
  #_&lt;br/&gt;
  (let [#^&quot;&lt;span class=&quot;error&quot;&gt;&amp;#91;B&amp;quot; buffer (make-array Byte/TYPE (buffer-size opts))&amp;#93;&lt;/span&gt;&lt;br/&gt;
    (loop []&lt;br/&gt;
      (let &lt;span class=&quot;error&quot;&gt;&amp;#91;size (.read input buffer)&amp;#93;&lt;/span&gt;&lt;br/&gt;
        (when (pos? size)&lt;br/&gt;
          (let &lt;span class=&quot;error&quot;&gt;&amp;#91;chars (.toCharArray (String. buffer 0 size (encoding opts)))&amp;#93;&lt;/span&gt;&lt;br/&gt;
            (do (.write output chars)&lt;br/&gt;
                (recur)))))))&lt;br/&gt;
  ;; here we decode the characters before stuffing them into the buffer&lt;br/&gt;
  (let [#^&quot;[C&quot; buffer (make-array Character/TYPE (buffer-size opts))&lt;br/&gt;
        in (InputStreamReader. input (encoding opts))]&lt;br/&gt;
    (loop []&lt;br/&gt;
      (let &lt;span class=&quot;error&quot;&gt;&amp;#91;size (.read in buffer 0 (alength buffer))&amp;#93;&lt;/span&gt;&lt;br/&gt;
        (if (pos? size)&lt;br/&gt;
          (do (.write output buffer 0 size)&lt;br/&gt;
              (recur)))))))&lt;/p&gt;</description>
                <environment>all</environment>
            <key id="15033">CLJ-886</key>
            <summary>java.io/do-copy can garble multibyte characters</summary>
                <type id="1" iconUrl="http://dev.clojure.org/jira/images/icons/bug.gif">Defect</type>
                                <priority id="3" iconUrl="http://dev.clojure.org/jira/images/icons/priority_major.gif">Major</priority>
                    <status id="6" iconUrl="http://dev.clojure.org/jira/images/icons/status_closed.gif">Closed</status>
                    <resolution id="1">Completed</resolution>
                                <assignee username="-1">Unassigned</assignee>
                                <reporter username="jpalmucci">Jeff Palmucci</reporter>
                        <labels>
                        <label>patch,</label>
                    </labels>
                <created>Mon, 28 Nov 2011 16:24:43 -0600</created>
                <updated>Fri, 23 Mar 2012 08:40:35 -0500</updated>
                    <resolved>Fri, 23 Mar 2012 08:40:35 -0500</resolved>
                            <version>Release 1.3</version>
                                <fixVersion>Release 1.4</fixVersion>
                                        <due></due>
                    <votes>2</votes>
                        <watches>3</watches>
                        <comments>
                    <comment id="27418" author="jpalmucci" created="Mon, 5 Dec 2011 11:23:01 -0600"  >&lt;p&gt;Make patch file per &lt;a href=&quot;http://clojure.org/patches&quot;&gt;http://clojure.org/patches&lt;/a&gt;. Also sent in my CA.&lt;/p&gt;</comment>
                    <comment id="27484" author="jpalmucci" created="Mon, 19 Dec 2011 08:53:13 -0600"  >&lt;p&gt;Any reason why this hasn&apos;t been applied yet? It&apos;s a pretty serious error. Just wondering if I&apos;ve submitted anything incorrectly. Thanks.&lt;/p&gt;</comment>
                    <comment id="27703" author="jafingerhut" created="Thu, 9 Feb 2012 20:13:03 -0600"  >&lt;p&gt;&lt;a href=&quot;http://dev.clojure.org/jira/browse/CLJ-886&quot; title=&quot;java.io/do-copy can garble multibyte characters&quot;&gt;&lt;del&gt;CLJ-886&lt;/del&gt;&lt;/a&gt;-fix2.patch includes Jeff Palmucci&apos;s fix, plus another one found while enhancing clojure.java.io&apos;s unit tests to fail with the original code.  Tested on Mac OS X 10.6.8 with java 1.6.0_29 and Ubuntu Linux 11.04 with JVM 1.7.0_02.&lt;/p&gt;</comment>
                    <comment id="27710" author="jpalmucci" created="Mon, 13 Feb 2012 07:29:48 -0600"  >&lt;p&gt;Andy&apos;s fix is good. Please use the fix2 patch instead of the original.&lt;/p&gt;</comment>
                    <comment id="27755" author="stuart.sierra" created="Fri, 17 Feb 2012 14:55:49 -0600"  >&lt;p&gt;Screened. Patch applies successfully and the tests seem to be complete.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10733" name="clj-886.diff" size="2280" author="jpalmucci" created="Mon, 5 Dec 2011 11:23:01 -0600" />
                    <attachment id="10899" name="CLJ-886-fix2.patch" size="7248" author="jafingerhut" created="Thu, 9 Feb 2012 20:13:03 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10007">Ok</customfieldvalue>

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

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

<item>
            <title>[CLJ-879] Allow :require to support a :refer clause</title>
                <link>http://dev.clojure.org/jira/browse/CLJ-879</link>
                <project id="10010" key="CLJ">Clojure</project>
                        <description>&lt;p&gt;There&apos;s been discussion previously about the complexity of the ns&lt;br/&gt;
macro. In particular the fact that :use causes all vars to be referred&lt;br/&gt;
by default is widely seen as unfortunate, and the distinction between&lt;br/&gt;
use and require is a source of conceptual overhead for people new to&lt;br/&gt;
the language.&lt;/p&gt;

&lt;p&gt;We can&apos;t change the fact that :use refers everything by default&lt;br/&gt;
without breaking lots of existing code. But it would be possible to&lt;br/&gt;
enhance :require to support referring specified vars, leaving us free&lt;br/&gt;
to deprecate or otherwise discourage the use of :use.&lt;/p&gt;

&lt;p&gt;Clojure-dev thread discussing this: &lt;a href=&quot;http://groups.google.com/group/clojure-dev/browse_thread/thread/91b708ddb909affd&quot;&gt;http://groups.google.com/group/clojure-dev/browse_thread/thread/91b708ddb909affd&lt;/a&gt;&lt;/p&gt;</description>
                <environment></environment>
            <key id="15015">CLJ-879</key>
            <summary>Allow :require to support a :refer clause</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="technomancy">Phil Hagelberg</assignee>
                                <reporter username="technomancy">Phil Hagelberg</reporter>
                        <labels>
                        <label>patch,</label>
                        <label>test</label>
                    </labels>
                <created>Thu, 17 Nov 2011 16:08:40 -0600</created>
                <updated>Fri, 17 Feb 2012 14:18:28 -0600</updated>
                    <resolved>Fri, 17 Feb 2012 14:18:28 -0600</resolved>
                                                                    <due></due>
                    <votes>9</votes>
                        <watches>7</watches>
                        <comments>
                    <comment id="27345" author="technomancy" created="Fri, 25 Nov 2011 14:52:12 -0600"  >&lt;p&gt;Patch containing implementation, test, and documentation.&lt;/p&gt;</comment>
                    <comment id="27515" author="technomancy" created="Fri, 6 Jan 2012 14:21:19 -0600"  >&lt;p&gt;Any chance we could get some discussion going on this?&lt;/p&gt;</comment>
                    <comment id="27565" author="devinus" created="Sat, 14 Jan 2012 01:12:29 -0600"  >&lt;p&gt;I&apos;d love to see this discussed.&lt;/p&gt;</comment>
                    <comment id="27631" author="technomancy" created="Fri, 27 Jan 2012 16:42:51 -0600"  >&lt;p&gt;So... how about it? Thoughts?&lt;/p&gt;</comment>
                    <comment id="27740" author="hiredman" created="Fri, 17 Feb 2012 11:30:50 -0600"  >&lt;p&gt;patch still applies cleanly to master, tests pass&lt;/p&gt;

&lt;p&gt;there is a warning when you run the tests though:&lt;/p&gt;

&lt;p&gt;     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt; Testing clojure.test-clojure.keywords&lt;br/&gt;
     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt; &lt;br/&gt;
     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt; Testing clojure.test-clojure.load&lt;br/&gt;
     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt; WARNING: with-bindings already refers to: #&apos;clojure.core/with-bindings in namespace: clojure.test-clojure.require-scratch, being replaced by: #&apos;clojure.main/with-bindings&lt;br/&gt;
     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt; &lt;br/&gt;
     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt; Testing clojure.test-clojure.logic&lt;br/&gt;
     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt; &lt;br/&gt;
     &lt;span class=&quot;error&quot;&gt;&amp;#91;java&amp;#93;&lt;/span&gt; Testing clojure.test-clojure.macros&lt;/p&gt;</comment>
                    <comment id="27743" author="stuart.sierra" created="Fri, 17 Feb 2012 13:36:58 -0600"  >&lt;p&gt;Vetted. Patch is good, although it needs docstring updates in &apos;require&apos;&lt;/p&gt;</comment>
                    <comment id="27745" author="stuart.sierra" created="Fri, 17 Feb 2012 13:55:39 -0600"  >&lt;p&gt;Not Vetted. I can&apos;t remember what the names mean. Ready for Rich. That&apos;s &quot;Test&quot; right?&lt;/p&gt;</comment>
                    <comment id="27747" author="stuart.sierra" created="Fri, 17 Feb 2012 13:59:22 -0600"  >&lt;p&gt;My mistake. The docstring is included in &apos;require&apos;, but not in &apos;refer&apos;, which also changed. But the &lt;b&gt;public API&lt;/b&gt; of &apos;refer&apos; did not change. So this patch is good.&lt;/p&gt;</comment>
                    <comment id="27748" author="stuart.sierra" created="Fri, 17 Feb 2012 14:08:55 -0600"  >&lt;p&gt;Not &quot;Test.&quot; Screened. The patch is Screened. I hate this.&lt;/p&gt;</comment>
                    <comment id="27751" author="stuart.sierra" created="Fri, 17 Feb 2012 14:18:28 -0600"  >&lt;p&gt;Patch applied.&lt;/p&gt;</comment>
                </comments>
                    <attachments>
                    <attachment id="10716" name="0001-Allow-require-to-take-a-refer-option.patch" size="3422" author="technomancy" created="Fri, 25 Nov 2011 14:52:12 -0600" />
                </attachments>
            <subtasks>
        </subtasks>
                <customfields>
                                <customfield id="customfield_10002" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                <customfieldname>Approval</customfieldname>
                <customfieldvalues>
                        <customfieldvalue key="10007">Ok</customfieldvalue>

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

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

<item>
            <title>[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>
</channel>
</rss>