[CLJ-1206] 'eval' of closures or fns with runtime metadata within a call expr yields "No matching ctor found" exceptions Created: 28/Apr/13 Updated: 28/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Jason Wolfe | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
I ran into some issues with 'eval' when writing compilation strategies for Graph. It seems these may have been known for some time [1], but I couldn't find a ticket for them, so here we are. Clojure docs [2] say "If the operator is not a special form or macro, the call is considered a function call. Both the operator and the operands (if any) are evaluated, from left to right," and "Any object other than those discussed above will evaluate to itself." While bare fns do seem to evaluate to themselves in all cases, when in a call expression, the evaluation of the operator fails on fn objects that are closures or have run-time metadata applied: ;; raw non-closures are fine ;; raw closures are fine ;; non-closures in exprs are fine ;; but closures in exprs cause an error ;; as do fns with metadata in exprs [1] http://stackoverflow.com/a/11287181 |
[CLJ-1204] hash is inconsistent with = for many BigInteger values Created: 18/Apr/13 Updated: 25/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4, Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Andy Fingerhut | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
The function hash is documented to be consistent with =. For many BigInteger values, hash is inconsistent with =. This leads to incorrect behavior for data structures like hash maps that use hash. user> (apply = [-1 -1N (biginteger -1)])
true
user> (map hash [-1 -1N (biginteger -1)])
(0 0 -1)
;; Incorrect return value with multiple keys = to each other
user> (assoc (hash-map -1N :should-be-replaced) (biginteger -1) :new-val)
{-1N :should-be-replaced, -1 :new-val}
;; array-map gives correct value, since it uses =, not hash
user> (assoc (array-map -1N :should-be-replaced) (biginteger -1) :new-val)
{-1N :new-val}
|
| Comments |
| Comment by Andy Fingerhut [ 18/Apr/13 8:10 PM ] |
|
Patch clj-1204-make-hash-consistent-with-equal-for-bigintegers-v1.txt dated Apr 18 2013 takes the following approach to the issue: Change the behavior of hasheq so that when given a BigInteger value that could fit into a long, returns the same hash code as that long value. hasheq continues to return x.hashCode() if the BigInteger value does not fit into a long. This is consistent with the hash value returned by a BigInt value that does not fit into a long. New tests are included, some of which fail without the change to hasheq, but pass with the change. |
| Comment by Andy Fingerhut [ 18/Apr/13 8:19 PM ] |
|
Overwrite patch with one that leaves out some unnecessary code. |
| Comment by Andy Fingerhut [ 25/Apr/13 6:42 PM ] |
|
Changing priority to minor, since I suppose one could work around this issue, if you were diligent about it, by converting all BigIntegers to BigInts before they are ever used in a place where they are hashed. |
[CLJ-1201] There should also be writing in clojure.edn Created: 15/Apr/13 Updated: 15/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Vitaly Shukela | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | edn | ||
| Description |
|
In clojure.edn I see only "read" and "read-string". For symmetry I expect "write" and "write-string" to be nearby. At first it could be just alias for "pr" and "pr-str", but in furure they may limited version of "pr" which only produces valid input for clojure.edn/read. |
[CLJ-1200] RestFn & ArraySeq performance Created: 14/Apr/13 Updated: 18/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Brandon Bloom | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 3 |
| Labels: | patch | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
I was profiling one of my projects and noticed a hotspot inside functions using rest arguments. Most overloads of RestFn.invoke will construct an ArraySeq object. The ArraySeq constructor calls java.lang.Class.getComponentType, which seems to be pretty slow. The array's component type is cached in a field on the ArraySeq object for the sole purpose of passing it to Reflector.prepRet. I'm not entirely sure of the total utility of prepRet, but it's clearly a no-op when passed Object.class, such as the case with the non-specialized base class of ArraySeq: the component type of object[] is Object.class. The attached patch eliminates the component type field from ArraySeq and passes Object.class to prepRet directly. It may be possible to eliminate calls to prepRet all together, but I'll assume that's a different ticket. With this patch, ArraySeq initialization no longer shows up as a hotspot when profiling. Before the patch: user=> (dotimes [n 10] (time (dotimes [i 5000000] ((fn [& args]) 1 2 3 4)))) "Elapsed time: 874.742 msecs" "Elapsed time: 900.277 msecs" "Elapsed time: 911.164 msecs" "Elapsed time: 872.132 msecs" "Elapsed time: 885.495 msecs" "Elapsed time: 897.537 msecs" "Elapsed time: 879.691 msecs" "Elapsed time: 888.52 msecs" "Elapsed time: 871.556 msecs" "Elapsed time: 1088.682 msecs" After the patch: user=> (dotimes [n 10] (time (dotimes [i 5000000] ((fn [& args]) 1 2 3 4)))) "Elapsed time: 628.144 msecs" "Elapsed time: 634.163 msecs" "Elapsed time: 617.397 msecs" "Elapsed time: 622.714 msecs" "Elapsed time: 646.743 msecs" "Elapsed time: 648.708 msecs" "Elapsed time: 629.223 msecs" "Elapsed time: 638.058 msecs" "Elapsed time: 725.473 msecs" "Elapsed time: 636.909 msecs" That's about a 30% reduction in execution time. Granted it only represents a change of 52 nanoseconds per RestFn invoke (181 ns to 129 ns), but this actually was a pretty decent win for a library that makes makes almost exclusively variadic function calls in a tight loop. |
[CLJ-1199] Record values are not 'eval'uated, unlike values of PersistentMap: Created: 13/Apr/13 Updated: 13/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Jason Wolfe | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
I'm not sure if this is by design, but it caught me off guard. user> (defrecord A [x]) user> (eval (hash-map :x `long)) and in case it matters, here's a simplified version of the real use case where this came up, with no eval – just a macro: user> (defmacro munge-meta1 [x] (assoc x :schema (->A (:schema (meta x))))) user> (defmacro munge-meta2 [x] (assoc x :schema (hash-map :x (:schema (meta x))))) This seems to be fixed by moving the record creation post-evaluation, so it's not a big deal, just surprising (plus I haven't yet convinced myself that this will always work if the user's schema itself contains record-creating forms, although it seems to work OK): user> (defmacro munge-meta1 [x] (assoc x :schema `(->A ~(:schema (meta x))))) I brought this up on the mailing list here: https://groups.google.com/forum/?fromgroups=#!topic/clojure-dev/UgD35E1RQTo |
[CLJ-1198] Apply metadata to primitive fns causes them to lose their primitive-ness Created: 13/Apr/13 Updated: 13/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Jason Wolfe | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
user> (def f (fn [^long x] x)) We're working on libraries that use metadata on functions to track information about their arguments (schemata, etc), and this currently blocks us from fully supporting primitive fns. |
[CLJ-1195] emit-hinted-impl expands to non-ns-qualified invocation of 'fn' Created: 09/Apr/13 Updated: 09/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Jason Wolfe | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Mac os X Clojure 1.5.1 |
||
| Description |
|
(ns plumbing.tmp (defprotocol Foo (extend-protocol Foo yields CompilerException java.lang.RuntimeException: Unable to resolve symbol: fn in this context, compiling This makes it difficult to construct a namespace that provides a replacement def for fn. |
[CLJ-1193] bigint, biginteger throw on double values outside of long range Created: 07/Apr/13 Updated: 17/May/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Andy Fingerhut | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Vetted |
| Description |
|
This works fine: user> (bigint (* 0.99 Long/MAX_VALUE)) but this and any other Float or Double values outside the range of a user> (bigint (* 1.01 Long/MAX_VALUE)) Similarly for biginteger |
| Comments |
| Comment by Andy Fingerhut [ 07/Apr/13 4:38 PM ] |
|
Patch clj-1197-make-bigint-work-on-all-doubles-v1.txt dated Apr 7 2013 changes bigint and biginteger so that they return the correct value for all float and double values, and no longer throw an exception. |
| Comment by Gabriel Horner [ 17/May/13 10:52 AM ] |
|
Looks good. Tests pass and the failing example now converts correctly |
[CLJ-1191] Improve apropos to show some indication of namespace of symbols found Created: 04/Apr/13 Updated: 05/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5, Release 1.6 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Andy Fingerhut | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
apropos does find all symbols in all namespaces that match the argument, but the return value gives no clue as to which namespace the found symbols are in. It can even return multiple occurrences of the same symbol, which only gives a clue that the symbol exists in more than one namespace, but not which ones. For example: user=> (apropos "replace") It would be nice if the returned symbols could indicate the namespace, either always, or if the found symbol is not in the current namespace. |
| Comments |
| Comment by Andy Fingerhut [ 04/Apr/13 8:25 PM ] |
|
Path clj-1191-patch-v1.txt enhances apropos to put a namespace/ qualifier before every symbol found that is not in the current namespace ns. It also finds the shortest namespace alias if there is more than one. Examples of output with patch: user=> (apropos "replace") user=> (require '[clojure.string :as str]) user=> (in-ns 'clojure.string) |
| Comment by Colin Jones [ 05/Apr/13 1:34 PM ] |
|
+1 apropos as it already stands is quite helpful for already-referred vars, but not for vars that are only in other nses. This update includes the information someone would need to further investigate the output. |
[CLJ-1190] Javadoc for public Java API Created: 03/Apr/13 Updated: 03/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | Release 1.6 |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Stuart Halloway | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
We should publish javadoc for http://dev.clojure.org/jira/browse/CLJ-1188.
This ticket should wait until |
[CLJ-1189] Map-destructuring :or fumble needs compiler warning Created: 31/Mar/13 Updated: 31/Mar/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Phill Wolf | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Here is a map-destructuring blunder that I wish the compiler warned about: (defn server It would be splendid to get a warning that :or keys that are not symbols being bound have no effect. The incomplete code snippet above comes from Pedestal.service 0.1.0. Here is a complete one-line example with the coding error: user> (defn picnic [{botulism :botulism :or {:botulism 6}}] botulism) |
[CLJ-1187] Clojure loses quoted metdata on empty literals Created: 22/Mar/13 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5, Release 1.6 |
| Fix Version/s: | Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Nicola Mometto | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Vetted |
| Description |
|
user=> (meta '^:foo []) while This bug propagates to ^:const vars: |
| Comments |
| Comment by Nicola Mometto [ 22/Mar/13 2:12 PM ] |
|
After patch: user=> (meta '^:foo []) |
| Comment by Stuart Halloway [ 29/Mar/13 6:13 AM ] |
|
I believe the title should read "Clojure loses quoted metdata on empty literals". |
| Comment by Stuart Halloway [ 29/Mar/13 6:16 AM ] |
|
At first glance, the implementation looks wrong in that it blocks non-IObjs ever getting to EmptyExpr. Probably all persistent collections are IObjs, but would not want to bake this in. |
| Comment by Nicola Mometto [ 29/Mar/13 7:00 AM ] |
|
You're right, I've updated my patch, it should work as expected now |
| Comment by Andy Fingerhut [ 04/Apr/13 9:44 PM ] |
|
Nicola: Your updated patch 001-CLJ-1187.patch dated Mar 29, 2013 gives syntax errors when I try to compile it. |
| Comment by Nicola Mometto [ 05/Apr/13 9:06 AM ] |
|
Oh, the irony, I messed up some parentheses writing java. Sorry for it, here's the correct patch, it applies on upstream/master. |
[CLJ-1185] `reductions should respect `reduced Created: 16/Mar/13 Updated: 10/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Brandon Bloom | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
This returns 16: (reduce (fn [acc x]
(let [x' (* x x)]
(if (> x' 10)
(reduced x')
x')))
(range))
But replacing `reduce with `reductions will never terminate: (reductions (fn [acc x]
(let [x' (* x x)]
(if (> x' 10)
(reduced x')
x')))
(range))
This is because `reductions ignores 'clojure.lang.Reduced, it never tests for `reduced? I know that I only just discovered the `reduced, function, but `reductions is a big part of my debugging process, so it's unfortunate that they don't work together. |
| Comments |
| Comment by Brandon Bloom [ 16/Mar/13 6:10 PM ] |
|
Attaching patch |
[CLJ-1182] Regexp are never equal Created: 12/Mar/13 Updated: 13/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Christian Fortin | Assignee: | Omer Iqbal |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | bug | ||
| Attachments: |
|
| Patch: | Code |
| Approval: | Triaged |
| Description |
|
The following (= #"asd" #"asd") will return false in CLJ, even if they are the same. Consequently, everything with a regexp in it (lists, vectors, maps...) will never be equal. It seems to have been fixed for CLJS, but not for CLJ. |
| Comments |
| Comment by Omer Iqbal [ 12/Mar/13 4:08 PM ] |
|
added an implementation for the equiv method if both args are java.util.regex.Pattern |
| Comment by Andy Fingerhut [ 12/Mar/13 5:54 PM ] |
|
Omer, could you also include in your patch a few test cases? At least one that validates that two regex's that should be equal, are equal, and another that two regex's that should be different, are non-equal. Preferably the first of those tests should fail with the existing Clojure code, and pass with your changes. |
| Comment by Omer Iqbal [ 13/Mar/13 5:39 AM ] |
|
I updated the patch with some tests. Hope I added them in the correct file. I also changed the implementation a bit, by instead of adding another implementation of equiv with a different signature, checking the type of the Object in the equiv method with signature (Object k1, Object k2). |
| Comment by Andy Fingerhut [ 13/Mar/13 1:04 PM ] |
|
All comments here refer to the patch named fix-CLJ-1182.diff dated Mar 13, 2013. The location for the new tests looks reasonable. However, note that your new patch has your old changes plus some new ones, not just the new ones. In particular, the new signature for equiv is still in your latest patch. You should start from a clean pull of the latest Clojure master and make only the changes you want when creating a patch, not build on top of previous changes you have made. Also, there are several whitespace-only changes in your patch that should not be included. |
| Comment by Omer Iqbal [ 13/Mar/13 1:39 PM ] |
|
I uploaded a clean patch, removing the whitespace diff and only adding the latest changes. Thanks for clarifying the workflow! |
| Comment by Stuart Halloway [ 29/Mar/13 5:46 AM ] |
|
I am recategorizing this as an enhancement, because if this is a bug it is a bug in Java – the Java Patterns class documents being immutable, but apparently does not implement .equals. Other recent "make Clojure more complicated to work around problems in Java" patches have been rejected, and I suspect this one will be too, because it might impact the performance of equality everywhere. |
| Comment by Stuart Halloway [ 12/Apr/13 9:04 AM ] |
|
At first pass, Rich and I both believe that, as regex equality is undecidable, that Java made the right choice in using identity for equality, that this ticket should be declined, and the ClojureScript should revert to match. But leaving this ticket open for now so that ClojureScript dev can weigh in. |
| Comment by Michael Drogalis [ 12/Apr/13 9:32 AM ] |
|
What do you mean when you say "undecidable"? |
| Comment by Alexander Redington [ 12/Apr/13 10:03 AM ] |
|
If Regex instances were interned by the reader, but still used identity for equality, then code like (= #"abc" #"abc") would return true, but it wouldn't diverge in the definition of equality for regular expressions between Java and Clojure. |
| Comment by Fogus [ 12/Apr/13 10:13 AM ] |
|
Undecidable means that for any given regular expression, there is no single way to write it. For example #"[a]" #"a" both match the same strings, but are they the same? Maybe. But how can we decide if /any/ given regular expression matches all of the same strings as any other? The answer is, you can't. Java does provide a Pattern#pattern method that returns the string that was used to build it, but I'm not sure if that could/should be used as a basis for equality given the potential perf hit. |
| Comment by Herwig Hochleitner [ 12/Apr/13 10:31 AM ] |
|
I posted in Stu's thread: https://groups.google.com/d/topic/clojure-dev/OTPNJQbPtds/discussion |
| Comment by Michael Drogalis [ 12/Apr/13 10:32 AM ] |
|
That makes sense to me. Thanks Fogus. |
| Comment by Herwig Hochleitner [ 12/Apr/13 9:42 PM ] |
|
From my post to the ml thread, it might not be entirely clear, why I don't think we should implement equality for host regexes: It would involve parsing and would leave a lot of room for errors and platform-idiosycracies to leak. And it would be different for every platform. As Alexander said, I also think this ticket could be resolved by interning regex literals, akin to keywords. That, however, would warrant a design page first, because there are tradeoffs to be made about how far the interning should go. |
| Comment by Rich Hickey [ 13/Apr/13 8:51 AM ] |
|
Why are we spending time on this? Where is the problem statement? Does someone actually need this for a real world purpose not solved by using regex strings as keys? |
| Comment by Michael Drogalis [ 13/Apr/13 9:13 PM ] |
|
It was prompted as a matter of consistency, which I think is valid. I can't think of a good reason to use regex's as keys though. |
[CLJ-1177] clojure.java.io/resource and non-ASCII characters Created: 07/Mar/13 Updated: 10/Mar/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Trevor Wennblom | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | bug, enhancement | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
clojure.java.io/resource corrupts path containing UTF-8 characters without issuing warning. user=> (System/getProperty "java.runtime.version") "1.8.0-ea-b79" user=> (clojure-version) "1.5.0" user=> (System/getProperty "user.dir") "/dir/déf" user=> (clojure.java.io/resource "myfile.txt") #<URL file:/dir/d%c3%a9f/resources/myfile.txt> user=> (slurp (clojure.java.io/resource "myfile.txt") :encoding "UTF-8") FileNotFoundException /dir/déf/resources/myfile.txt (No such file or directory) java.io.FileInputStream.open (FileInputStream.java:-2) |
| Comments |
| Comment by Andy Fingerhut [ 08/Mar/13 12:10 AM ] |
|
Below is a workaround, at least. I don't know, but perhaps the as-file method for URLs in io.clj of Clojure, the part that converts %hh sequences to a character with code point in the range 0 through 255, is at least partly at fault here. I don't know right now if it is possible to modify that code to handle the general case of whatever character encoding munging is going on here to when .getResource creates the URL object. clojure.java.io/resource is documented to return a Java object of type java.net.URL, which seems like it does %hh escaping of many characters. Reference [1] to a Java bug from 2001 where a Java user was surprised by the then-recent change in behavior of the getResource method [2]. Doing a little searching I found this StackOverflow question [3], which has what might be a workaround. I tried it on my Mac OS X 10.6 system running JDK 1.6 and it seemed to work: (slurp (.getContent (clojure.java.io/resource "abcÃd/foo.txt"))) That getContent is a method for class java.net.URL [4] [1] http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4466485 |
| Comment by Trevor Wennblom [ 08/Mar/13 9:56 AM ] |
|
Hi Andy, Thanks for the background and suggestions, that's very helpful. I'm gradually learning Clojure with no Java experience. In this case I was searching for the preferred Clojure way to access items in directories declared under :resource-paths in a Leiningen project.clj file. Perhaps clojure.java.io/resource isn't the best way to do this as it's possibly too tied to the expectation for a URI instead of a more general IRI. You're suggested workaround did work for my use case: (slurp (.getContent (clojure.java.io/resource "abcÃd/foo.txt"))) but hopefully there would be more native/direct Clojure way to accomplish the same eventually. I don't know if java.net.IDN would be useful internally as a fix in clojure.java.io/resource — I'm assuming not since it wasn't added until Java 6.[1] user=> (import 'java.net.IDN) java.net.IDN user=> (java.net.IDN/toASCII "/dir/déf") "xn--/dir/df-gya" user=> (java.net.IDN/toUnicode "xn--/dir/df-gya") "/dir/déf" [1]: http://docs.oracle.com/javase/6/docs/api/java/net/IDN.html |
| Comment by Andy Fingerhut [ 08/Mar/13 1:30 PM ] |
|
Patch clj-1177-patch-v1.txt dated Mar 8 2013 is an attempt to solve this issue, in what I think may be a correct way. As specified in RFC 3986, when taking a Unicode string and making a URL of it, it should be encoded in UTF-8 and then each individual byte is subject to the %HH hex encoding. This patch reverses that to turn URLs into file names. Tested on Mac OS X 10.6 with a command line like this (it doesn't work without the -Dfile.encoding=UTF-8 option on my Mac, probably because the default encoding is MacRoman): % java -cp clojure.jar:path/to/resource -Dfile.encoding=UTF-8 clojure.main |
[CLJ-1176] clojure.repl/source fails when *read-eval* bound to :unknown Created: 06/Mar/13 Updated: 04/May/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Tim McCormack | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Approval: | Vetted |
| Description |
|
clojure.repl/source is broken in Clojure 1.5.0 when *read-eval* is bound to :unknown, since source-fn reads without binding. Reproduce:
Expected: Source of drop-last. Actual: RuntimeException Reading disallowed - *read-eval* bound to :unknown |
| Comments |
| Comment by Tim McCormack [ 06/Mar/13 4:04 PM ] |
|
The attached patch just binds *read-eval* to true inside source-fn. |
| Comment by Stuart Halloway [ 29/Mar/13 6:24 AM ] |
|
Note: Allowing this implies that you trust the data on your classpath. If there are reasons somebody might not, we should reject this patch and people will have to be explicit when calling source. |
| Comment by Tim McCormack [ 29/Mar/13 6:37 AM ] |
|
Ugh, that's a fair point when it comes to sandboxing. I'll check with the owners of clojurebot and lazybot. |
| Comment by Tim McCormack [ 04/May/13 10:40 PM ] |
|
I haven't come up with any scenarios where this is problematic, and I haven't heard anything back from the bot owners. As for sandboxing, clojure.repl can easily be excluded. |
[CLJ-1175] NPE in clojure.lang.Delay/deref Created: 06/Mar/13 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Alan Malloy | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 3 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Vetted |
| Description |
|
If a Delay wraps a function which throws an exception, then forcing that delay multiple times causes behavior which is, to me at least, surprising and unexpected: the first time it is forced, the expected exception is thrown; but after that it will behave as if all locals the expression refers to are nil. This can manifest in multiple ways, depending on the expression being delayed: ;; calling a local as a function causes an NPE inside clojure.lang.Delay (let [f #(/ 1 0) d (delay (f))] [(try (force d) (catch Exception e e)) (try (force d) (catch Exception e e))]) [#<ArithmeticException java.lang.ArithmeticException: Divide by zero> #<NullPointerException java.lang.NullPointerException>] ;; if nil is a valid value, this can cause subsequent forces to "succeed" ;; even though the first fails as it should (let [x (java.util.Date.) d (delay (seq x))] [(try (force d) (catch Exception e e)) (try (force d) (catch Exception e e))]) [#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.util.Date> nil] The reason for this is that clojure.core/delay creates a ^:once function, promising to call it only once, so that the compiler can do locals-clearing on its lexical closure. However, when an exception is thrown the Delay object is left thinking it has never called the function, so when it is forced again it calls the function again, breaking its promise to the compiler and causing the function to run after its locals have been cleared. In fact, once we realize that locals-clearing is involved, we can make the delay behave differently the first N times it is forced, instead of only the first time, by constructing an expression which throws an exception before using all of its locals: (let [x (java.util.Date.)
y (Long. 1)
d (delay (let [y (seq y)]
(cons (seq x) y)))]
[(try (force d)
(catch Exception e e))
(try (force d)
(catch Exception e e))
(try (force d)
(catch Exception e e))])
[#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Long>
#<IllegalArgumentException java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.util.Date>
(nil)]
I'm not sure what the right fix for this issue is: perhaps the best choice is even to leave it alone, and just document that delay's behavior is undefined if the expression throws an exception. However, I propose making the Delay remember the first exception that was thrown, and rethrow it on subsequent force attempts. This makes sense, in a way: the "result" of the expression was this exception e being thrown, and so this should happen every time. It might be preferable to have the Delay retry the expression until it succeeds, but I don't believe this is possible without abandoning locals-clearing, which would cause perfectly-valid delays to now run out of memory, holding onto no-longer-needed locals just in case the expression needs to retry at some later date. So I've attached a patch that causes Delay to rethrow the original exception, and a test for that behavior, which of course fails if the change to Delay is not made. |
[CLJ-1172] Cross-linking between clojure.lang.Compiler and clojure.lang.RT Created: 28/Feb/13 Updated: 23/Mar/13 |
|
| Status: | Reopened |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Yegor Bugayenko | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
version 1.5.0-RC17 |
||
| Description |
|
This is my code (an example): import clojure.lang.Compiler;
import clojure.lang.RT;
import clojure.lang.Var;
Compiler.load("(+ 5 %)");
Var foo = RT.var("bar", "foo");
Object result = foo.invoke(10);
assert result.toString().equals("15");
This is what I'm getting: ava.lang.ExceptionInInitializerError at clojure.lang.Compiler.<clinit>(Compiler.java:47) at foo.main(Main.java:75) Caused by: java.lang.NullPointerException at clojure.lang.RT.baseLoader(RT.java:2043) at clojure.lang.RT.load(RT.java:417) at clojure.lang.RT.load(RT.java:411) at clojure.lang.RT.doInit(RT.java:447) at clojure.lang.RT.<clinit>(RT.java:329) ... 36 more The same code worked just fine with version 1.4. Looks like Compiler is using RT and RT is using Compiler, both statically. |
| Comments |
| Comment by Yegor Bugayenko [ 04/Mar/13 11:40 AM ] |
|
I cross-posted this question to SO: http://stackoverflow.com/questions/15207596 |
| Comment by Yegor Bugayenko [ 05/Mar/13 12:04 AM ] |
|
calling RT.init() before Compiler.load() solves the problem |
| Comment by Andy Fingerhut [ 05/Mar/13 4:17 AM ] |
|
Yegor, do you consider it OK to close this ticket as not being a problem, or at least one with a reasonable workaround? |
| Comment by Yegor Bugayenko [ 05/Mar/13 1:11 PM ] |
|
Yes, of course. Let's close it. |
| Comment by Andy Fingerhut [ 05/Mar/13 6:14 PM ] |
|
Ticket submitter agrees that this is not an issue, or that there is a reasonable workaround. |
| Comment by Andy Fingerhut [ 13/Mar/13 12:58 AM ] |
|
This issue came up again on the Clojure group. https://groups.google.com/forum/?hl=en_US&fromgroups=#!topic/clojure/2xdLNMb9yyQ I did some testing, and the issue did not exist in Clojure 1.5.0-RC3 and before, and it has existed since 1.5.0-RC4. There was only one commit between those two points: https://github.com/clojure/clojure/commit/9b80a552fdabeabdd93951a625b55ae49c2f8d83 Maybe this new behavior is an intended consequence of that change. I don't know. In any case, it seems like perhaps the "No need to call RT.init() anymore" message might be outdated? |
| Comment by Andy Fingerhut [ 13/Mar/13 12:59 AM ] |
|
Reopening since it came up again, and there is some more info known about the issue. I'll let someone who knows more about the issue decide whether to close it. |
| Comment by Edward [ 23/Mar/13 10:31 AM ] |
|
Doing this RT.load("clojure/core"); at the top works avoids the message from RT.init() |
[CLJ-1169] Add filename and line number to defn parameter declaration error Created: 22/Feb/13 Updated: 10/Mar/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4, Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Andrei Kleschinski | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Environment: |
Windows |
||
| Attachments: |
|
| Patch: | Code |
| Description |
|
When mistyping parameter list in defn declaration, e.g. (defn test error message shows name of parameter (without quotes), but not function name, filename or line number: Exception in thread "main" java.lang.IllegalArgumentException: Parameter declaration some-error should be a vector |
| Comments |
| Comment by Andrei Kleschinski [ 22/Feb/13 5:39 AM ] |
|
Proposed patch for issue Also patch adds quotes around invalid symbol name in error message to make them more distinguishable from rest of message. |
| Comment by Andy Fingerhut [ 01/Mar/13 9:32 AM ] |
|
Patch 0001-CLJ-1169-proposed-patch.patch dated Feb 22 2013 causes several tests to fail. Run "./antsetup.sh" then "ant" to see which ones (or "mvn package"). |
| Comment by Andrei Kleschinski [ 01/Mar/13 10:25 AM ] |
|
Fix for failed unit-tests |
[CLJ-1162] Error Message when calling deref on a non-IDeref is unhelpful Created: 12/Feb/13 Updated: 01/Mar/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Julian Birch | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Found this on ubuntu, lein 2, Clojure 1.5 snapshot, but it's obvious from inspection |
||
| Description |
|
If you just type "@1" is the repl, on previous versions you'll get an error that Long cannot be cast to IDeref. In 1.5, the error message is that it cannot be cast to java.util.concurrent.Future. This is because it assumes that anything that isn't an IDeref is automatically a Future. The deref method should generate a custom error stating that the type you've passed in is neither an IDeref nor a Future. |
[CLJ-1161] sources jar has bad versions.properties resource Created: 11/Feb/13 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4, Release 1.5 |
| Fix Version/s: | Release 1.5, Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Steve Miner | Assignee: | Stuart Sierra |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | patch | ||
| Attachments: |
|
| Patch: | Code |
| Approval: | Vetted |
| Description |
|
The "sources" jar (at least since Clojure 1.4 and including 1.5 RC) has a bad version.properties file in it. The resource clojure/version.properties is literally: version=${version} The regular Clojure jar has the correct version string in that resource. I came across a problem when I was experimenting with the sources jar (as used by IDEs). I naively added the sources jar to my classpath, and Clojure died on start up. The bad clojure/versions.properties file was found first, which led to a parse error as the clojure version was being set. |
| Comments |
| Comment by Steve Miner [ 11/Feb/13 10:04 AM ] |
|
Notes from the dev mailing list: The "sources" JAR is generated by another Maven plugin, configured here: The simplest solution might be to just exclude the file from the sources jar. It looks like maven-source-plugin has an excludes option which would do the trick: http://maven.apache.org/plugins/maven-source-plugin/jar-mojo.html#excludes |
[CLJ-1159] clojure.java.io/delete-file doesn't return the status of the deletion(true/false) Created: 10/Feb/13 Updated: 10/Feb/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | AtKaaZ | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | delete-file, evil, or | ||
| Environment: |
any |
||
| Description |
|
initially reported it here(somehow): Basically clojure.java.io/delete-file doesn't ever return false (even when silently is true, it returns the value of silently), it's due to how it's implemented - but it's obvious from the code, so I'll stop here. Thanks. PS: this is what I'm using as my current workaround: I'm sure you guys can find a better way, but as a clojure newbie(really!) that's what I have. |
| Comments |
| Comment by AtKaaZ [ 10/Feb/13 2:01 PM ] |
|
I kinda just realized it affects all versions since and including 1.2, because it appears that its implementation was the same since then. If it's not meant to return the result of the delete, maybe it should specifically return nil and/or the doc say something? |
| Comment by Sean Corfield [ 10/Feb/13 2:21 PM ] |
|
As noted in a thread on the Clojure ML, you can pass a known value in the second argument position to detect a delete that failed: (clojure.java.io/delete-file some-file :not-deleted) This returns true on success and :not-deleted on failure. However the docstring could be better worded to make that intention clear. Perhaps: Delete file f. Return true if it succeeds. If silently is nil or false, raise an exception if it fails, else return the value of silently. |
[CLJ-1152] PermGen leak in multimethods and protocol fns Created: 30/Jan/13 Updated: 30/Jan/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Chouser | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Description |
|
There is a PermGen memory leak that we have tracked down to protocol methods and multimethods called inside an eval, because of the caches these methods use. The problem only arises when the value being cached is an instance of a class (such as a function or reify) that was defined inside the eval. Thus extending IFn or dispatching a multimethod on an IFn are likely triggers. My fellow LonoClouder, Jeff Dik describes how to reproduce and work around the problem: The easiest way that I have found to test this is to set "-XX:MaxPermSize" to a reasonable value so you don't have to wait too long for the PermGen space to fill up, and to use "-XX:+TraceClassLoading" and "-XX:+TraceClassUnloading" to see the classes being loaded and unloaded. leiningen project.clj (defproject permgen-scratch "0.1.0-SNAPSHOT" :dependencies [[org.clojure/clojure "1.5.0-RC1"]] :jvm-opts ["-XX:MaxPermSize=32M" "-XX:+TraceClassLoading" "-XX:+TraceClassUnloading"]) You can use lein swank 45678 and connect with slime in emacs via M-x slime-connect. To monitor the PermGen usage, you can find the Java process to watch with "jps -lmvV" and then run "jstat -gcold <PROCESS_ID> 1s". According to the jstat docs, the first column (PC) is the "Current permanent space capacity (KB)" and the second column (PU) is the "Permanent space utilization (KB)". VisualVM is also a nice tool for monitoring this. Multimethod leakEvaluating the following code will run a loop that eval's (take* (fn foo [])). multimethod leak (defmulti take* (fn [a] (type a))) (defmethod take* clojure.lang.Fn [a] '()) (def stop (atom false)) (def sleep-duration (atom 1000)) (defn run-loop [] (when-not @stop (eval '(take* (fn foo []))) (Thread/sleep @sleep-duration) (recur))) (future (run-loop)) (reset! sleep-duration 0) In the lein swank session, you will see many lines like below listing the classes being created and loaded. [Loaded user$eval15802$foo__15803 from __JVM_DefineClass__] [Loaded user$eval15802 from __JVM_DefineClass__] These lines will stop once the PermGen space fills up. In the jstat monitoring, you'll see the amount of used PermGen space (PU) increase to the max and stay there. - PC PU OC OU YGC FGC FGCT GCT 31616.0 31552.7 365952.0 0.0 4 0 0.000 0.129 32000.0 31914.0 365952.0 0.0 4 0 0.000 0.129 32768.0 32635.5 365952.0 0.0 4 0 0.000 0.129 32768.0 32767.6 365952.0 1872.0 5 1 0.000 0.177 32768.0 32108.2 291008.0 23681.8 6 2 0.827 1.006 32768.0 32470.4 291008.0 23681.8 6 2 0.827 1.006 32768.0 32767.2 698880.0 24013.8 8 4 1.073 1.258 32768.0 32767.2 698880.0 24013.8 8 4 1.073 1.258 32768.0 32767.2 698880.0 24013.8 8 4 1.073 1.258 A workaround is to run prefer-method before the PermGen space is all used up, e.g. (prefer-method take* clojure.lang.Fn java.lang.Object)
Then, when the used PermGen space is close to the max, in the lein swank session, you will see the classes created by the eval'ing being unloaded. [Unloading class user$eval5950$foo__5951] [Unloading class user$eval3814] [Unloading class user$eval2902$foo__2903] [Unloading class user$eval13414] In the jstat monitoring, there will be a long pause when used PermGen space stays close to the max, and then it will drop down, and start increasing again when more eval'ing occurs. - PC PU OC OU YGC FGC FGCT GCT 32768.0 32767.9 159680.0 24573.4 6 2 0.167 0.391 32768.0 32767.9 159680.0 24573.4 6 2 0.167 0.391 32768.0 17891.3 283776.0 17243.9 6 2 50.589 50.813 32768.0 18254.2 283776.0 17243.9 6 2 50.589 50.813 The defmulti defines a cache that uses the dispatch values as keys. Each eval call in the loop defines a new foo class which is then added to the cache when take* is called, preventing the class from ever being GCed. The prefer-method workaround works because it calls clojure.lang.MultiFn.preferMethod, which calls the private MultiFn.resetCache method, which completely empties the cache. Protocol leakThe leak with protocol methods similarly involves a cache. You see essentially the same behavior as the multimethod leak if you run the following code using protocols. protocol leak (defprotocol ITake (take* [a])) (extend-type clojure.lang.Fn ITake (take* [this] '())) (def stop (atom false)) (def sleep-duration (atom 1000)) (defn run-loop [] (when-not @stop (eval '(take* (fn foo []))) (Thread/sleep @sleep-duration) (recur))) (future (run-loop)) (reset! sleep-duration 0) Again, the cache is in the take* method itself, using each new foo class as a key. A workaround is to run -reset-methods on the protocol before the PermGen space is all used up, e.g. (-reset-methods ITake) This works because -reset-methods replaces the cache with an empty MethodImplCache. |
| Comments |
| Comment by Chouser [ 30/Jan/13 9:10 AM ] |
|
I think the most obvious solution would be to constrain the size of the cache. Adding an item to the cache is already not the fastest path, so a bit more work could be done to prevent the cache from growing indefinitely large. That does raise the question of what criteria to use. Keep the first n entries? Keep the n most recently used (which would require bookkeeping in the fast cache-hit path)? Keep the n most recently added? |
[CLJ-1149] Unhelpful error message from :use (and use function) when arguments are malformed Created: 17/Jan/13 Updated: 17/Jan/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4, Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Sean Corfield | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
the following exception happens when you have something like this(bad): (ns runtime.util-test as opposed to any of these(correct): (ns runtime.util-test (ns runtime.util-test and the exception is: Note that this is similar to the equally unhelpful message shown in http://dev.clojure.org/jira/browse/CLJ-1140 although that is a different root cause. Probably best to enhance the `use` function to validate its arguments before trying to apply hash-map? |
[CLJ-1148] adds docstring support to defonce, and stops it from stomping existing metadata Created: 17/Jan/13 Updated: 17/Jan/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Joe Gallo | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
Two issues here: 1) defonce doesn't support docstrings, although def does, so it would be nice to bring the two in line with each other 2) defonce can stomp metadata, like this: (defonce ^:private foo 5) |
[CLJ-1147] Threading macro (->) does not permit inline function declarations Created: 14/Jan/13 Updated: 19/May/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Stephen Nelson | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
(-> [1 2 3] (fn [args] apply + args)) CompilerException java.lang.Exception: Unsupported binding form: 1, compiling:(NO_SOURCE_PATH:1:13) The expression is expanded to: (fn [1 2 3] [args] apply + args) If this is intended behaviour then at the least the compiler error message is confusing. It would be preferable if the -> macro checked for (fn..) before treating a form as a sequence and injecting the argument. |
| Comments |
| Comment by Andy Fingerhut [ 15/Jan/13 12:56 AM ] |
|
Note that this works as you might have hoped: (-> [1 2 3] ((fn [args] (apply + args)))) because it expands into: ((fn [args] (apply + args)) [1 2 3]) Your suggestion that -> check for (fn ...) before treating it as a sequence and injecting the argument leaves open the question: Why only (fn ...) should be treated specially? Why not (let ...), (for ...), (doseq ...), etc? And if you go that far, how do you decide what should be allowed and what not? |
| Comment by Gabriel Horner [ 17/May/13 2:56 PM ] |
|
I agree with Andy, that it's not realistic suggestion to check for fn,let,etc. Perhaps a doc fix would help here but I'm not sure if we just want to call out (fn ...). I'd recommend closing this unless Stephen speaks up. |
| Comment by Stephen Nelson [ 19/May/13 10:29 PM ] |
|
I'm happy with Andy's synopsis of the problem, and it's reasonable not to change the behaviour of the threading macro specifically for (fn..). However, this is a mistake that I'm sure many others make/have made and it's hard to diagnose what is going wrong without dumping interpreted form – hardly a reasonable expectation for a novice user. Before closing this issue, I'd like to see improved failure reporting, such as causing the threading macro to throw a compile error or warning if passed a raw (unwrapped) function declaration (are there legitimate use cases this would affect?). |
[CLJ-1141] Allow pre and post-conditions in defprotocol and deftype macros Created: 02/Jan/13 Updated: 07/Jan/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Alexander Kiel | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Environment: |
Dos not matter. |
||
| Description |
|
The fn special form and the defn macro allow pre- and post-conditions. It would be nice if one could use that conditions also in method declarations of the defprotocol and deftype macro. Currently I use the extend function as workaround where one can specify the methods using a map of keyword-name and fn special form. |
| Comments |
| Comment by Michael Drogalis [ 06/Jan/13 6:22 PM ] |
|
Using :pre and :post, IMO, isn't a good idea. Handling assertions is a two part game. The mechanism needs to account for both detection and reaction, and the latter is missing. This isn't a perfect work-around, as it's a little verbose, but using Dire might work better than using extend. In addition, you get the "reaction" functionality that's missing from :pre and :post Example for protocol preconditions: https://gist.github.com/4471276 |
| Comment by Alexander Kiel [ 07/Jan/13 11:52 AM ] |
|
@Michael I read your gist and the README of Dire. I think the supervision concept of Erlang has it's places but I don't like it for pre- and post-conditions. For me, such conditions have two proposes:
To support my first point, your pre- and post-conditions are just lexical too far away from the actual function definition. For the second point: I think in the case of violations the program should just crash. One could maybe wrap some part of the program with one of your exception supervisors handling an AssertionError. But I don't think that handling pre- and post-condition violations for individual functions is a good thing. |
| Comment by Michael Drogalis [ 07/Jan/13 5:28 PM ] |
|
@Alexander Indeed, your points are correct. Dire is meant to be exactly what you described. Lexically removed from application logic, and opportunity to recover from crashing. That was my best shot at aiding your needs quickly, anyway. |
[CLJ-1138] data-reader returning nil causes exception Created: 22/Dec/12 Updated: 14/Feb/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4, Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Steve Miner | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | reader | ||
| Environment: |
clojure 1.5 beta2, Mac OS X 10.8.2, java version "1.6.0_37" |
||
| Description |
|
If a data-reader returns nil, the reader throws java.lang.RuntimeException: No dispatch macro... The error message implies that there is no dispatch macro for whatever the first character of the tag happens to be. Here's a simple example: (binding [*data-readers* {'f/ignore (constantly nil)}] (read-string "#f/ignore 42 10")) RuntimeException No dispatch macro for: f clojure.lang.Util.runtimeException (Util.java:219) |
| Comments |
| Comment by Steve Miner [ 22/Dec/12 9:43 AM ] |
|
clj-1138-allow-data-reader-to-return-nil-instead-of-throwing.patch allows a data-reader to return nil instead of throwing. Does sanity check that possible tag or record isJavaIdentifierStart(). Gives better error message for special characters that might actually be dispatch macros (rather than assuming it's a tagged literal). |
| Comment by Steve Miner [ 22/Dec/12 10:06 AM ] |
|
clj-1138-data-reader-return-nil-for-no-op.patch allows a data-reader returning nil to be treated as a no-op by the reader (like #_). nil is not normally a useful value (actually it causes an exception in Clojure 1.4 through 1.5 beta2) for a data-reader to return. With this patch, one could get something like a conditional feature reader using data-readers. |
| Comment by Steve Miner [ 22/Dec/12 10:26 AM ] |
|
clj-1138-allow-data-reader-to-return-nil-instead-of-throwing.patch is the first patch to consider. It merely allows nil as a value from a data-reader and returns nil as the final value. I think it does what was originally intended for dispatch macros, and gives a better error message in many cases (mostly typos). The second patch, clj-1138-data-reader-return-nil-for-no-op.patch, depends on the other being applied first. It takes an extra step to treat a nil value returned from a data-reader as a no-op for the reader (like #_). |
| Comment by Steve Miner [ 23/Dec/12 11:52 AM ] |
|
It turns out that you can work around the original problem by having your data-reader return '(quote nil) instead of plain nil. That expression conveniently evaluates to nil so you can get a nil if necessary. This also works after applying the patches so there's still a way to return nil if you really want it. (binding [*data-readers* {'x/nil (constantly '(quote nil))}] (read-string "#x/nil 42")) |
| Comment by Andy Fingerhut [ 07/Feb/13 9:20 AM ] |
|
Patch clj-1138-allow-data-reader-to-return-nil-instead-of-throwing.patch dated Dec 22 2012 still applies cleanly to latest master if you use the following command: % git am --keep-cr -s --ignore-whitespace < clj-1138-allow-data-reader-to-return-nil-instead-of-throwing.patch Without the --ignore-whitespace option, the patch fails only because some whitespace was changed in Clojure master recently. |
| Comment by Andy Fingerhut [ 13/Feb/13 11:24 AM ] |
|
OK, now with latest master (1.5.0-RC15 at this time), patch clj-1138-allow-data-reader-to-return-nil-instead-of-throwing.patch no longer applies cleanly, not even using --ignore-whitespace in the 'git am' command given above. Steve, if you could see what needs to be updated, that would be great. Using the patch command as suggested in the "Updating stale patches" section of http://dev.clojure.org/display/design/JIRA+workflow wasn't enough, so it should probably be carefully examined by hand to see what needs updating. |
| Comment by Steve Miner [ 14/Feb/13 12:21 PM ] |
|
I removed my patches. Things have changes recently with the LispReader and new EdnReader. |
[CLJ-1137] Metadata on a def gets evaluated twice Created: 21/Dec/12 Updated: 21/Dec/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Ghadi Shayban | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
Metadata on the symbol of a def special form is evaluated twice. (def ^{:foo (println "HA")} a []) prints out HA HA. Offending line is in Compiler$DefExpr, fixed. |
[CLJ-1134] star-directive in clojure.pprint/cl-format with an at-prefix ("~n@*") do not obey its specifications Created: 18/Dec/12 Updated: 26/Dec/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4, Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Jean Niklas L'orange | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | bug, pprint | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
The star-directive in clojure.pprint/cl-format with an at-prefix (~n@*) does not obey its specifications according to Common Lisp the Language, 2nd Edition. There are two bugs within ~n@* as of right now:
What (small set of) steps will reproduce the problem?Inside a clean Clojure repl, perform these steps: user=> (require '[clojure.pprint :refer [cl-format]]) nil user=> (cl-format nil "~D ~3@*~D" 0 1 2 3) "0 0" ;; Expected: "0 3" user=> (cl-format nil "~D~D~D~D ~@*~D" 0 1 2 3) "0123 1" ;; Expected: "0123 0" What is the expected output? What do you see instead?The expected output is "0 3" and "0123 0", but is "0 0" and "0123 1" as shown above. What version are you using?Tested on both 1.4.0 and 1.5.0-beta2, both have the defect described. Please provide any additional information below.The format strings which reproduces the problem has been compared with the format function from the Common Lisp implementations SBCL, CLisp and Clozure. All of them print the expected output. |
| Comments |
| Comment by Jean Niklas L'orange [ 18/Dec/12 9:28 PM ] |
|
Patch attached. It may be easier to read the changes the patch does from within JIRA instead from the commit message, so I've added it here: This solves two issues as specified by #CLJ-1134. Issue #1 is solved by doing a Issue #2 is handled by changing the default n-parameter to * depending on In addition, new tests have been appended to test_cl_format.clj to ensure the |
[CLJ-1133] Certain actions on mutable fields in deftype lead to very strange error messages Created: 18/Dec/12 Updated: 19/Dec/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Vladimir Matveev | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Archlinux x86_64, Windows 7 x86_64 |
||
| Description |
|
Consider the following code: (definterface Test (deftype TestImpl Its compilation fails with the following message: The following code works: (definterface Test (deftype TestImpl The only change here is that I have wrapped (dec x) form into (int) call. I understand that in fact the former code should not work anyway (or at least should not work as I have expected) because (dec) is defined as a call to clojure.lang.Numbers.dec(), which is overloaded for double, long and Object only (in fact, changing :tag int to :tag long in the first example allows the program to compile). However, the error message is completely uninformative and misleading; it also looks like that it is a consequence of compiler error. It is also not a problem of this concrete example; I found this error in more complex interface method implementation where (set!) call was right in the middle of its body. I'm using Clojure 1.4.0 and have experienced this problem on Archlinux x86_64 and Windows 7 x86_64. Full stack trace of the error, in case it would be helpful: java.lang.VerifyError: (class: test/TestImpl, method: fail signature: ()V) Expecting to find integer on stack, compiling |
| Comments |
| Comment by Vladimir Matveev [ 18/Dec/12 1:51 PM ] |
|
Shouldn't have set major priority; but I cannot edit issue again |
| Comment by Andy Fingerhut [ 19/Dec/12 1:20 AM ] |
|
Reduced priority to minor, since ticket creator could not do so themselves. |
[CLJ-1132] For record type Rec, (instance? Rec (map->Rec {...})) need not return true, though (instance? Rec (Rec. ...)) does. Created: 18/Dec/12 Updated: 18/Dec/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Christopher Genovese | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | constructor, defrecord | ||
| Environment: |
Apache Tomcat/6.0.24 JVM/1.6.0_26-b03 Linux 2.6.32-279.el6.x86_64 Clojure 1.4.0, Ring 1.1.6, Compojure 1.1.3, Lein-Ring Plugin 0.7.5 (for lein ring uberwar) |
||
| Attachments: |
|
| Description |
|
(defrecord Rec ...) (instance? Rec (Rec. ...)) ;=> true (.getClassLoader Rec) ;=> WebappClassLoader (delegate: false, repositories: /WEB-INF/classes/, parent: org.apache.catalina.loader.StandardClassLoader@790bc49d) The map->Rec delegates to the create method, which seems to be where the problem lies. The record namespace is AOT compiled, properly I think/hope, and the requisite classes I have attached a minimal web app that reproduces the problem and shows Again, I've only been able to reproduce the problem under Tomcat, |
[CLJ-1131] Importing a non-existent class causes an exception that does not fully identify the source file Created: 17/Dec/12 Updated: 17/May/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Howard Lewis Ship | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | feedback | ||
| Description |
|
I'm in the process of stripping out some OSGi support, and I missed one import. The exception identifies "init.clj", but I'd prefer to see the full path there, as I have a few different "init.clj" files in my overall project. :core-services:compileClojure Reflection warning, com/annadaletech/nexus/services/registry.clj:37 - call to unregisterAll can't be resolved. Reflection warning, com/annadaletech/nexus/services/registry.clj:131 - call to getConfiguration can't be resolved. Reflection warning, com/annadaletech/nexus/services/registry.clj:150 - call to getConfiguration can't be resolved. Exception in thread "main" java.lang.ClassNotFoundException: org.osgi.framework.ServiceRegistration, compiling:(init.clj:1) at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3387) at clojure.lang.Compiler.compile1(Compiler.java:7035) at clojure.lang.Compiler.compile1(Compiler.java:7025) at clojure.lang.Compiler.compile(Compiler.java:7097) at clojure.lang.RT.compile(RT.java:387) at clojure.lang.RT.load(RT.java:427) at clojure.lang.RT.load(RT.java:400) at clojure.core$load$fn__4890.invoke(core.clj:5415) at clojure.core$load.doInvoke(core.clj:5414) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invoke(core.clj:5227) at clojure.core$compile$fn__4895.invoke(core.clj:5426) at clojure.core$compile.invoke(core.clj:5425) at clojuresque.tasks.compile$main$fn__64.invoke(compile.clj:23) at clojuresque.cli$with_command_line_STAR_.invoke(cli.clj:92) at clojuresque.tasks.compile$main.doInvoke(compile.clj:6) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invoke(core.clj:601) at clojure.lang.Var.invoke(Var.java:419) at clojuresque.Driver.main(Driver.java:39) Caused by: java.lang.ClassNotFoundException: org.osgi.framework.ServiceRegistration |
| Comments |
| Comment by Gabriel Horner [ 17/May/13 3:56 PM ] |
|
While it's reasonable to want this for your case, having long path names in a stacktrace could be inconvenient for others. I'd recommend posting your desired change on the dev list - https://groups.google.com/forum/?fromgroups#!forum/clojure-dev . If they're ok with it, then I'd recommend submitting a patch. |
[CLJ-1130] Invoking a static method with the wrong number of arguments results in a NoSuchFieldException, rather than a proper message that the arguments could not be matched to the method Created: 17/Dec/12 Updated: 06/Jan/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Howard Lewis Ship | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | feedback | ||
| Description |
|
My code inadventently invoked a method that expected a single parameter, but passed no parameters. The exception: Exception in thread "main" java.lang.NoSuchFieldException: getService, compiling:(com/annadaletech/nexus/services/registry.clj:168) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6462) at clojure.lang.Compiler.analyze(Compiler.java:6262) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6443) at clojure.lang.Compiler.analyze(Compiler.java:6262) at clojure.lang.Compiler.access$100(Compiler.java:37) at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:5883) .... Caused by: java.lang.NoSuchFieldException: getService at java.lang.Class.getField(Class.java:1520) at clojure.lang.Compiler$StaticFieldExpr.<init>(Compiler.java:1180) at clojure.lang.Compiler$HostExpr$Parser.parse(Compiler.java:923) at clojure.lang.Compiler.analyzeSeq(Compiler.java:6455) ... 78 more That threw me for a bit; really, it looks like the compiler is attempting to access a field and invoke it as an IFn. However, a proper message would be "getService() requires 1 parameter, not 0" (or something to that effect). Even "invalid number of parameters for SmashRuntime/getService()" would be better. |
| Comments |
| Comment by Michael Drogalis [ 06/Jan/13 6:44 PM ] |
|
It looks like it's first trying to resolve a field by name, since field access with / is legal. For example: user=> (Integer/parseInt) user=> (Integer/MAX_VALUE) Would trying to resolve a method before a field fix this? |
[CLJ-1128] Improve merge-with Created: 13/Dec/12 Updated: 13/Dec/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Edward Tsech | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
Set a first map as an initial value for reduce to |
| Comments |
| Comment by Edward Tsech [ 13/Dec/12 1:36 PM ] |
|
Tests pass. |
| Comment by Andy Fingerhut [ 13/Dec/12 2:32 PM ] |
|
Edward, your patch replaces the expression (or m1 {}) with m1. It was changed from m1 to (or m1 {}) in a commit on Oct 16, 2008 with descriptive text "improved nil handling in merge, merge-with", so I am pretty sure it would be best to leave it as (or m1 {}). I believe the intent is to allow all but one of the map arguments to merge-with be nil, and everything will still work. The rest of the patch for avoiding one merge call seems sound to me. Your change would be even better at preserving any metadata on the first non-nil map in the list, if instead of calling with the first map, it called it with the first non-nil item of the list, and then the rest of the list after that. |
| Comment by Edward Tsech [ 13/Dec/12 5:41 PM ] |
|
I figured out that `reduce1` did pass a head of the list for me. I'm not sure about `(or m1 {})`. I don't see any problems which can happen. Probably behaviour of functions which are used internally was changed since 2008. (contains? nil :a) ;=> false I could write some tests for that. |
[CLJ-1124] for-as Created: 10/Dec/12 Updated: 10/Dec/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Yongqian Li | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
A common pattern in programming is building up some data structure step by step: In Python: [code] In an imperative for loop this is easy since we have easy access to the "current" data structure being built up. I propose the addition of a function for-as similar to as-> except the value of the last loop iteration is bound to the name. So we can write the above as: [code] An (un-optimized) implementation might be something like: [code] Note: reduce-for does not return a seq, instead it returns the result of the last loop body iteration. |
| Comments |
| Comment by Yongqian Li [ 10/Dec/12 11:31 PM ] |
|
(Fixed formatting) x = {0: 1}
for item in stuff:
x[item] = item * x.get(item - 1, 0)
(last (for-as [x {0 1}]
[item stuff]
(assoc x item (* item (get x (- item 1) 0)))))
(defmacro reduce-for [[res init] for-seq-exprs body-expr] `(reduce #(%2 %1) ~init (for ~for-seq-exprs (fn [~res] ~body-expr)))) (Someone please fix the formatting in above and delete this comment.) |
[CLJ-1122] Add contributing.md file to github repository (shows clear message on issues/pull request create form) Created: 09/Dec/12 Updated: 17/May/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | Release 1.6 |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Max Penet | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Approval: | Vetted |
| Description |
|
This adds a clear message when someone wants to create a pull request/issue and invites the user to read the contribution guidelines: see https://github.com/blog/1184-contributing-guidelines. The same thing could be done for all the clojure/* repositories. The content of the file is just a markdown version of http://clojure.org/contributing Preview here: https://github.com/mpenet/clojure/blob/aef170ca5eca1b71a2eb1ef320223d1277df0e5e/CONTRIBUTING.md |
| Comments |
| Comment by Stuart Halloway [ 02/Jan/13 6:31 AM ] |
|
Please change this to link to the definitive prose, so we don't have to maintain that in two places. |
| Comment by Max Penet [ 02/Jan/13 6:51 AM ] |
|
Feel free to correct the wording, I used something simple. |
| Comment by Gabriel Horner [ 17/May/13 9:04 AM ] |
|
Stu, he linked to clojure.org as you requested so I'm moving this along. |
[CLJ-1121] -> and ->> have unexpected behavior when combined with unusual macros Created: 06/Dec/12 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Gary Fredericks | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 4 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Vetted |
| Description |
|
My intuitive understanding of the classic threading macros is that the meaning of forms like (-> a b c) can be understood syntactically independent of the meaning of the symbols involved or the fact that the two threading macros are defined recursively. However the recursive definition breaks that expectation. After (macroexpand-1 (macroexpand-1 '(-> a b c))) => (c (-> a b)) c is now in control if it is a macro, and is now seeing the argument (-> a b) rather than (b a) as would be the case if we had written (c (b a)) originally. Admittedly I do not know of a realistic example where this is an important distinction (I noticed this when playing with a rather perverse use of ->> with macros from korma), but at the very least it means that the behavior of the threading macros isn't quite as easy to accurately explain as I thought it was. |
| Comments |
| Comment by Gary Fredericks [ 07/Dec/12 9:19 AM ] |
|
I just realized that my patch also implements CLJ-1086. |
| Comment by Stuart Halloway [ 22/Dec/12 9:48 AM ] |
|
Would be nice if tests also demonstrated that metadata is preserved correctly. |
| Comment by Gary Fredericks [ 26/Dec/12 8:16 PM ] |
|
New patch in response to stuarthalloway feedback. |
| Comment by Tim McCormack [ 09/Jan/13 6:47 PM ] |
|
This patch also prevents an infinite loop in the macroexpander when fed the following expression: (->> a b (->> c d)) Edit: Far simpler example. |
[CLJ-1120] Introduce ex-message and ex-cause to abstract away the platform in dealing with ExceptionInfo Created: 06/Dec/12 Updated: 21/Dec/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Michał Marczyk | Assignee: | Michał Marczyk |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
As described in the title. See |
| Comments |
| Comment by Michał Marczyk [ 06/Dec/12 6:23 AM ] |
|
The attached patch implements ex-message and ex-cause to work on arbitrary Throwables. |
[CLJ-1119] inconsistent behavior of lazy-seq w/ macro & closure on excptions Created: 03/Dec/12 Updated: 16/Dec/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Hank | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
lazy-seq seems to evaluate inconsistently when body includes a macro and throws and exception. 1st evalutation throws the exceptions, subsequent ones return empty sequence. demo code: (defn gen-lazy [] (def lazy (gen-lazy)) (try (try It should throw an exception both times but only does on 1st. Generally speaking an expression shouldn't evaluate to different things depending on whether it's been evaluated before. When removing the closure ... (defn gen-lazy [] ... or removing the when-let macro ... (defn gen-lazy [] It works i.e. consistently throws the exception, so seems to be some interaction between the closure and the macro at work here. This particular combination is used in the 'map' function. See also: https://groups.google.com/forum/?fromgroups=#!topic/clojure/Z3EiBUQ7Inc |
| Comments |
| Comment by Hank [ 03/Dec/12 4:26 AM ] |
|
N.B. The primary use case I have for this, in case it matters, is interrupting the evaluation of a 'map' expression in which the mapped fn is slow to evaluate (throwing an InterruptedException), because I am not interested in its result any more. Then later I re-evaluate it because I am interested in the result after all, however with above bug the lazy sequence terminates instead of recommencing where it left off. (UPDATE: This use case is similar to the kind of ersatz continuations that Jetty does (RetryRequest runtime exception) or even Clojure itself when barging STM transactions with the RetryEx exception.) |
| Comment by Hank [ 03/Dec/12 8:45 AM ] |
|
Related to CLJ-457 according to Christophe. His patch fixes this,too. |
| Comment by Hank [ 04/Dec/12 5:02 AM ] |
|
Sorry Christophe's patch doesn't work for me here. It avoids evaluating the LazySeq a second time by prematurely throwing an exception. However a LazySeq might evaluate properly the second time around b/c the situation causing the exception was transient. As per comment above an evaluation might get interrupted, throwing InterruptedException the first time around but not the second time. Also the observation with the closure and macro need explanation IMHO. |
| Comment by Hank [ 08/Dec/12 3:51 AM ] |
|
further insight: 'delay' exhibits the same behavior and is a more simple case to examine. the macro suspicion is a red herring: as demoed below it is actually the closed over variable magically turns to nil, the when-let macro simply turned that into a nil for the whole expression. (def delayed (let [a true] (delay (print "a=" a) (throw (Exception.))))) (try (print "delayed 1:") (force delayed) (catch Exception ex (println ex))) (try (print "delayed 2:") (force delayed) (catch Exception ex (println ex))) prints: delayed 1:a= true#<Exception java.lang.Exception> |
| Comment by Hank [ 09/Dec/12 1:31 AM ] |
|
The above leads to dodgy outcomes such as: The following expression leads to an Exception on 1st evaluation and to "w00t!" on subsequent ones. (def delayed (let [a true] (delay (if a (throw (Exception.)) "w00t!")))) Try it like this: (try (print "delayed 1:" ) (println (force delayed)) (catch Exception ex (println ex))) (try (print "delayed 2:") (println (force delayed)) (catch Exception ex (println ex))) Results in: This code shows that the problem is tied to the :once flag as suspected. (def test-once (let [a true] (^{:once true} fn* foo [] (println "a=" a) (throw (Exception.))))) Invoking the fn twice will show 'a' turning from 'true' to 'nil', try it like this: (try (print "test-once 1:") (test-once) (catch Exception ex (println ex))) (try (print "test-once 2:") (test-once) (catch Exception ex (println ex))) Results in: That doesn't happen when the ^{:once true} is removed. Now one could argue that above fn is invoked twice, which is exactly what one is not supposed to do when decorated with the :once flag, but I argue that an unsuccessful call doesn't count as invocation towards the :once flag. The delay and lazy-seq macros agree with me there as the resulting objects are not considered realized (as per realized? function) if the evaluation of the body throws an exception, and realization/evaluation of the body is therefore repeated on re-evaluation of the delay/lazy-seq. Try this using (realized? delayed) The :once flag affects this part of the compiler only. Some field is set to nil there in the course of a function invocation, for the good reason of letting the garbage compiler collect objects, however this should to be done after the function successfully completes only. Can this be changed? |
| Comment by Hank [ 16/Dec/12 4:02 AM ] |
|
A workaround for the case of the 'map' function as described in the 1st comment, works as this: The original map function, if you take out the cases for several colls, the performance enhancements for chunked seqs and forcing the coll argument to a seq, looks like this: (defn map [f s]
(lazy-seq
(cons (f (first s)) (map f (rest s)))))
In my workaround I evaluate f twice: (defn map [f s]
(lazy-seq
(f (first s))
(cons (f (first s)) (map f (rest s)))))
Because the downstream functions that are slow to evaluate are all of the deref kind that cache their result (more lazy-seqs, delays, futures, promises), the InterruptedException can only happen during the 1st evaluation, while the tail call optimization that sets closed-over variables to nil (it pays to read this here: http://clojure.org/lazy) only happens on the second call. The first still creates an fn that captures the head of the sequence 's', however this is not being held onto as it is not returned. I use this special version of map (and other, similarly rewritten functions based on lazy-seq such as iterate) when I want interruptible, restartable seq evaluations. |
[CLJ-1117] Partition does not follow docs Created: 29/Nov/12 Updated: 17/May/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.6 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Timothy Baldridge | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
OS X, 10.8 |
||
| Attachments: |
|
| Patch: | Code |
| Description |
|
The doc for partition states "In case there are not enough padding elements, return a partition with less than n items." However, the behavior of this function is as follows: user=> (partition 3 (range 10)) Either the doc should be updated to make it clear that not providing a pad will mean that items are dropped, or the functionality of partition should be fixed to the following: user=> (partition 3 (range 10)) |
| Comments |
| Comment by Andy Fingerhut [ 29/Nov/12 2:15 PM ] |
|
That would be a potentially breaking change for some people's code that uses partition. partition-all behaves as you wish. Also, your concern with the documentation is for when there are padding elements specified as an argument, but your examples don't specify any padding elements. |
| Comment by Timothy Baldridge [ 29/Nov/12 2:55 PM ] |
|
I agree, but I think the docs should then explicitly state: "if no padding is given, not all input elements may be returned in the output partitions" or something to that line. |
| Comment by Andy Fingerhut [ 29/Nov/12 4:43 PM ] |
|
More precise documentation of current behavior is always welcome in my opinion. |
| Comment by Gabriel Horner [ 17/May/13 10:14 AM ] |
|
I've uploaded a patch that calls out when and how partition drops tail elements: |
[CLJ-1113] `reductions` reducer Created: 23/Nov/12 Updated: 23/Nov/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Marshall T. Vandegrift | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
It would be nice to have a reducers implementation of the core `reductions` function. Initial implementation attempt included. This version requires an initial reduction value parameter (vs using (f)) and includes that initial value in the final reduction. I'm not certain either of these decisions is optimal, but results in a function which most closely mimics `clojure.core/reductions`. |
[CLJ-1112] Var *loading-verbosely* should initialize from a JVM system property Created: 21/Nov/12 Updated: 22/Nov/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Howard Lewis Ship | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | patch | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
I often find myself adding :verbose to a (require) or (use) clause of my (ns) in order to debug problems (especially macros, or bad namespace declarations). It would be very nice if I could define a JVM system property (say -Dclojure.load-verbosely=true) to default loading-verbosely to true for a REPL session, or as part of a build. Sometimes I just like to see that namespaces load as a measure of progress, when starting an application, or when running a set of tests. |
| Comments |
| Comment by Tassilo Horn [ 22/Nov/12 2:12 AM ] |
|
This patch implements the suggested feature. The new system property is called clojure.core.loading-verbosely in analogy to the existing clojure.compile.warn-on-reflection. |
[CLJ-1107] 'get' should throw exception on non-Associative argument Created: 13/Nov/12 Updated: 13/Nov/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Stuart Sierra | Assignee: | Stuart Sierra |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
The implementation of clojure.core/get returns null if its argument is not a valid associative collection. However, calling 'get' on something which is neither nil nor an Associative collection is almost certainly a bug, and should be indicated by an exception. This behavior can obscure common programmer errors such as: (def a (atom {:a 1 :b 2})
(:foo a) ; forgot to deref a
;;=> nil
Attached patch 0001 throws an IllegalArgumentException as the fall-through case of RT.getFrom. |
[CLJ-1105] defrecord classes implement IPersistentCollection but not .empty, clojure.walk assumes collections support empty Created: 08/Nov/12 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Jouni K. Seppänen | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Approval: | Vetted |
| Description |
|
Using clojure.walk functions fails surprisingly for data containing records defined with defrecord: user=> (defrecord Foo [x]) This seems to be because clojure.walk/walk guards a call to (empty form) with a (coll? form) check. The check succeeds because records implement IPersistentCollection, but (empty form) throws an exception. This looks to me like a bug in clojure.walk (it should check records separately and either treat them as atomic or implement a way of walking through them) but perhaps it is a sign of some unclarity in the contract of collections. |
| Comments |
| Comment by Nicola Mometto [ 08/Nov/12 2:35 PM ] |
|
maybe clojure should follow clojurescript's footsteps and move empty out of IPersistentCollection and create an |
| Comment by Stuart Halloway [ 25/Nov/12 6:39 PM ] |
|
Can whoever claims this please consider walk's behavior in the face of all different collection types? I think it also fails with Java collections. Also, the collection partitioning code in clojure.data may be of use. |
[CLJ-1104] Concurrent with-redefs do not unwind properly, leaving a var permanently changed Created: 07/Nov/12 Updated: 21/Dec/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4, Release 1.5 |
| Fix Version/s: | Approved Backlog |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Jason Wolfe | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Mac OS, Java 6 |
||
| Attachments: |
|
| Patch: | Code |
| Approval: | Vetted |
| Description |
|
On 1.4 and latest master: user> (defn ten [] 10) Not sure if this is a bug per se, but the doc doesn't mention lack of concurrency safety and my expectation was that the original value would always be restored after any (arbitrarily interleaved) sequence of with-redefs calls. |
| Comments |
| Comment by Tim McCormack [ 07/Nov/12 8:50 PM ] |
|
The with-redefs doc (v1.4.0) says "These temporary changes will be visible in all threads." That sounds non-thread-safe to me. In general, changes to var root bindings are not thread safe. |
| Comment by Herwig Hochleitner [ 08/Nov/12 9:17 AM ] |
|
As I understand it, with-redefs is mainly used in test suites to mock out vars. It was introduced when vars became static by default and a lot of testsuites had been using binding for mocking. Maybe the docstring should be amended with something along the lines of: When using this you have to ensure that only a single thread is interacting with redef'd vars. |
| Comment by Stuart Halloway [ 25/Nov/12 6:41 PM ] |
|
Behavior find as is, doc string change would be fine. |
| Comment by Andy Fingerhut [ 25/Nov/12 6:57 PM ] |
|
Patch clj-1104-doc-unsafety-of-concurrent-with-redefs-v1.txt dated Nov 25 2012 updates doc string of with-redefs to make it clear that concurrent use is unsafe. |
[CLJ-1103] Make conj assoc dissoc and transient versions handle args similarly Created: 04/Nov/12 Updated: 09/Dec/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4, Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Andy Fingerhut | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
A discussion came up in the Clojure Google group about conj giving an error when taking only a coll as an argument, as opposed to disj which works for this case: https://groups.google.com/forum/?fromgroups=#!topic/clojure/Z9mFxsTYTqQ I looked through the rest of the code for similar cases, and found that conj! assoc assoc! and disj! also had the same property, and there were some other differences between them in how different numbers of arguments were handled, such as: conj handles an arbitrary number of arguments, but conj! does not. |
| Comments |
| Comment by Andy Fingerhut [ 04/Nov/12 6:04 PM ] |
|
clj-1103-make-conj-assoc-dissoc-handle-args-similarly-v1.txt dated Nov 4 2012 makes conj conj! assoc assoc! dissoc dissoc! handle args similarly to each other. |
| Comment by Brandon Bloom [ 09/Dec/12 5:30 PM ] |
|
I too ran into this and started an additional discussion here: https://groups.google.com/d/topic/clojure-dev/wL5hllfhw4M/discussion In particular, I don't buy the argument that (into coll xs) is sufficient, since into implies conj and there isn't an terse and idiomatic way to write (into map (parition 2 keyvals)) So +1 from me |
[CLJ-1102] Better handling of exceptions with empty stack traces Created: 04/Nov/12 Updated: 30/Nov/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Andy Fingerhut | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Approval: | Vetted |
| Description |
|
I don't know what I did to cause some exceptions to be thrown while running Clojure tests that return a length 0 array from (.getStackTrace throwable), but according to the Java docs this is legal. I searched all places in the Clojure code that call .getStackTrace and found two that don't handle this correctly, one of which causes an ArrayOutOfBoundsException (that is the one I found during my testing). |
| Comments |
| Comment by Andy Fingerhut [ 04/Nov/12 5:07 PM ] |
|
clj-1102-improve-empty-stack-trace-handling-v1.txt dated Nov 4 2012 improves the handling of .getStackTrace returning a length 0 array in two places. I checked all other places .getStackTrace was called and they seem to already handle this case gracefully. |
| Comment by Timothy Baldridge [ 30/Nov/12 2:57 PM ] |
|
Vetting. |
[CLJ-1101] *default-data-reader-fn* should be set!-able in REPL Created: 03/Nov/12 Updated: 13/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | Release 1.6 |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Steve Miner | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Approval: | Screened |
| Description |
|
In |
| Comments |
| Comment by Steve Miner [ 03/Nov/12 9:32 AM ] |
|
Add *default-data-reader-fn* to the special bindings in main.clj so that it is set!-able in the REPL |
| Comment by Steve Miner [ 03/Dec/12 10:07 AM ] |
|
This is a one-liner that makes *default-data-reader-fn* convenient to use in the REPL, similar to how *data-readers* works. I'd like to have this fix in Clojure 1.5. |
| Comment by Steve Miner [ 12/Mar/13 8:10 PM ] |
|
work-around for REPL: (alter-var-root #'clojure.core/*default-data-reader-fn* (constantly my-default-reader)) |
[CLJ-1099] better error message when passing non-seq to seq Created: 01/Nov/12 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | Release 1.6 |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Stuart Halloway | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Approval: | Ok |
| Description |
|
Design discussion here. This patch improves Clojure's error message for a single common error: passing a non-seq where a seq is neede. More importantly, it is intended as a prototype for other similar improvements in the future. Error message before: (cons 1 2) => IllegalArgumentException Don't know how to create ISeq from: java.lang.Long Error message after: user=> (cons 1 2)
ExceptionInfo Don't know how to create ISeq from: java.lang.Long
user=> (ex-data *e)
{:instance 2}
|
| Comments |
| Comment by Michael Klishin [ 12/Nov/12 10:34 AM ] |
|
Wouldn't it be better to make it read "Don't know how to create ISeq from: 2 (java.lang.Long)"? How many beginners will figure |
| Comment by Stuart Halloway [ 12/Apr/13 11:36 AM ] |
|
Hi Michael, ex-info messages should not, in general, pr-str things into their bodies. This raises the question of print-length and print-level in a place where the user doesn't have good control, while the whole point of ex-info is to be in the data business, not the string business. Users can control printing from ex-data any way they like. There are two possible ways to make beginners aware of ex-data: Tell them about it in one (or a few places) in docs, or in an infinite number of places saying "This would have been useful here, but we didn't use it because you might not know about it." I prefer the former. That said, I think it would be great to increase the visibility of ex-info and ex-data early on in documentation for beginners, and to make sure that things like exception printing in logs are flexible enough not to lose the benefits of ex-info. |
[CLJ-1097] node-seq for clojure.zip Created: 29/Oct/12 Updated: 29/Oct/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Timothy Baldridge | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | clojure.zip | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
Many times it's easier to get to a zipper node via (first (filter pred ...)) instead of manually walking the tree via next/up/down. Other times it's easier to process certain nodes via filter & map instead of again, walking the tree. This patch provides a single function called node-seq that uses zip/next to generate a lazy-seq of nodes. Tests provide two examples. |
[CLJ-1094] Zero-arity versions of every-pred and some-fn Created: 25/Oct/12 Updated: 25/Oct/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Tassilo Horn | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | patch, test | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
This patch adds zero-arity versions of every-pred and some-fn with these semantics. (every-pred) === (constantly true) (some-fn) === (constantly nil) These variants are useful in situations like the following: ;; compute-preds-for may return zero or many predicate fns (let [preds (compute-preds-for something)] (filter (apply every-pred preds) some-coll)) |
| Comments |
| Comment by Tassilo Horn [ 25/Oct/12 7:12 AM ] |
|
This is the thread where Max Penet suggested to have 0-arity versions of the two fns: https://groups.google.com/forum/?fromgroups=#!topic/clojure/IRlN-4LH_U0 |
[CLJ-1090] Indirect function calls through Var instances fail to clear locals Created: 22/Oct/12 Updated: 30/Nov/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Spencer Tipping | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | performance | ||
| Environment: |
Probably all, but observed on Ubuntu 12.04, OpenJDK 6 |
||
| Attachments: |
|
| Patch: | Code |
| Approval: | Vetted |
| Description |
|
If you make a function call indirectly by invoking a Var object (which derefs itself and invokes the result), the invocation parameters remain in the thread's local stack for the duration of the function call, even though they are needed only long enough to be passed into the deref'd function. As a result, passing a lazy seq into a function invoked in its Var form may run out of memory if the seq is forced inside that function. For example: (defn total [xs] (reduce + 0 xs)) I can provide a patch if it would be useful. The fix should be trivial, something along the lines of wrapping each argN in clojure/lang/Var.java inside a Util.ret1(argN, argN = null) as is done in RestFn.java. |
| Comments |
| Comment by Spencer Tipping [ 23/Oct/12 1:37 PM ] |
|
Sorry, I typo'd the example. (defn total ...) should be (defn sum ...). |
| Comment by Timothy Baldridge [ 27/Nov/12 11:45 AM ] |
|
fixed typeo in example |
| Comment by Timothy Baldridge [ 27/Nov/12 11:47 AM ] |
|
Couldn't reproduce the exception, but the 2nd example did chew through about 4x the amount of memory. Vetting. |
| Comment by Timothy Baldridge [ 29/Nov/12 2:57 PM ] |
|
adding a patch. Since most of Clojure ends up running this code in one way or another, I'd assert that tests are included as part of the normal Clojure test process. Patch simply calls Util.ret1(argx, argx=null) on all invoke calls. |
| Comment by Timothy Baldridge [ 29/Nov/12 3:17 PM ] |
|
And as a note, both examples in the original report now have extremely similar memory usages. |
| Comment by Spencer Tipping [ 30/Nov/12 2:22 PM ] |
|
Sounds great, and the patch looks good too. Let me know if I need to do anything else. |
[CLJ-1087] clojure.data/diff uses set union on key seqs Created: 15/Oct/12 Updated: 15/Oct/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Tom Jack | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | bug, performance | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
clojure.data/diff, on line 118, defines: java.util.Map (diff-similar [a b] (diff-associative a b (set/union (keys a) (keys b)))) Since keys returns a key seq, this seems like an error. clojure.set/union has strange and inconsistent behavior with regard to non-sets, and in this case the two key seqs are concatenated. Based on a cursory benchmark, it seems that this bug The patch is easy (just call set on each key seq). |
| Comments |
| Comment by Andy Fingerhut [ 15/Oct/12 2:52 PM ] |
|
clj-1087-diff-perf-enhance-patch-v1.txt dated Oct 15 2012 implements Tom's suggested performance enhancement, although not exactly in the way he suggested. It does calculate the union of the two key sequences. |
[CLJ-1086] Support arity-1 for ->> Created: 12/Oct/12 Updated: 12/Jan/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.1, Release 1.2, Release 1.3, Release 1.4 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Shantanu Kumar | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 2 |
| Labels: | None | ||
| Environment: |
Clojure and ClojureScript |
||
| Attachments: |
|
| Patch: | Code |
| Description |
|
Currently (as of Clojure 1.4) ->> doesn't support arity-1, though -> does. Arity-1 for ->> would be useful to let somebody comment out forms as follows: (->> foo #_(bar baz) #_quux) Discussion: https://groups.google.com/forum/?fromgroups=#!topic/clojure/_IVl0Tb7Au4 My name on contributor list page http://clojure.org/contributing is: Shantanu Kumar |
| Comments |
| Comment by Andy Fingerhut [ 08/Nov/12 1:37 PM ] |
|
Shantanu, you give your name on the contributing page, but I don't see it there. Is your CA in transit, perhaps? |
| Comment by Shantanu Kumar [ 08/Nov/12 1:43 PM ] |
|
@Andy I can see my name on the contributors page when I search for the text "Shantanu". My CA was submitted more than a year ago. |
| Comment by Andy Fingerhut [ 08/Nov/12 1:53 PM ] |
|
Right you are. I somehow accidentally got my browser to enable case matching, and was expecting it to search case insensitively. Sorry for the noise. |
| Comment by VÃctor M. Valenzuela [ 12/Jan/13 6:48 PM ] |
|
Just for the record, the patch provided at http://dev.clojure.org/jira/browse/CLJ-1121 addresses this issue. |
[CLJ-1083] Incorrect ArityException message for function names containing -> Created: 09/Oct/12 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.2, Release 1.3, Release 1.4, Release 1.5 |
| Fix Version/s: | Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Alex Nixon | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 2 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Approval: | Vetted |
| Description |
|
user=> (defn a->b []) Note that the reported function name in the stack trace is "user$a", where it should be "user$a->b" (or some mangled variant thereof?) See discussion here: https://groups.google.com/d/msg/clojure/PVNoLclhhB0/_NWqyE0cPAUJ |
| Comments |
| Comment by Timothy Baldridge [ 26/Nov/12 10:27 AM ] |
|
Fix for this defect. |
| Comment by Timothy Baldridge [ 26/Nov/12 10:30 AM ] |
|
The throwArity now attempts to locate and call clojure.main/demunge. If it finds the function it invokes it and uses the returned string in the error. Otherwise it just throws the actual class name. This results in the following behaviour: user=> (defn a->b []) |
[CLJ-1082] Subvecs of primitive vectors cannot be reduced Created: 05/Oct/12 Updated: 26/Jan/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Ghadi Shayban | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
1.7.0-08, OS X 10.8 |
||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Vetted |
| Description |
|
I could reproduce on current 10/05 git. Reduce doesn't work on subvecs of primitive vectors. If reduce on a subvec doesn't work then neither will nice ops like fold. How to cause: (let [prim-vec (into (vector-of :long) (range 10000))] ->> ClassCastException clojure.core.Vec cannot be cast to clojure.lang.PersistentVector clojure.lang.APersistentVector$SubVector.iterator (APersistentVector.java:523) |
| Comments |
| Comment by Timothy Baldridge [ 27/Nov/12 11:52 AM ] |
|
Confirmed to be broken on master. Vetting. Not sure what it's going to take to fix this, however. If this is of intrest for you, you might want to help push it along by providing a patch. |
| Comment by Andy Fingerhut [ 27/Nov/12 12:09 PM ] |
|
There is no code or ticket for this yet, but I wanted to mention that I've begun working on an implementation of RRB-Tree (Relaxed Radix Balanced Tree) vectors for Clojure (see discussion at https://groups.google.com/forum/?fromgroups=#!topic/clojure-dev/xnbtzTVEK9A). Assuming it is no big deal to get reducers to work on such vectors, subvec could be implemented in O(log n) time in such a way that the result was the same concrete type of vector as you started with, and thus reducers would work on them, too. It would mean O(log n) time for subvec instead of today's O(1), but this would likely fix other limitations that exist today with subvec's, e.g. CLJ-761. |
| Comment by Mike Anderson [ 20/Jan/13 5:14 AM ] |
|
I have a fix for this and a regression test in the tree below: https://github.com/mikera/clojure/tree/winfix Not sure how best to make this into a patch though - I also have the pprint fix in here (CLJ-1076) |
| Comment by Mike Anderson [ 20/Jan/13 6:41 PM ] |
|
Attached a patch that I created with: git format-patch winfix --stdout HEAD~3..HEAD > clj-1082.patch Does this do the trick? I had to use the HEAD~3..HEAD to just get the most recent 3 commits and exclude the pprint changes that I needed in order to build on Windows. |
| Comment by Mike Anderson [ 20/Jan/13 6:42 PM ] |
|
Patch for CLJ-1082, containing 3 commits |
| Comment by Andy Fingerhut [ 21/Jan/13 1:11 AM ] |
|
Mike, your patch clj-1082.patch applies cleanly to latest master for me, so looks like you found one way to do it. Another would be as follows, and closer to the directions on the JIRA workflow page: http://dev.clojure.org/display/design/JIRA+workflow (but not identical). Note that these commands would work on Mac OS X or Linux. I'm not sure what the correct corresponding command would be on Windows for the "git am" step below, unless that just happens to work because Windows and/or git implement the input redirection with "<" somehow.
From there on down it is the same as the instructions on the JIRA workflow page. The "git format-patch master --stdout > file.patch" will create a patch for the changes you have made in the current branch fix-clj-1082 starting from the master branch, which has the CLJ-1076 fix because of the 'git am' command above. |
[CLJ-1080] Eliminate many uses of reflection in Clojure code Created: 30/Sep/12 Updated: 07/Feb/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4, Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Andy Fingerhut | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
There are dozens of uses of reflection in Clojure code that can be eliminated by adding suitable type hints. This patch adds the necessary type hints for most of those. |
| Comments |
| Comment by Andy Fingerhut [ 30/Sep/12 11:39 AM ] |
|
Patch clj-1080-eliminate-many-reflection-warnings-patch-v1.txt dated Sep 30 2012 adds type hints to eliminate many uses of reflection in Clojure core code. |
| Comment by Andy Fingerhut [ 14/Nov/12 1:26 PM ] |
|
clj-1080-eliminate-many-reflection-warnings-patch-v2.txt dated Nov 14 2012 is identical to the previous patch (to be removed soon), except it applies cleanly to latest master. |
| Comment by Andy Fingerhut [ 07/Feb/13 8:54 AM ] |
|
clj-1080-eliminate-many-reflection-warnings-patch-v3.txt dated Feb 7 2013 is identical to the previous patch (to be removed soon), except it applies cleanly to latest master. One type hint in the patch was added due to a different change, and was no longer needed in the patch. |
[CLJ-1074] Read/print round-trip for +/-Infinity and NaN Created: 21/Sep/12 Updated: 03/Dec/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Colin Jones | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 2 |
| Labels: | patch | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
A few float-related forms (namely, Double/POSITIVE_INFINITY, Double/NEGATIVE_INFINITY, Double/NaN) are not eval-able after a round-trip via (read-string (binding [*print-dup* true] (pr-str f))
The two options I see are to provide print-method implementations for these and their Float cousins, or to make Infinity, -Infinity, +Infinity, and NaN readable values. Since it sounds like edn may want to provide a spec for these values (see https://groups.google.com/d/topic/clojure-dev/LeJpOhHxESs/discussion and https://github.com/edn-format/edn/issues/2), I think making these values directly readable as already printed is preferable. Something like Double/POSITIVE_INFINITY seems too low-level from edn's perspective, as it would refer to a Java class and constant. I'm attaching a patch implementing reader support for Infinity, -Infinity, +Infinity, and NaN. |
| Comments |
| Comment by Timothy Baldridge [ 03/Dec/12 11:34 AM ] |
|
Please bring this up on clojure-dev. We'll be able to vet this ticket after that. |
| Comment by Colin Jones [ 03/Dec/12 1:18 PM ] |
|
Should I respond to my original clojure-dev post about this (linked in the issue description above), or start a new one? |
[CLJ-1073] Make print-sequential interruptible Created: 21/Sep/12 Updated: 01/Mar/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Colin Jones | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | patch | ||
| Attachments: |
|
| Patch: | Code |
| Approval: | Vetted |
| Description |
|
This allows print-sequential to be interrupted by Thread.interrupt(), rather than requiring clients to resort to Thread.stop(). This is especially helpful when printing very large sequences. See also clojure-dev discussion at https://groups.google.com/d/topic/clojure-dev/vs0RNUQXiYE/discussion |
| Comments |
| Comment by Andy Fingerhut [ 21/Sep/12 7:04 PM ] |
|
In a quickly hacked up performance test on Mac OS X 10.6.8 + Oracle/Apple JDK 1.6.0_35 which I can attach, I saw about a 9% to 10% slowdown for Colin's patch in printing large vectors. I have a modified patch that only calls Thread/interrupted after every 20 items are printed, and with that version the slowdown versus the original code was about 3% to 4%. Colin, would there be any down side to checking Thread/interrupted less often for your purposes? To run performance test, edit attachment compile.sh to point at your clojure.jar, put file perftest-print.clj in the same directory, and run ./compile.sh It should work on Mac or Linux. |
| Comment by Andy Fingerhut [ 22/Sep/12 10:47 AM ] |
|
clj-1073-allow-thread-interrupt-in-print-sequential-patch.txt dated Sep 22 2012 is similar to Colin's patch 0001-Allow-thread-interruption-in-print-sequential.patch dated Sep 21 2012, except it only checks interrupted status every 20 (or maybe 21?) times through the loop in print-sequential. It is the one that is 3-4% slower than the current latest master Clojure code in my performance test mentioned above, versus Colin's patch which is about 9-10% slower on that test. |
| Comment by Stuart Halloway [ 19/Oct/12 3:31 PM ] |
|
Is this primarily intended for dev-time use? I wouldn't want to lose performance for this if there is any way to implement it as a dev-time feature. |
| Comment by Colin Jones [ 19/Oct/12 4:27 PM ] |
|
Andy: The only caveat I can think of with checking Thread/interrupted less often is in the case of deeply nested collections. Stu: Dev-time use was the original reason for opening this, yes. But I can imagine it being needed for anytime a thread can be interrupted, whether that's by ctrl-c or other means. My original thinking, performance-wise, was that once we're already doing IO, we're probably not too concerned with CPU-bound checks like this, so I didn't bother with it. I guess with an SSD that's not as likely to be true. Locally (w/ my SSD), I'm seeing that Andy's benchmark of printing a million numbers is about a second slower than the baseline with my original patch (12.08s -> 13.10s), and about the same with Andy's patch (12.08s -> 11.75s). Decreasing to a thousand numbers doesn't really show any difference (every version completes in ~1.3s). Bumping to 2 million adds 2 seconds above the baseline with my patch, and Andy's is again just a bit faster than the baseline (somehow). Bumping to 5 million runs me out of heap space |
| Comment by Andy Fingerhut [ 08/Nov/12 4:16 PM ] |
|
clj-1073-add-print-interruptibly-patch-v1.txt dated Nov 8 2012 is the same idea as Colin's patch 0001-Allow-thread-interruption-in-print-sequential.patch dated Sep 21 2012, except it only checks (Thread/interrupted) if a new var print-interruptibly is true. Its default value is false. Performance results of the perftest-print.clj program, as driven by the test.sh script, for Clojure 1.5-beta1 and with two different patches. All run times are elapsed, in seconds, and sorted in increasing order for easier comparison. Executive summary: Performance results when print-interruptibly is left at default false value are pretty much same as today. With print-interruptibly bound to true, performance results are slower, as expected, and about the same as with Colin's patch. Original 1.5-beta1 unchanged: With this new print-interruptibly patch, with print-interruptibly With this new print-interruptibly patch, with print-interruptibly With patch 0001-Allow-thread-interruption-in-print-sequential.patch |
| Comment by Colin Jones [ 12/Nov/12 1:37 PM ] |
|
Andy's latest patch looks good & makes it easy for the REPL and other interruptible scenarios to opt into the "safe" behavior. I would personally have preferred to have the "safe" behavior on by default, but can understand the performance concerns, and this gets me what I really wanted. |
| Comment by Timothy Baldridge [ 30/Nov/12 3:09 PM ] |
|
Vetting as it sounds like the performance issues are taken care of. |
| Comment by Andy Fingerhut [ 13/Feb/13 12:28 AM ] |
|
clj-1073-add-print-interruptibly-patch-v2.txt dated Feb 12 2013 is identical to clj-1073-add-print-interruptibly-patch-v1.txt dated Nov 8 2012 (soon to be removed) except that it applies cleanly to latest master. |
[CLJ-1063] Missing dissoc-in Created: 07/Sep/12 Updated: 17/Sep/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Gunnar Völkel | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Not Approved |
| Description |
|
There is no clojure.core/dissoc-in although there is an assoc-in. |
| Comments |
| Comment by Andy Fingerhut [ 13/Sep/12 2:17 PM ] |
|
Patch clj-1063-add-dissoc-in-patch-v2.txt dated Sep 13 2012 supersedes 001-dissoc-in.diff dated Sep 7 2012. It fixes a typo (missing final " in doc string), and adds a test case for the new function. |
| Comment by Nicola Mometto [ 13/Sep/12 2:27 PM ] |
|
Thanks for the fix Andy |
| Comment by Andy Fingerhut [ 14/Sep/12 8:24 PM ] |
|
This proposed dissoc-in should be compared with the one in clojure.core.incubator which I just happened across. I see they look different, but haven't examined to see if there are any behavior differences. https://github.com/clojure/core.incubator/blob/master/src/main/clojure/clojure/core/incubator.clj |
| Comment by Nicola Mometto [ 15/Sep/12 6:43 AM ] |
|
dissoc-in in clojure.core.incubator recursively removes empty maps user=> (clojure.core.incubator/dissoc-in {:a {:b {:c 1}}} [:a :b :c]) while the one in this patch doesn't (as I would expect) user=> (dissoc-in {:a {:b {:c 1}}} [:a :b :c]) |
| Comment by Stuart Halloway [ 17/Sep/12 7:04 AM ] |
|
Please do this work in the incubator. |
[CLJ-1056] defprotocol: invalid method overload syntax getting accepted Created: 01/Sep/12 Updated: 29/Nov/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | VÃctor M. Valenzuela | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Approval: | Vetted |
| Description |
|
The compiler accepts both of these erroneous forms which while silly, are not imposible to come up with. (defprotocol Foo (f ([this]) ([this arg]))) |
| Comments |
| Comment by Timothy Baldridge [ 29/Nov/12 4:02 PM ] |
|
Can not reproduce the fist error: user=> (defprotocol Foo (f ([this]) ([this arg]))) But the 2nd one I can reproduce: user=> (defprotocol Bar (m [this]) (m [this arg])) Notice that :arglists only has one entry Vetting |
[CLJ-1053] Locals still cleared too aggressively on delay in specific cases Created: 30/Aug/12 Updated: 09/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Jean Niklas L'orange | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
This seems to be an extension of #CLJ-232. Locals are still cleared too aggressively in some specific instances: If the delay throws an exception when realized, and you dereference a local within the delay, the local may or may not be cleared depending on its need in the tail positions (without any obvious pattern). Examples of functions which works as intended and doesn't work as intended follows. (def d (let [y (delay 0)]
(delay (if (zero? @y) (/ 0 0) (/ @y 1))))) ; works properly
(def d (let [y (delay 0)]
(delay (if (zero? @y) (/ 0 0) (/ 1 1))))) ; does not work properly
(def d (let [y (delay 0)]
(delay (if (zero? @y) (/ @y 0) (/ 1 1))))) ; does not work properly
(def d (let [y (delay 0)]
(delay (if (zero? @y) (/ @y 0) (/ @y 1))))) ; does not work properly
(def d (let [y (delay 0)]
(delay @y (/ 0 0)))) ; does not work properly
(def d (let [y (delay 0)]
(delay @y (/ 0 0) @y))) ; works properly
By "works", d will throw "ArithmeticException Divide by zero" every single time it is dereferenced. By "does not work", d will throw "ArithmeticException Divide by zero" on first dereferencing, but from second and onwards it will throw "NullPointerException [trace missing]". |
| Comments |
| Comment by Jean Niklas L'orange [ 09/Apr/13 11:55 AM ] |
|
With Clojure 1.5.1, the trace is given and returns NullPointerException clojure.core/deref-future (core.clj:2NullPointerException clojure.core/deref-future (core.clj:2108)108), which refers to a .get call. The stacktrace reveals the following: NullPointerException clojure.core/deref-future (core.clj:2108) clojure.core/deref (core.clj:2129) user/fn--1/fn--4 (NO_SOURCE_FILE:2) clojure.lang.Delay.deref (Delay.java:33) clojure.core/deref (core.clj:2128) user/eval13 (NO_SOURCE_FILE:-1) clojure.lang.Compiler.eval (Compiler.java:6619) clojure.lang.Compiler.eval (Compiler.java:6582) clojure.core/eval (core.clj:2852) clojure.main/repl/read-eval-print--6588/fn--6591 (main.clj:259) clojure.main/repl/read-eval-print--6588 (main.clj:259) clojure.main/repl/fn--6597 (main.clj:277) |
[CLJ-1049] Make reducer/folder support reduce-kv Created: 22/Aug/12 Updated: 23/Sep/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Tom Jack | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
Currently, although rfn makes an effort to support reduce-kv, it is wasted effort since the return values of reducer and folder don't satisfy IKVReduce. I have a working patch for this, it's quite small. I have printed a CA but not sent it, so I won't reveal the patch yet... This also applies to ClojureScript. |
| Comments |
| Comment by Tom Jack [ 15/Sep/12 12:47 AM ] |
|
Hmm.. it's not quite as simple as I thought. My first patch simply had reducer/folder implement IKVReduce with `(clojure.core.protocols/kv-reduce coll (xf f1) init)`, but for map and mapcat, this results in strange behavior (reduce-kv reducefs being called with only 2 args). Patch 0001 includes modifications to map and mapcat so that the reduce-kv reducef will always be called with 3 args. The previous implementation of mapcat also had the converse problem: during non-kv reduce, if the mapcat fn returned a map, the reducef would be called with 3 args since maps reduce with reduce-kv. The patch gives behavior like: user> (->> {1 {2 3 4 5} 6 {7 8 9 10}}
(r/mapcat #(r/map + %2))
(reduce-kv #(conj %1 [%2 %3]) []))
[[2 5] [4 9] [7 15] [9 19]]
user> (->> [{2 3 4 5} {7 8 9 10}]
(r/mapcat identity)
(r/reduce conj []))
[[2 3] [4 5] [7 8] [9 10]]
|
| Comment by Tom Jack [ 23/Sep/12 8:34 PM ] |
|
Would like to discuss these changes (and auto-kv for maps) on clojure-dev, but my membership is still pending. My CA has been received. Anyone know who to contact to get my membership approved? |
[CLJ-1047] Simplify the process of requiring fj in clojure.core.reducers Created: 21/Aug/12 Updated: 21/Aug/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Nicola Mometto | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
this patch removes compile-if in favor of import-if, removing code duplication |
[CLJ-1043] Unordered literals does not preserve left-to-right evaluation of arguments Created: 16/Aug/12 Updated: 23/Sep/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Brandon Bloom | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Given: (defn f [x] (println x) x) #{(f 2) (f 1)} Prints: 1 But expected would be: 2 This issue is related to CLJS-288 |
| Comments |
| Comment by Andy Fingerhut [ 23/Sep/12 6:01 PM ] |
|
I have the same question as David Nolen for CLJS-288: Is this a bug, or just behavior you didn't expect? It seems that vectors preserve the order of evaluation, so if you really want to control evaluation order you could use something like (set [(f 2) (f 1)]) or (set (map f [2 1])). |
| Comment by Brandon Bloom [ 23/Sep/12 7:38 PM ] |
|
I'd consider the expected default behavior of any syntax or macro to evaluate each sub-form once each, from left to right. Conditional, repeated, or out-of-order evaluation should be documented as deviations from that norm. If you buy that, then this is either a code or a documentation bug. My vote is for code bug. |
[CLJ-1039] Using 'def with metadata {:type :anything} throws ClassCastException Created: 09/Aug/12 Updated: 10/Aug/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Gunnar Völkel | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Ubuntu, lein 1.7.1 - lein repl |
||
| Approval: | Vetted |
| Description |
|
In lein 1.7.1 (and CCW) the form (def ^{:type :anything} mydef 1) throws "ClassCastException clojure.lang.Var cannot be cast to clojure.lang.IObj clojure.core/with-meta (core.clj:211)". If it is intended to forbid setting the :type metadata, then there should be an appropriate error message instead of the ClassCastException In lein2 repl which is using "REPL-y 0.1.0-beta8" the exception does not occur. Full stacktrace: |
| Comments |
| Comment by Stuart Halloway [ 10/Aug/12 1:40 PM ] |
|
This is caused by the printer dispatch function (defmulti print-method (fn [x writer]
(let [t (get (meta x) :type)]
(if (keyword? t) t (class x)))))
which ends up calling the default dispatch, which tries to vary-meta. |
[CLJ-1033] pr-str and read-string don't handle @ symbols inside keywords properly Created: 26/Jul/12 Updated: 13/Jan/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Steven Ruppert | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | reader | ||
| Environment: |
Ubuntu 12.04 LTS; Java 1.7.0_05 Java HotSpot(TM) Client VM |
||
| Approval: | Vetted |
| Description |
user=> (read-string (pr-str {(keyword "key@other") :stuff}))
RuntimeException Map literal must contain an even number of forms clojure.lang.Util.runtimeException (Util.java:170)
pr-str emits "{:key@other :stuff}", which read-string fails to interpret correctly. Either pr-str needs to escape the @ symbol, or read-string needs to handle the symbol inside a keyword. Background: I'm passing a map with email addresses as keys through Storm bolts, which require a thrift-serializable form. Using the pr-str/read-string combo fails on these keys, so I've fallen back to JSON serialization. |
| Comments |
| Comment by Stuart Halloway [ 10/Aug/12 12:51 PM ] |
|
The '@' character is not a legal character for keywords or symbols (see http://clojure.org/reader). Recategorized as enhancement request. |
| Comment by Steven Ruppert [ 10/Aug/12 1:04 PM ] |
|
Then why doesn't (keyword "keywith@") throw an exception? It seems inconsistent with your statement. |
| Comment by Andy Fingerhut [ 13/Sep/12 2:23 PM ] |
|
It is a long standing property of Clojure that it does not throw exceptions for everything that is illegal. |
| Comment by Steven Ruppert [ 17/Sep/12 2:16 PM ] |
|
Yeah, but read-string clearly does. Is there a good reason that the "keyword" function can't throw an exception? With the other special rules on namespaces within symbol names, the "keyword" function really should be doing validation. Another solution would be to allow a ruby-like :"symbol with disallowed characters" literal, but that would also be confusing with how the namespace is handled. https://groups.google.com/forum/?fromgroups=#!topic/clojure/Ct5v9w0yNAE has some older discussion on this topic. |
| Comment by Andy Fingerhut [ 17/Sep/12 7:43 PM ] |
|
Disclaimer: I'm not a Clojure/core member, just an interested contributor who doesn't know all the design decisions that were made here. Steven, I think perhaps a couple of concerns are: (1) doing such checks would be slower than not doing them, and (2) implementing such checks means having to update them if/when the rules for legal symbols, keywords, namespace names, etc. change. Would you be interested in writing strict versions of functions like symbol and keyword for addition to a contrib library? And test suites that try to hit a significant number of corner cases in the rules for what is legal and what is not? I mean those as serious questions, not rhetorical ones. This would permit people that want to use the strict versions of these functions to do so, and at the same time make it easy to measure performance differences between the strict and loose versions. |
| Comment by Steven Ruppert [ 13/Jan/13 10:58 PM ] |
|
Looking back at this, the root cause of the problem is that the {pr} function, although it by default "print[s] in a way that objects can be read by the reader" [0], doesn't always do so. Thus, the easiest "fix" is to change its docstring to warn that not all keywords can be read back. The deeper problem is that symbol don't have a reader form that can represent all actually possible keywords (in this case, those with "@" in them). Restricting the actually-possible keywords to match the reader form, i.e. writing a strict "keyword" function actually seems like a worse solution overall to me. The better solution would be to somehow extend the keyword reader form to allow it to express all possible keywords, possibly ruby's :"keyword" syntax. Plus, that solution would avoid having to keep hypothetical strict keyword/symbol functions in sync with reader operation, and write test cases for that, and so on. Thus, the resolution of this bug comes down to how far we're willing to go. Changing the docstring would be the easiest, but extending the keyword form would be the "best" resolution, IMO. |
[CLJ-1030] Misleading ClassCastException when coercing a String to int Created: 25/Jul/12 Updated: 06/Jan/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Philipp Meier | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | bug | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
Observed behaviour (int "0") => Expected behaviour |
| Comments |
| Comment by Andy Fingerhut [ 24/Sep/12 11:20 AM ] |
|
If someone wants to improve the behavior of int in this case, they should also consider similar improvements to the error messages for unchecked-int, char, and unchecked-char. |
| Comment by Michael Drogalis [ 06/Jan/13 8:45 PM ] |
|
Patch improved-int-char-casting-error-messages.diff on January 6, 2013. |
[CLJ-1029] ns defmacro allows arbitrary execution of clojure.core fns Created: 23/Jul/12 Updated: 05/Aug/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.2, Release 1.3, Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Craig Brozefsky | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Environment: |
all |
||
| Attachments: |
|
| Patch: | Code |
| Description |
|
The form: (ns foo (:print "I AM A ROBOT")) will print "I AM A ROBOT" This is because the defmacro takes the name of the first element of the reference, looks it up in the clojure.core namespace and invokes it on the rest of the args. This is minor, but it does mean that an otherwise declarative form is not executing code. |
| Comments |
| Comment by Alan Malloy [ 25/Jul/12 4:37 PM ] |
|
One apparent problem with this patch is that you throw an exception for :refer. You should add that, and make sure there aren't any others missing. Also, #{x y z} is better than (set [x y z]), and you should probably use pr-str rather than str, although I can't think of a case where it matters for the objects in question. |
| Comment by Andy Fingerhut [ 26/Jul/12 6:31 PM ] |
|
A more minor detail of patch formatting – please attach your patch in git format. See the instructions under the section heading "Development" on this web page: http://dev.clojure.org/display/design/JIRA+workflow |
| Comment by Craig Brozefsky [ 05/Aug/12 9:53 AM ] |
|
git format-patch version of the diff, with the edits suggested by other maintainers. |
| Comment by Craig Brozefsky [ 05/Aug/12 10:00 AM ] |
|
Alan: please note that :refer was not mentioned in the docstring for ns, or used in any of the unit tests for clojure. Are you sure that it is an expected argument, or just an arrangement that happens to work under the current ns macro? The docstring for 'refer itself says to use :use in ns macros instead of calling refer. I added "refer" to the set of accepted references all the same. |
[CLJ-1026] Mixed end-of-line endings in the source code Created: 17/Jul/12 Updated: 30/Mar/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | John Szakmeister | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 2 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
While examining some of the Clojure source code, I discovered that some files had mixed line endings, or CRLF line endings on a non-Windows box. Using .gitattributes, we can correct that so that files have the right endings for the platform that it's on. |
| Comments |
| Comment by John Szakmeister [ 17/Jul/12 2:26 PM ] |
|
Patch to fix line endings and introduce .gitattributes. |
| Comment by Stuart Halloway [ 20/Jul/12 4:47 PM ] |
|
This looks like a change to every line in the world, which makes it hard to vet. Also: will it render incompatible all other outstanding patches at the time it is applied? |
| Comment by John Szakmeister [ 21/Jul/12 6:52 AM ] |
|
You can use git diff -w $(git merge-base HEAD master) to see the actual diff minus the line ending change. Here it is inline: :: git diff -w $(git merge-base HEAD master) diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..7b89cfa --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +*.txt text +*.clj text +*.html text +*.js text +*.css text +*.java text diff=java Also, no, it won't render all the outstanding patches incompatible. For one, it seems like the files that have the eols mixed or in CRLF aren't touched much. I also went through the majority of outstanding patches and couldn't fix one that conflicts. Secondly, format-patch emits the patch inline and is intended to be sent via email. SMTP says that all lines must end with CRLF, so line endings are effectively lost. So git will convert it to the right line ending on application. It can conflict with any outstanding branches that you may have. Supplying the renormalization option on merge can help: git merge -X renormalize <branch-name> Or, you can enable this by default for your repository: git config --local merge.renormalize true
If you think it's too much trouble, let's just drop it though. |
| Comment by Stuart Halloway [ 10/Aug/12 1:15 PM ] |
|
Patch does not apply on my working copy of Clojure. I am using git am -s ...
/Users/stu/repos/clojure/.git/rebase-apply/patch:344: trailing whitespace.
p {
/Users/stu/repos/clojure/.git/rebase-apply/patch:350: space before tab in indent.
margin-left: 0.5in;
error: patch failed: epl-v10.html:1
error: epl-v10.html: patch does not apply
error: patch failed: src/jvm/clojure/asm/AnnotationVisitor.java:1
error: src/jvm/clojure/asm/AnnotationVisitor.java: patch does not apply
error: patch failed: src/jvm/clojure/asm/AnnotationWriter.java:1
error: src/jvm/clojure/asm/AnnotationWriter.java: patch does not apply
I am willing to do this, just inept. |
| Comment by Andy Fingerhut [ 10/Aug/12 1:21 PM ] |
|
Stuart, I updated this page http://dev.clojure.org/display/design/JIRA+workflow a while back when I had trouble applying some patches involving files with carriage return line endings. I did some Googling on git docs and found the option '--keep-cr' that seems to help in such cases. Try that out. |
[CLJ-1021] (let [i 5] (defmacro m [v] v) m) interprets m as a function, not a macro Created: 02/Jul/12 Updated: 13/Sep/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Zii Prime | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | bug | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
(let [i 5] (defmacro m [& args] args) (def x (m (inc 5) (inc 6) (inc 7))) x m (meta #'m)) It appears to be interpreting m as a function despite the metadata. This behavior only shows up inside the (let ...). |
| Comments |
| Comment by Nicola Mometto [ 18/Aug/12 11:43 AM ] |
|
The problem is the same as the one for http://dev.clojure.org/jira/browse/CLJ-918 The patch linked there was mine but i had no CA signed at that time, and no account on jira. Here is the same patch in the correct format. Bug #918 should be closed as this is a duplicate |
[CLJ-1018] range's behavior is inconsistent Created: 29/Jun/12 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.1, Release 1.2, Release 1.3, Release 1.4, Release 1.5 |
| Fix Version/s: | Release 1.5, Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Devin Walters | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | patch, range | ||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Ok |
| Description |
|
Problem statement: The current behavior of range is inconsistent. (range 0 9 0) has always produced (). (range 0 9 -1) has always produced (). (range 9 0 1) has always produced (). However, (range 9 0 0) produces (9 9 9 9 ...), and (range 0 0 0) produces '(0 0 0 0 ...) Proposal: Make the behavior of range consistent when using a step of 0 to make it produce an empty list. Please see attached code and patch. |
| Comments |
| Comment by Mike Anderson [ 01/Jul/12 4:08 AM ] |
|
Agree it is good to fix the inconsistency, but I think an infinite sequence of zeros is the correct result, as implied by the current docstring definition. It's also mathematically cleanest: range should produce an arithmetic progression until the end value is equalled or exceeded. Empty lists only seem to make sense as a return value when start >= end. |
| Comment by Devin Walters [ 01/Jul/12 12:36 PM ] |
|
Hi Mike, Could you explain how you think the docstring definition implies this behavior? Maybe I'm missing something, but I was surprised. For instance, in the case of (range 3 9 0), if start were truly inclusive as the docstring says, the result would be (3), not (). You mentioned that you think the infinite sequence of 0's is consistent and in keeping with the definition of range. I'm not sure I agree. (0,0] is an empty set of length zero, and [0,0) is an empty set of length zero. You state that empty list only makes sense for start >= end, except this is not the current behavior. Could you help me understand what you believe the appropriate behavior would be in each of the following three cases? (range 0 10 0), (range 10 0 0), and (range 0 0 0)? A few options to consider: Editing to Add (Note: I don't think the way someone else did something is always the right way, just wanted to do some digging on how other people have handled this in the past): |
| Comment by Dimitrios Piliouras [ 05/Jul/12 4:13 PM ] |
|
It does make sense NOT to allow a step of zero (at least to me)... I wasn't going to say anything about this but if other popular languages do not allow 0, then I guess it makes more sense than I originally gave myself credit for... However, if we want to be mathematically correct then the answer would be to return an infinte seq with the start value like below. After all, what is a step of 0? does it make any difference how many steps you take if with every step you cover 0 distance? obviously not...you start from x and you stay at x forever...we do have repeat for this sort of thing though... (take 5 (range 3 9 0)) => (3 3 3 3 3) +1 for not allowing 0 step |
| Comment by Mike Anderson [ 08/Jul/12 8:49 AM ] |
|
@Devin quite simple: a lazy sequence of nums starting from x with step 0.0 until it reaches an end value of y (where y > x) is an infinite sequence of x. Consider the case where start is 0 and end is infinity (the default), you would expect sequences to go as follows: step +2 : 0 2 4 6 8.... It would be inconsistent to make 0 a special case, all of these are valid arithmetic progressions. And all of these are consistent with the current docstring. If you make 0 a special case, then people will need to write special case code to handle it. Consider the code to create a multiplication table for example: (for [x (range 10)] This works fine if you produce an infinite sequence of zeros for step 0, but fails if you create an empty list as a special case for step 0. As a related issue, I'd personally also favour negative step sizes also producing an infinite sequence. If we don't want to allow this though, then at least the docstring should be changed to say "a lazy seq of non-decreasing nums" and a negative step should throw an error. |
| Comment by Devin Walters [ 09/Jul/12 7:09 PM ] |
|
Carrying over a message from the clojure-dev list by Stuart Sierra:
yes
not if they have any sense
not me
I doubt it.
Not that I know of.
I doubt it. Lazy seqs are not ideal for high-performance code anyway.
I think the problem is that the result of `range` with a step of 0 was never specified. Don't assume that the tests are specifications. Many of the tests in Clojure were written by over-eager volunteers who defined the tests based on whatever the behavior happened to be. The only specification from the language designer is the docstring. By my reading, that means that `range` with a step of 0 should return an infinite seq of the start value, unless the start and end values are equal. -S |
| Comment by Devin Walters [ 09/Jul/12 7:10 PM ] |
|
Carrying over a message by Michal Marczyk: With a negative step, the comparison is reversed, so that e.g. (range 3 0 -1) evaluates to (3 2 1) I think this is the useful behaviour; the docstring should perhaps be Agreed on zero step. Cheers, |
| Comment by Devin Walters [ 20/Jul/12 5:10 PM ] |
|
Adding a new patch after hearing comments. This patch makes (range 9 3 0) => (9 9 9 9 ...), (range 3 9 0) => (3 3 3 3 ...), and () will be returned when (= start end). Also updated the docstring. |
| Comment by Timothy Baldridge [ 27/Nov/12 3:01 PM ] |
|
Marking as vetted |
| Comment by Timothy Baldridge [ 27/Nov/12 3:04 PM ] |
|
Patch applies cleanly. We've discussed this issue to death (for as simple as it is). I think it's time to mark it as screened. |
| Comment by Timothy Baldridge [ 27/Nov/12 3:06 PM ] |
|
For some reason I'm not allowed to edit the attachments list. When you apply the patch, please apply inconsistent_range_fix.diff as that is the most recent version of the fix. |
| Comment by Rich Hickey [ 09/Dec/12 6:44 AM ] |
|
As someone who has to read these tickets, I'd really appreciate it if you could keep the description up to date and accurate, with examples of the current and intended behavior and the strategy to be used in fixing. I can't follow every thread to see what the latest thinking is, especially on a patch like this where the original mission was changed. Thanks |
| Comment by Devin Walters [ 10/Dec/12 3:53 PM ] |
|
@Tim: I've removed the other attachments. @Rich: Understood. I will update the description this evening. |
[CLJ-1015] Standalone Clojure library for Java users Created: 14/Jun/12 Updated: 14/Jun/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Edward Z. Yang | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Many of Clojure's data structures (e.g. PersistentHashMap) may be of interest to the wider Java community, and would benefit from being packaged in a way that makes them easy to include in projects. While they are public (and thus can be accessed by way of clojure.lang), Clojure's classloader is implemented in a way such that Clojure files such as core.clj end up being loaded, even when an end-user is not interested in the Clojure environment itself. The Java classes could also use some documentation! I'd be happy to work on a patch but this change may require some restructuring of the build process, so it'd be good to get community sign-off first. |
| Comments |
| Comment by Andy Fingerhut [ 14/Jun/12 5:39 PM ] |
|
I am assuming this ticket is a request that the original Clojure distribution be modified to easily build such a library of data structures, and be maintained as a separate build target, going forward. Reference to related info: Below is a copy of most of a message from someone with userid Krukow posted to the Clojure Google group on June 3, 2012: https://groups.google.com/forum/?fromgroups#!topic/clojure/UyjmafY_ZE8 I created a project containing only the persistent data structures for use with Java et al. https://github.com/krukow/clj-ds It is the data structures only so no bootstrap penalty. There are also Java'ish "improvements" like basic Generics and improved performance on the iterator pattern. It's still on Clojure 1.3 (As far as I recall), but I am planning on taking another iteration. TODO:
|
[CLJ-1010] A left-to-right-variant of `comp` Created: 11/Jun/12 Updated: 14/Jun/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Tassilo Horn | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | enhancement, patch | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
The function composition function `comp` is quite inefficient in cases like `(apply comp large-seq-of-fns)`, because its arity-greater-than-3 version reverses the seq. I would be great if there was an alternative `comp*` (or whatever) function which is just like `comp` but composes left-to-right. |
| Comments |
| Comment by Tassilo Horn [ 11/Jun/12 5:16 AM ] |
|
Here's an implementation. |
| Comment by Tassilo Horn [ 11/Jun/12 12:41 PM ] |
|
There's something strange with my patch. The creation of a composition of a huge seq of functions is much faster with `comp*` than with `comp`, which is expected, because the seq doesn't need to be reversed. The strange thing however is that the compositions created with `comp` evaluate about 10-20% faster than those created with `comp*` although the arbitrary-arity version of `comp` is defined in terms of `comp*`: `(apply comp* (reverse (list* f1 f2 f3 fs)))`. For some benchmarking details, see: https://groups.google.com/d/msg/clojure/MizwTxHwLE4/hGLrMfetlP8J |
| Comment by Tassilo Horn [ 14/Jun/12 2:32 AM ] |
|
Here's some benchmark: user> (use 'criterium.core)
nil
user> (let [coll (doall (take 1000000 (repeat inc)))
f1 (apply comp* coll)
f2 (apply comp coll)]
(bench (f1 0) :verbose)
(println "---------------------------------------")
(bench (f2 0) :verbose))
amd64 Linux 3.4.2-gentoo 2 cpu(s)
OpenJDK 64-Bit Server VM 22.0-b10
Runtime arguments: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n -XX:+TieredCompilation -Xmx1G -Dclojure.compile.path=/home/horn/Repos/clj/testi/target/classes -Dtesti.version=0.1.0-SNAPSHOT -Dclojure.debug=false
Evaluation count : 600
Execution time mean : 112.324465 ms 95.0% CI: (112.247218 ms, 112.380682 ms)
Execution time std-deviation : 6.513809 ms 95.0% CI: (6.477450 ms, 6.553029 ms)
Execution time lower ci : 105.609401 ms 95.0% CI: (105.609401 ms, 105.622918 ms)
Execution time upper ci : 122.353763 ms 95.0% CI: (122.353763 ms, 122.405315 ms)
---------------------------------------
amd64 Linux 3.4.2-gentoo 2 cpu(s)
OpenJDK 64-Bit Server VM 22.0-b10
Runtime arguments: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n -XX:+TieredCompilation -Xmx1G -Dclojure.compile.path=/home/horn/Repos/clj/testi/target/classes -Dtesti.version=0.1.0-SNAPSHOT -Dclojure.debug=false
Evaluation count : 1440
Execution time mean : 43.519663 ms 95.0% CI: (43.516732 ms, 43.524062 ms)
Execution time std-deviation : 492.299089 us 95.0% CI: (490.829889 us, 494.198137 us)
Execution time lower ci : 42.781398 ms 95.0% CI: (42.781398 ms, 42.781398 ms)
Execution time upper ci : 44.157311 ms 95.0% CI: (44.157311 ms, 44.158513 ms)
nil
|
| Comment by Tassilo Horn [ 14/Jun/12 3:40 AM ] |
|
Ok, I've tracked down the performance difference. This comes from the fact that `reverse` creates a clojure.lang.PersistentList which can be iterated much faster than a (fully realized) LazySeq. If you provide your fncoll in `(apply comp* fncoll)` as vector or list, the application of the created composition is as fast as for `comp`. So for me, the patch is good and makes sense. |
[CLJ-1008] Make sorted maps and sets implement j.u.NavigableMap and NavigableSet interfaces Created: 02/Jun/12 Updated: 02/Jun/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Jim Blomo | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Since Clojure 1.5 will probably no longer target JVM 5, add support for the (Concurrent)?Navigable(Map|Set) interfaces. This should involve adding functions to PersistentTreeMap that descend the red-black tree to select the closest items. |
[CLJ-1004] ArrayChunk implements Seqable Created: 28/May/12 Updated: 25/Mar/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Jim Blomo | Assignee: | Jim Blomo |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
I've found it helpful to be able to iterate over ArrayChunks. Implementing Seqable means they can be used by most collections functions. |
| Comments |
| Comment by Jim Blomo [ 28/May/12 7:55 PM ] |
|
2012-05-28 implements the seq method for vec and vector-of. It uses the array backing ArrayChunk to construct a sequence. Simple tests are included. |
| Comment by Stuart Halloway [ 01/Mar/13 9:44 AM ] |
|
Please add discussion of motivating use cases. |
| Comment by Jim Blomo [ 25/Mar/13 11:10 PM ] |
|
This was motivated by the desire to implement chunk-sequence-aware functions in Clojure elegantly. Currently, dealing with ArrayChunks in Clojure is clumsy because few of the functions dealing with collections will work with non-seqables. This functionality will mostly be used by implementers since end users shouldn't care if their sequence is chunked or not. |
[CLJ-1003] :100 is a valid Clojure keyword. Is that intentional? Created: 27/May/12 Updated: 13/Sep/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Brian Taylor | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
In the latest clojure (eccde24c7), These parse as keywords: :100 This is an error: :a/100 Is this behavior intentional? In LispReader.java, the pattern for a symbol (and keyword) is "[:]?([\\D&&[^/]].*/)?([ http://clojure.org/reader says that none of my examples should parse. Clojurescript does not accept any of my examples, see |
| Comments |
| Comment by Andy Fingerhut [ 13/Sep/12 6:34 PM ] |
|
The reason that :100 parses as a keyword is that [ Whether this is intentional or not, my guess is probably not. Given that the docs at http://clojure.org/reader also say "A symbol can contain one or more non-repeating ':'s", writing a regexp that matches only what is documented there looks fairly complex. Clojure has a history of allowing things, without throwing exceptions or giving any other errors, even if they are documented as not legal. This may be one of those cases. Do not consider this last paragraph as any kind of authoritative answer. It is only my observation. |
[CLJ-1002] chunk-* functions not documented Created: 27/May/12 Updated: 27/May/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Jim Blomo | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
None of the chunk related functions defined in core.clj have documentation. While their implementations are straightforward, it means the functions do not show up in http://clojure.org/api. Are these not considered part of the API? If so, should they be private? Otherwise, I think they should have public documentation. For searchability, the function are: chunk-append, chunk, chunk-first, chunk-rest, chunk-next, chunk-cons, chunked-seq? |
[CLJ-997] max-key and min-key to return the first entry in case of several candidates Created: 18/May/12 Updated: 18/May/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3, Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Oleksandr Shyshko | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Consider the following code: (def values [[1 2] [3 4] [5] [6 7] [8]]) Which returns the last max entry [6 7]. Why its not the first max entry [1 2]? Consider the following example in Scala: println(List(List(0, 1, 2), List(2, 3, 4), List(1), List(1, 2, 3)).maxBy(_.length)) The very same function in Scala returns the first max entry (by default). The code from relase 1.4 file "clojure/core.clj#4419-4426" looks is: I am unsure what is the motivation in returning the last candidate, but I suggest two following things: 1. Make "max-key" and "min-key" return the first max/min entry if there are several candidates. This behavior seems more natural/convenient (to me), because in most cases you want to get first "winner". Line #4424 should have ">=" instead of ">". 2. Make "max-key" and "min-key" make warranty on order, which max/min entry will be returned (either first or last). Line #4420 should say "Returns the x for which (k x), a number, is greatest. In case of several matches, the first max entry will be returned" or the same doc, but saying "the last max entry will returned". |
| Comments |
| Comment by Steve Miner [ 18/May/12 4:03 PM ] |
|
The current behavior matches the documentation so I wouldn't consider it a "defect". There doesn't seem to be a compelling reason to impose a tie-breaker rule on the implementation. |
[CLJ-991] partition-by reducer Created: 10/May/12 Updated: 04/Mar/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Kevin Downey | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | enhancement, patch, patch, | ||
| Attachments: |
|
| Patch: | Code and Test |
| Comments |
| Comment by Rich Hickey [ 14/Aug/12 1:52 PM ] |
|
I'd like to see something much faster than this. |
| Comment by Kevin Downey [ 15/Aug/12 1:58 AM ] |
|
For reference here is a benchmark of a non-reducers (seq based) process that uses partition-by user=> (def x (vec (range 1e6)))
#'user/x
user=> (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=>
Same again using r/partition-by from reducer-partition-by.diff user=> (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=>
(using https://github.com/hugoduncan/criterium for benchmarking) |
| Comment by Kevin Downey [ 15/Aug/12 2:17 AM ] |
|
same again for r/partition-by from reducers-partition-by2.diff user=> (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=>
same again driven using r/fold (for grins) instead of r/reduce user=> (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=>
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. |
| Comment by Rich Hickey [ 15/Aug/12 6:58 AM ] |
|
Let's leave fold out for this first patch, please. |
| Comment by Kevin Downey [ 15/Aug/12 2:34 PM ] |
|
reducer-partition-by3.diff is a cleaned up version of reducer-partition-by2.diff without fold |
| Comment by Devin Walters [ 20/Oct/12 7:07 PM ] |
|
Per Andy Fingerhut's email reducer-partition-by3.diff was failing to apply. This patch should apply cleanly to current master. |
| Comment by Andy Fingerhut [ 01/Nov/12 6:59 PM ] |
|
Presumptuously changing Approval from Incomplete to None, since the reason for its being marked Incomplete seems to have been addressed with the latest patch. |
| Comment by Kevin Downey [ 04/Mar/13 2:49 PM ] |
|
should this be assigned to someone? |
[CLJ-983] proxy-super does not restore original binding if call throws exception Created: 05/May/12 Updated: 05/May/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.1, Release 1.2, Release 1.3 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Valentin Mahrwald | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | bug | ||
| Attachments: |
|
| Description |
|
The code for proxy-call-with-super internally used by proxy-super does not handle exceptions from the call method: (defn proxy-call-with-super [call this meth] As a result the following sequence behaves unexpectedly: A try-finally block around the invocation would solve this particular issue. |
| Comments |
| Comment by Valentin Mahrwald [ 05/May/12 9:04 AM ] |
|
Test & fix patch on latest Clojure github branch. |
[CLJ-976] Implement reader literal and print support for PersistentQueue data structure Created: 27/Apr/12 Updated: 06/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Fogus | Assignee: | Fogus |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | data-structures, queue, reader, tagged-literals | ||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Test |
| Description |
|
Clojure's PersistentQueue structure has been in the language for quite some time now and has found its way into a fair share of codebases. However, the creation of queues is a two step operation often of the form: (conj clojure.lang.PersistentQueue/EMPTY :a :b :c) ;=> #<PersistentQueue clojure.lang.PersistentQueue@78d5f6bc> A better experience might be the following: #queue [:a :b :c] ;=> #queue [:a :b :c] (pop #queue [:a :b :c]) ;=> #queue [:b :c] This syntax is proposed and discussed in the Clojure-dev group at https://groups.google.com/forum/?fromgroups#!topic/clojure-dev/GQqus5Wycno Open question: Should the queue literal's arguments eval? The implications of this are illustrated below: ;; non-eval case #queue [1 2 (+ 1 2)] ;=> #queue [1 2 (+ 1 2)] ;; eval case #queue [1 2 (+ 1 2)] ;=> #queue [1 2 3] The answer to this open question will determine the implementation. |
| Comments |
| Comment by Steve Miner [ 27/Apr/12 10:18 AM ] |
|
I think the non-eval behavior would be consistent with the other reader literals in Clojure 1.4. It's definitely better for interop where some other language implementation could be expected to handle a few literal representations, but not the evaluation of Clojure expressions. Use a regular function if the args need evaluation. |
| Comment by Chas Emerick [ 27/Apr/12 10:19 AM ] |
|
The precedent of records seems relevant: => (defrecord A [b])
user.A
=> #user.A[(+ 4 5)]
#user.A{:b (+ 4 5)}
=> #user.A{:b (+ 4 5)}
#user.A{:b (+ 4 5)}
This continues to make sense, as otherwise queues would need to print with an extra (quote …) form around lists — which records neatly avoid: => (A. '(+ 4 5))
#user.A{:b (+ 4 5)}
Does this mean that a queue fn (analogous to vector, maybe) will also make an appearance? It'd be handy for HOF usage. |
| Comment by Fogus [ 27/Apr/12 11:00 AM ] |
|
Added a patch for the tagged literal support ONLY. This is only one part of the total solution. This provides the read-string and printing capability. I'd like more discussion around the eval side before I get dive into the compiler. |
| Comment by Paul Michael Bauer [ 27/Apr/12 6:45 PM ] |
|
In addition to Chas' observations on consistency with record literals, would eval in queue literals open up the same security hole as #=, needing to respect *read-eval*? |
| Comment by Fogus [ 04/May/12 1:14 PM ] |
|
Evalable queue literal support. |
| Comment by Andy Fingerhut [ 10/May/12 5:54 PM ] |
|
Neither of the patches CLJ-976-queue-literal-tagged-parse-support-only.diff dated Apr 27, 2012 nor CLJ-976-queue-literal-eval.diff dated May 4, 2012 apply cleanly to latest master as of May 10, 2012. |
| Comment by Fogus [ 11/May/12 10:15 AM ] |
|
Updated patch file to merge with latest master. |
| Comment by Fogus [ 20/Jul/12 1:14 PM ] |
|
New patch with support fixed for syntax-quote. |
| Comment by Stuart Sierra [ 17/Aug/12 12:41 PM ] |
|
Patch does not apply as of commit f5f4faf95051f794c9bfa0315e4457b600c84cef |
| Comment by Fogus [ 17/Aug/12 3:06 PM ] |
|
Weird. I was able to download the CLJ-976-queue-literal-eval-and-synquote.diff patch and apply it to HEAD as of just now (f5f4faf95051f794c9bfa0315e4457b600c84cef). There were whitespace warnings, but the patch applied, compiles and passes all tests. |
| Comment by Andy Fingerhut [ 17/Aug/12 7:29 PM ] |
|
With latest head I was able to successfully apply patch CLJ-976-queue-literal-eval-and-synquote.diff with this command: git am --keep-cr -s < CLJ-976-queue-literal-eval-and-synquote.diff with some warnings, but successfully applied. If I try it without the --keep-cr option, the patch fails to apply. I believe this is often a sign that either one of the files being patched, or the patch itself, contains CR/LF line endings, which some of the Clojure source files definitely do. The command above (with --keep-cr) is currently the one recommended for applying patches on page http://dev.clojure.org/display/design/JIRA+workflow in section "Screening Tickets". I added the suggested --keep-cr option after running across another patch that applied with the option, but not without it. |
| Comment by Andy Fingerhut [ 28/Aug/12 5:45 PM ] |
|
Presumptuously changing Approval from Incomplete back to Test, since the latest patch does apply cleanly if --keep-cr option is used. |
| Comment by Rich Hickey [ 08/Sep/12 6:48 AM ] |
|
this needs more time |
| Comment by Fogus [ 18/Sep/12 8:15 AM ] |
|
Rich, Do you mind providing a little more detail? I would be happy to make any changes if needed. However, if it's just a matter of its relationship to EDN and/or waiting until the next release then I am happy to wait. In either case, I'd like to complete this or push it to the back of my mind. Thanks. |
| Comment by Andy Fingerhut [ 05/Oct/12 7:49 AM ] |
|
clj-976-queue-literal-eval-and-synquote-patch-v2.txt dated Oct 5 2012 is identical to Fogus's patch CLJ-976-queue-literal-eval-and-synquote.diff dated Jul 20 2012. It simply removes one line addition to clojure.iml that Rich has since added in a different commit, so that this patch now applies cleanly to latest master. |
| Comment by Andy Fingerhut [ 16/Oct/12 12:20 PM ] |
|
clj-976-queue-literal-eval-and-synquote-patch-v3.txt dated oct 16 2012 is identical to Fogus's patch CLJ-976-queue-literal-eval-and-synquote.diff dated Jul 20 2012. It simply removes one line addition to clojure.iml that Rich has since added in a different commit, so that this patch now applies cleanly to latest master. |
| Comment by Andy Fingerhut [ 20/Oct/12 12:26 PM ] |
|
Fogus, with the recent commit of a patch for |
| Comment by Steve Miner [ 06/Apr/13 8:07 AM ] |
|
Related to CLJ-1078. |
[CLJ-970] extend/implement parameterized types (generics) Created: 10/Apr/12 Updated: 01/Mar/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.5 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Jim Blomo | Assignee: | Jim Blomo |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
When extending parameterized types, class files can track the original signatures of the superclass and super interfaces so that the original types can be obtained at run time. This runtime reflection is used in some Java frameworks, and implementing it in Clojure can enable interop. See http://groups.google.com/group/clojure/browse_thread/thread/5efd692804df3f47/1336e591c2eedfa1 for examples of this request. This proposal checks the :parameters keyword in type meta information. If a parameter is found, it is added to the class signature. |
| Comments |
| Comment by Jim Blomo [ 14/Apr/12 11:30 AM ] |
|
2012-04-14 extend-implement-parameterized-types.diff is the correctly formatted `git format-patch master` for this change. It supersedes clojure-parameterized-generics.diff from 2012-04-10. |
| Comment by Andy Fingerhut [ 19/Aug/12 5:00 AM ] |
|
Patch clj-970-extend-implement-parameterized-types-patch2.txt dated Aug 19 2012 is identical to Jim Blomo's patch extend-implement-parameterized-types.diff dated Apr 14 2012, except it has updated context lines so that it applies cleanly to latest master as of today. |
[CLJ-958] Make APersistentVector.iterator slightly more efficient Created: 23/Mar/12 Updated: 14/Aug/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Chris Gray | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Approval: | Not Approved |
| Description |
|
The attached patch uses a sequence to create an iterator for persistent vectors. It should be slightly more efficient for PersistentVector objects than repeatedly calling nth (for reasons that I outline in the commit message). |
[CLJ-957] Typehints for variadic methods in deftype fail to compile Created: 22/Mar/12 Updated: 19/Aug/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3, Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Chris Gray | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Not Approved |
| Description |
|
When a method defined by a protocol has multiple typehinted signatures, it is impossible to implement them using deftype because deftype throws away the typehints. The compiler then looks for the proper signatures (i.e. with typehints) and throws an exception when it can't find them. |
| Comments |
| Comment by Chris Gray [ 22/Mar/12 5:41 PM ] |
|
Clojure-dev discussion started here: http://groups.google.com/group/clojure-dev/browse_thread/thread/1f106a21ec1ce3de |
| Comment by Andy Fingerhut [ 19/Aug/12 4:31 AM ] |
|
Patch clj-957-allow-typehinting-of-method-signatures-in-deftype-patch2.txt dated Aug 19 2012 is identical to Chris Gray's patch 0001-Allow-for-typehinting-of-method-signatures-in-deftyp.patch dated Mar 22, 2012, except it has some updated context lines so that it applies cleanly to latest master. |
[CLJ-955] java object reader constructor doesn't work Created: 18/Mar/12 Updated: 19/Mar/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Brent Millare | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Here is a transcript: ;user=> clojure-version Another transcript from google groups https://groups.google.com/forum/?fromgroups&hl=en#!topic/clojure/vlsFgVaKcSQ user=> (def x #java.net.URL["file:/home/hara/dj/usr/src/clojurescript/src/cljs/cljs/core.cljs"]) user=> (.getProtocol #java.net.URL["file:/home/hara/dj/usr/src/clojurescript/src/cljs/cljs/core.cljs"]) user=> (.getProtocol #java.net.URL["file:/home/hara/dj/usr/src/clojurescript/src/cljs/cljs/core.cljs"]) user=> (def x #java.net.URL["file:///home/hara/dj/usr/src/clojurescript/src/cljs/cljs/core.cljs"]) user=> (defmethod print-dup java.net.URL [o, ^java.io.Writer w] (.write w (str o))) |
| Comments |
| Comment by Andy Fingerhut [ 19/Mar/12 2:58 AM ] |
|
I've confirmed this behavior with 1.4.0 beta5. I've only tracked it down as far as finding the "Can't embed object in code" message, which is easy to find in Compiler.java in method emitValue. That exception is thrown because printString in RT.java throws an exception. It isn't clear to me what should be done instead, though. |
| Comment by Fogus [ 19/Mar/12 9:03 AM ] |
|
What would it mean to construct an arbitrary Java object for the purpose of embedding it in code in a generic way? You could say that it's just a matter of calling its constructor with the right args but very often in Java that is not enough to make an object considered "initialize". Sometimes there are init methods or putters or whatever that are required for object construction. So right there I hope it's clear that even though #some.Klass["foo"] provides a way to call an arbitrary constructor, it's in no way a guarantee that an instance is properly constructed. The reason that (for example) defrecords are embeddable anywhere is because we know for certain that the constructor creates a fully initialized instance. If you need to embed specific instances in your own code then you have two options:
Quick point of note: Your code (defmethod print-dup java.net.URL [o, ^java.io.Writer w] (.write w (str o))) Doesn't do what you think it does. It spits out exactly file:///home/hara/dj/usr/src/clojurescript/src/cljs/cljs/core.cljs that Clojure reads in as a symbol. Something like the following might be more appropriate: (defmethod print-dup java.net.URL [o, ^java.io.Writer w] (.write w "#java.net.URL") (.write w (str [ (str o) ]))) (let [x #java.net.URL["file:///home/hara/dj/usr/src/clojurescript/src/cljs/cljs/core.cljs"]] (printf "(class x)=%s x='%s'\n" (class x) x) x) ; (class x)=class java.net.URL x='file:/home/hara/dj/usr/src/clojurescript/src/cljs/cljs/core.cljs' ;=> #<URL file:/home/hara/dj/usr/src/clojurescript/src/cljs/cljs/core.cljs> (.getProtocol *1) ;=> "file" |
| Comment by Brent Millare [ 19/Mar/12 10:09 AM ] |
|
Fogus, can you please elaborate on using clojure 1.4's tagged literal features. While I understand that you can define data-reader functions, for example (binding [*data-readers* {'user/f (fn [x] (java.io.File. (first x)))}] (read-string "#user/f [\"hello\"]")) ;=> #<File hello>
however, I feel this is only half a fix, compared with the first mentioned solution (involving print-dup), since clojure's tagged literals only are important for reading, not for printing. Does using tagged literals, so that (read-string (pr-str (read-string ...) works, imply that you must also define print methods per class? If this is true, it seems problematic since if different code wants to define different print methods, this will conflict since defining print-dup methods is global. Is there a good solution for printing objects depending on the context? As an alternative solution, I propose making the default print-method of all objects that didn't already have a printed representation to be a tagged literal, this way, users can customize what it means to read it. (See https://groups.google.com/forum/?fromgroups&hl=en#!topic/clojure/GdT5cO6JoSQ ) |
| Comment by Fogus [ 19/Mar/12 10:18 AM ] |
|
"Fogus, can you please elaborate on using clojure 1.4's tagged literal features." I can, but it falls outside of the scope of this particular ticket. It might be better to take the broader conversation to the design page at http://dev.clojure.org/display/design/Tagged+Literals and the clojure-dev list. Has the original motivation for this ticket been addressed? |
| Comment by Brent Millare [ 19/Mar/12 10:26 AM ] |
|
I think you've explained the underlying problem, so yes. One possible caveat might be that it may be a concern that the current error message is not telling that the underlying problem lies in an improperly initialized object. (or maybe it is, and that's the error message I should expect). |
[CLJ-946] eval reader fail to recognize function object Created: 06/Mar/12 Updated: 07/Mar/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Naitong Xiao | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
(defmacro stubbing [stub-forms & body] This macro is from Clojure In Action , whith the commented line rewrited (I know that original is better) (def ^:dynamic $ (fn [x] (* x 10)) (stubbing [$ 1] ;;macro can expanded I thought there is something wrong with eval reader, but i can't figure it out btw the above code can run on clojure-clr |
| Comments |
| Comment by Michael Klishin [ 06/Mar/12 11:24 PM ] |
|
As far as I know, Clojure in Action examples are written for Clojure 1.2. What version are you using? |
| Comment by Naitong Xiao [ 07/Mar/12 1:24 AM ] |
|
I use clojure 1.3 The example in Clojure In Action is Ok on clojure 1.3 |
[CLJ-941] NullPointerException possible with seq-zip Created: 26/Feb/12 Updated: 26/Feb/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Greg Chapman | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
For example: Clojure 1.3.0 Possibly the make-node function for seq-zip should be: (fn [node children] (with-meta (or children ()) (meta node))) |
| Comments |
| Comment by Greg Chapman [ 26/Feb/12 5:54 PM ] |
|
Also the docstring for zipper should probably be updated to indicate that the children parameter can be nil. |
[CLJ-938] Output of clojure.reflect is not suitable for type hints Created: 23/Feb/12 Updated: 24/Feb/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Brandon Bloom | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
I'm trying to write a macro which generate reify forms using some reflection. clojure.reflect produces type symbols similar to 'java.util.Iterator<> Unfortunately, the compiler doesn't accept the <> syntax in type hints: (reify Iterable (^{:tag java.util.Iterator} iterator [this] nil)) ; works (reify Iterable (^{:tag java.util.Iterator<>} iterator [this] nil)) ;; fails It seems like the compiler should understand the <> just enough to strip it, rather than reject it. This would make it much easier to write correct macros involving type hinting and reflection. The workaround I have been using is: (defn hint |
| Comments |
| Comment by Brandon Bloom [ 24/Feb/12 1:37 AM ] |
|
I'm sorry, I got this wrong earlier. The problem is real, but it's arrays, not generics. My workaround is useless... :-/ |
[CLJ-937] cl-format prints ratio arguments with bad format for E, F, G directives Created: 21/Feb/12 Updated: 08/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3, Release 1.4 |
| Fix Version/s: | Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Andy Fingerhut | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
user=> (use 'clojure.pprint) Patch changes cl-format so that when E, F, or G directive is used, the corresponding arg is coerced from a clojure.lang.Ratio to a double before formatting. |
| Comments |
| Comment by Tom Faulhaber [ 29/Mar/12 8:48 PM ] |
|
I have reviewed this patch and recommend that it be applied. (This one has actually been on my to do list for about 4 years. Thanks, Andy!) |
| Comment by Andy Fingerhut [ 08/Apr/13 12:02 PM ] |
|
Patch clj-937-cl-format-coerces-ratios-patch2.txt dated Apr 8 2013 supersedes the previous patch cl-format-efg-coerce-ratios-to-doubes-patch1.txt dated Feb 21 2013. The newer patch works with ratios that cannot be represented as a double, using BigDecimal in those cases. The older patch would print garbage from the string "Infinity" if the ratios were larger than Double/MAX_VALUE, or 0 if the ratio was between 0 and Double/MIN_VALUE. |
[CLJ-935] clojure.string/trim uses different defn of whitespace as triml, trimr Created: 21/Feb/12 Updated: 11/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.6 |
| Fix Version/s: | Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Andy Fingerhut | Assignee: | Aaron Bedra |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
clojure.string/triml and trimr use Character/isWhitespace to determine whether a character is whitespace, but trim uses some other definition of white space character. For example: user=> (use 'clojure.string) The attached patch changes trim to use Character/isWhitespace. I suppose other possibilities are to change triml and trimr to use trim's notion of whitespace, whatever that is, or to just leave these functions inconsistent with each other. It does seem that it would be a nice property that (trim s) is equal to (triml (trimr s)) for all strings. The patch also changes triml to only call .length on s once. |
| Comments |
| Comment by Stuart Halloway [ 08/Jun/12 10:22 AM ] |
|
Question for Rich: do we want to be consistent across the different trim fns (per this patch) or consistent with Java, which uses one definition of whitespace in Character/isWhitespace, and a different definition in String/trim? |
| Comment by Stuart Halloway [ 08/Jun/12 10:22 AM ] |
|
Question for Andy: why the (int ...) forms, when Clojure only works with primitive longs? |
| Comment by Andy Fingerhut [ 08/Jun/12 10:33 AM ] |
|
Answer for Stuart: Looks like I was preserving the (int ...) form that was in triml before, perhaps somewhat mindlessly. Depending on Rich's answer, I can update the patch if desired. |
| Comment by Aaron Bedra [ 11/Apr/13 5:34 PM ] |
|
Bump on the discussion. This ticket seems blocked until we make a decision. |
[CLJ-929] Accessing Java property starting with _ has issues in 1.4 Created: 07/Feb/12 Updated: 09/Feb/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.4 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Alan Malloy | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
When attempting to use interop syntax with symbols which aren't legal Java names (such as deleted?), the names are mangled a bit. That's necessary, of course, and the method of munging can be internal to the compiler. However, the behavior when munging changed a little between 1.3 and 1.4 beta1. Obviously the specifics of munging are something I should avoid relying on, but the way it changed looks like an accident or a bug even so. The use-case I ran into is that defrecords contain a field named __meta for tracking their metadata. In both 1.3 and 1.4 you can get at that field with (. record __meta), which avoids munging. But on 1.3 (. record --meta) also accesses it (translating each - to a _), while on 1.4 (. record -meta) works and (. record --meta) doesn't. Actually, looking at line 883 of Compiler.java, it looks like this may be related to the (. foo -property) syntax ported from CLJS, and indeed (. record ---meta) works, I guess by reducing to an "old style" (. record --meta). So that clears up why --meta fails: it's looking for __meta. I'm still not clear on why (. record -meta) works, though. So it looks like the - prefix for properties is not 100% backwards-compatible like it seemed to be. Is this an issue we need to fix, or is the recommendation simply to never have fields that start with - or _? |
| Comments |
| Comment by Fogus [ 09/Feb/12 2:33 PM ] |
|
Is this a general problem with fields starting with _ or just fields named __meta as in (defrecord [__meta] ...) |
| Comment by Alan Malloy [ 09/Feb/12 3:01 PM ] |
|
It's a general issue. (defrecord [__meta]) actually breaks immediately, because the record mechanism itself generates a field named __meta, but any field named with a - or _ prefix has this issue. user=> (defrecord Foo [-blah]) |
[CLJ-908] Functions with metadata print poorly Created: 10/Jan/12 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3, Release 1.4 |
| Fix Version/s: | Release 1.6 |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Alan Malloy | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Approval: | Ok |
| Waiting On: | Rich Hickey |
| Description |
|
1.3 removed the metadata slot on most functions, and made .withMeta return a new wrapping function that provides metadata. This changes the way functions with metadata print: instead of #<user$eval595$fn_596 user$eval595$fn_596@3d48ff04> we now see #< clojure.lang.AFunction$1@581de498>. I might argue that we should "lie" and print the class of the original wrapped function since it's more useful than AFunction$1, but that's debatable. The two things I propose changing are:
If it would be desirable to print the class of the original "wrapped" function, then I can easily add another patch for that. |
| Comments |
| Comment by Andy Fingerhut [ 19/May/12 3:30 AM ] |
|
clj-908-Print-metadata-and-anonymous-classes-better-patch2.txt dated May 19, 2012 only has context line changes from the previous one, 0001-Print-metadata-and-anonymous-classes-better.patch dated Jan 10, 2012. The previous one no longer applies cleanly to the latest master, while the new one does. |
| Comment by Stuart Sierra [ 09/Nov/12 9:21 AM ] |
|
Screened. |
[CLJ-900] Document defonce-like behavior of defmulti Created: 19/Dec/11 Updated: 19/Dec/11 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.2, Release 1.3 |
| Fix Version/s: | None |
| Type: | Task | Priority: | Minor |
| Reporter: | Rasmus Svensson | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | documentation | ||
| Description |
|
Since Clojure 1.2 defmulti behaves similarly to defonce. This fact, and how one deals with it when doing interactive development, does not seem to be documented anywhere. This issue pops up fairly regularly in the #clojure channel. Commit that introduced the change: https://github.com/clojure/clojure/commit/1b8d5001ba094053b24c55829994785be422cfbf I can volunteer to update the docstrings and (if I get access to it) the clojure.org page. |
[CLJ-896] Make browse-url aware of xdg-open Created: 13/Dec/11 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | Release 1.6 |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Jasper Lievisse Adriaanse | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 3 |
| Labels: | None | ||
| Environment: |
All platforms that provide xdg-open (as part of freedesktop.org) benefit from this. Fix was tested on OpenBSD. |
||
| Attachments: |
|
| Patch: | Code |
| Approval: | Ok |
| Waiting On: | Rich Hickey |
| Description |
|
clojure.java.browse/browse-url tests to see if it's running on Mac OS to fall back to "/usr/bin/open" in order |
| Comments |
| Comment by Andy Fingerhut [ 28/Feb/12 6:19 PM ] |
|
|
| Comment by Andy Fingerhut [ 29/Feb/12 1:18 PM ] |
|
clj-896-browse-url-uses-xdg-open-patch2.txt is based more on the patch attached to I think this patch improves on both of the previous patches for CLJ-896 and Tested on: Mac OS X 10.6.8 It would be great if someone could test it on a BSD system. The only possible issue I can think of is whether the output of the "which" command is different there than on the Linux system I tested. If someone wants to make a patch that doesn't use "which", but instead checks the PATH, I'd recommend they also test on Windows in cmd.exe to make sure it works correctly there. |
| Comment by Stuart Sierra [ 09/Nov/12 9:04 AM ] |
|
Screened. Verified on Mac OS X. |
| Comment by Jasper Lievisse Adriaanse [ 09/Nov/12 9:41 AM ] |
|
And I've tested it on OpenBSD. |
[CLJ-891] make (symbol foo "bar") work with foo being a namespace Created: 05/Dec/11 Updated: 02/Mar/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | Reviewed Backlog |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Joe Gallo | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 3 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
I've run across the need to do (symbol ns "bar") a few times, and the existing approach (symbol (name (ns-name ns)) "bar") just doesn't seem like it ought to be the only way to do the job. Includes a patch to make this work, by adding a new arity to Symbol.intern(). Some discussion on this idea, here: https://groups.google.com/forum/#!topic/clojure/n25aZ5HA7hc/discussion |
| Comments |
| Comment by Stuart Halloway [ 09/Dec/11 9:39 AM ] |
|
I am not sure I like this, but I would like a rethink of names and namespaces. Doing a lot of cross language work, it would be great to have protocols for "I have a name" and for "I have a namespace". With such protocols in place, it would also be possible to separately consider implementing symbol et al in terms of them. |
| Comment by Kevin Downey [ 09/Dec/11 12:24 PM ] |
|
Named being a protocol or an interface seems orthogonal to being able to create a symbol qualified with a namespace when you have a namespace in hand. I don't think the patch goes far enough, not only should (symbol ns "foo") be supported, but also (symbol ns 'foo), given that (symbol 'foo) works and (symbol "foo") works, (symbol 'bar 'foo) should also work, but doesn't. if Named is a protocol, and if you extend it to String, and if you make the symbol function create symbols from one or two Named things you still end up having to do (symbol (ns-name ns) 'foo) or (symbol (ns-name ns) "foo") |
| Comment by Joe Gallo [ 16/Dec/11 4:18 PM ] |
|
Stuart, I'm not opposed to the idea of separate protocols for Named and Namespaced. Where should I go about creating a proposal to create those protocols and get them into clojure? I'm interested in doing the leg-work, or being a part of it. But as an outsider, I don't know what to do next – creating a ticket in Jira exhausted my knowledge of the process. |
| Comment by Frank Siebenlist [ 02/Mar/12 4:53 PM ] |
|
The same enhancement that joe suggests for symbol, would also apply to keyword. See: http://groups.google.com/group/clojure/browse_thread/thread/222e4abc16df8b20 Probably same/similar solution applies to both issues. -FrankS. |
[CLJ-889] Specifically allow '.' inside keywords Created: 01/Dec/11 Updated: 15/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | Reviewed Backlog |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Howard Lewis Ship | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | keywords, reader | ||
| Description |
|
The documentation for keywords (on page http://clojure.org/reader) specifically states that '.' is not allowed as part of a keyword name; however '.' is specifically useful. For example, several web frameworks for Clojure use keywords to represent HTML elements, using CSS selector syntax (i.e., :div.important is equivalent to <div class='important'>). In any case, the use of '.' is not checked by the reader and it is generally useful. I would like to see '.' officially allowed (in the documentation). Further, I'd like to see additional details about which punctuation characters are allowed (my own web framework uses '&', '?' and '>' inside keywords for various purposes ... again, current reader implementation does not forbid this, but if a future reader will reject it, I'd like to know now). |
| Comments |
| Comment by Howard Lewis Ship [ 08/Dec/11 3:37 PM ] |
|
To clarify, Hiccup and Cascade both use keywords containing '#' and '.' Cascade goes further, using '&' (to represent HTML entities), '>', and (possibly in the future) '?'. |
| Comment by Devin Walters [ 20/Oct/12 6:46 PM ] |
|
I think the EDN spec mitigates some of the concern, but as of yet the official clojure.org reader documentation does not reflect the language used in the description of EDN. Where does EDN stand right now? Can the description being used on the github page be pulled over to clojure.org? References:
|
| Comment by Howard Lewis Ship [ 15/Apr/13 5:56 AM ] |
|
Unfortunately, the EDN specification does not mention '>'. |
[CLJ-888] defprotocol should throw error when signatures include variable number of parameters Created: 29/Nov/11 Updated: 29/Nov/11 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Greg Chapman | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
I tried to use & in the signature for a method in defprotocol. Apparently (see below), this is compiled so that & becomes a simple parameter name, and there is no special handling for variable number of parameters. I think the use of & in a protocol signature ought to be detected and immediately cause an exception (I also think this restriction on the signatures ought to be documented; I couldn't find it specified in the current documentation, though of course it is implied (as I later realized) by the fact that defprotocol creates a Java interface). user=> (defprotocol Applier (app [this f & args])) |
[CLJ-880] syntax-quote should be a macro instead of implemented inside the reader Created: 17/Nov/11 Updated: 17/Nov/11 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Kevin Downey | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
syntax-quote is currently a somewhat gnarly bit of java code in LispReader.java, would be great to replace it with a (hopefully less gnarly) clojure macro. LispReader.java would be required to do something similar to 'x => (quote x). `x => (syntax-quote x) , ~x => (unquote x), ~@x => (unquote-splicing x) |
[CLJ-878] DispatchReader always calls CtorReader when no dispatch macro found Created: 15/Nov/11 Updated: 15/Nov/11 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Greg Chapman | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Windows 7, Java 1.7 |
||
| Description |
|
At the REPL, I accidentally typed: user=> # "\w+" You can see the confusing result (the REPL is also left in an unclosed string). After looking at LispReader.java, it seems to me DispatchReader ought to at least check for whitespace before calling CtorReader (perhaps better would be to check for a valid symbol character). Another example: user=> (defrecord X [x]) I'm assuming the fact that the above successfully creates an X is accidental. |
[CLJ-873] Allow the function / to be referred to in namespaces other than clojure.core Created: 10/Nov/11 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.1, Release 1.2, Release 1.3, Release 1.4 |
| Fix Version/s: | Release 1.6 |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Chris Gray | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 7 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Ok |
| Description |
|
The attached patch gives the programmer the option of referring to the division function in namespaces other than just clojure.core. For example, (ns foo The above lines do not compile without this patch. |
| Comments |
| Comment by Chris Gray [ 10/Nov/11 9:50 AM ] |
|
I have signed the CA and it is in the mail. |
| Comment by Chris Gray [ 20/Nov/11 6:21 PM ] |
|
My CA has now been applied. This patch is quite simple – can someone have a look at it please? |
| Comment by Alex Miller [ 09/Dec/11 9:34 AM ] |
|
FYI, I have run into this in actual code as well (implementing a query language function library). |
| Comment by Andy Fingerhut [ 24/Feb/12 8:00 PM ] |
|
clj-873-namespace-divides-patch.txt is same as Chris's, just updated to apply cleanly to latest master as of Feb 24, 2012. The test he added does fail without the code fix, and passes with it. He is now on the list of contributors. |
| Comment by Chris Gray [ 30/Mar/12 1:11 PM ] |
|
A short further discussion of this patch appeared here: http://groups.google.com/group/clojure-dev/browse_thread/thread/f095980802a82747/b723726c77c1ec64 Also, I assume this bug is what is referred to in Clojurescript's core.cljs, where it says ";; FIXME: waiting on cljs.core//" |
| Comment by Stuart Halloway [ 22/Oct/12 7:12 PM ] |
|
Thanks all. It is nice to have supporting real-world stories such as Alex's in the comments. |
| Comment by Andy Fingerhut [ 22/Oct/12 7:19 PM ] |
|
I should have added a comment here a while back if it would have helped, but David Nolen's |
| Comment by Brandon Bloom [ 02/Jan/13 12:49 AM ] |
|
This also affects a two of my libraries: 1) CSS generation library I'm working on, which wants to be able to do division with pixels and other units. 2) Factjor which defines binary math operators against a stack. |
[CLJ-862] pmap level of parallelism inconsistent for chunked vs non-chunked input Created: 23/Oct/11 Updated: 20/Oct/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.1, Release 1.2, Release 1.3, Release 1.4 |
| Fix Version/s: | Reviewed Backlog |
| Type: | Defect | Priority: | Minor |
| Reporter: | Marshall T. Vandegrift | Assignee: | Jim Blomo |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
The code of pmap creates futures for the set of map operations it needs to perform with (map #(future %) coll), then acts on that sequence in a fashion obviously intended to keep only #CPUs+2 unfinished futures realized at any given time. It works exactly this way for non-chunked input seqs, but when pmap is passed a chunked seq, the seq of futures also becomes chunked. This causes an arbitrary number of futures to be realized as the #CPUs+2 window and chunk-size window interact. The doc-string for pmap doesn't promise any particular level of parallelism, but I think the inconsistent parallelism for chunked vs non-chunked input comprises a bug. |
| Comments |
| Comment by Stuart Halloway [ 25/Oct/11 6:51 PM ] |
|
Next person to take a deep look at pmap should probably also think through fork/join. |
| Comment by Jim Blomo [ 19/May/12 12:31 AM ] |
|
fork/join is a Java 7 feature. Would a proposed patch need to be able to fall back to Java 5 features? |
| Comment by Andy Fingerhut [ 19/May/12 1:06 AM ] |
|
Clojure/core folks can say more authoritatively, but I believe with the recent reduce enhancements that rely on jsr166 code, Clojure 1.5 will most likely require Java 6 or later, and Java 5 will no longer be supported. |
| Comment by Jim Blomo [ 28/May/12 5:29 PM ] |
|
Spinning up more threads than CPU cores is not a good idea when the work is CPU bound. Currently (1.4) pmap uses an unbounded thread pool, so chunked sequences will create more threads than intended. The least invasive change is to use a fixed sized thread pool (ForkJoinPool being one example). pmap is differentiated from core.reducers by the fact that it is lazy. This implies a one-at-a-time ThreadPool.submit model, instead of the recursive fork/join model. Tradeoffs include: Enforce look-ahead even on chunked sequences:
Move to a fixed size thread pool:
Use ForkJoinPool for fixed thread pool (instead of newFixedThreadPool):
I think using a traditional fixed size thread pool is the right option. Most of the time all of pmap's results will be realized, so I don't think it's worth saving work by being strict about the look-ahead size. This is also the decision map has made. Since we're not using ForkJoin's main strength (recursive work queuing), I don't think it is worth setting it up in clojure.core. I'll use Agent/pooledExecutor as the fixed size thread. Let me know if I forgot or misunderstood anything. |
| Comment by Jim Blomo [ 28/May/12 7:59 PM ] |
|
2012-05-28 pmap-chunking-862.diff uses a fixed size thread pool for pmap functions. |
[CLJ-858] Improve speed of STM by removing System.currentTimeMillis Created: 17/Oct/11 Updated: 01/Mar/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3 |
| Fix Version/s: | Release 1.6 |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Stefan Kamphausen | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 2 |
| Labels: | None | ||
| Environment: |
Tested on Ubuntu and OSX |
||
| Attachments: |
|
| Patch: | Code |
| Description |
|
Original post: https://groups.google.com/d/topic/clojure/kc99LcUK8Tk/discussion This patch removes the milliseconds from inner class TVal in LockingTransaction.java and Ref.java. Using a little test suite[1] a increase of performance by up to 25% could be measured. If necessary I can recreate the patch against current MASTER. References: |
[CLJ-849] Add a pseudo-variable containing the current line number Created: 07/Oct/11 Updated: 14/Nov/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | G. Ralph Kuntz, MD | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Environment: |
Any |
||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
Add a pseudo-variable (similar to *file*), containing the current line number. This should be available during AOT compilation. The name "*line-number*" might be good. It will be useful for diagnostic log messages. Using exception stack traces has poor runtime performance and the line number should be available to the compiler at minimal cost. |
| Comments |
| Comment by Peter Siewert [ 14/Nov/12 3:41 PM ] |
|
Adding initial patch. A symbol's position is now stored in its metadata, just like a seq when it is read with the LispReader. The Compiler.LINE and Compiler.COLUMN values are now updated as each symbol is analyzed. This provides more exact line and column numbers for Compiler errors which will resolve ticket CLJ-420. The Compiler.LINE variable has been interned as clojure.core/line-number Adding extra metadata to symbols resulted in some tests failing due to the extra values. The failing tests have been updated to ignore the new metadata keys. |
[CLJ-842] clojure.pprint uses the old-style metadata. Created: 26/Sep/11 Updated: 14/Nov/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Baishampayan Ghose | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
I was looking through the implementation of clojure.pprint.* and found that it still uses the old-style metadata to mark vars as private - ^{:private true} instead of ^:private. I have migrated the metadata to the new style in the attached trivial patch, which can be used in case this is deemed to be an issue. FWIW, there are some other namespaces which use the old-style metadata as well; I am willing to fix those as well. |
| Comments |
| Comment by Andy Fingerhut [ 14/Nov/12 1:19 PM ] |
|
clj-842-update-clojure.pprint-metadata-v2.txt dated Nov 14 2012 is identical to Baishampayan Ghose's 0001-Migrate-the-metadata-in-clojure.pprint.-to-the-new-s.patch dated Sep 26, 2011, except it applies cleanly to latest master. |
[CLJ-835] defmulti doc string doesn't mention needing to be passed a var for the value of :hierarchy Created: 02/Sep/11 Updated: 19/Dec/12 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.2 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Hugo Duncan | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Environment: |
1.2, 1.3 beta3 |
||
| Attachments: |
|
| Patch: | Code |
| Approval: | Incomplete |
| Description |
|
The :hierarchy option for defmulti should be passed a var, but this is not mentioned in the doc string. The error message from passing the hierarchy directly is rather cryptic: Evaluation aborted on java.lang.ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to clojure.lang.IRef (SOURCE_FORM_44:19). |
| Comments |
| Comment by Meikel Brandmeyer [ 14/Sep/11 3:11 PM ] |
|
Modified doctoring to clarify the usage of :hierarchy. |
| Comment by Scott Lowe [ 10/May/12 5:16 PM ] |
|
New patch: '0001-CLJ-835-Refine-doc-string-for-defmulti-hierarchy-opt.patch' 10/May/12. I've attached a new doc string patch in response to Andy Fingerhut's request posted here: https://groups.google.com/forum/?fromgroups#!topic/clojure-dev/i7H82fJYL-U Andy's request stated "Attached patch seems to have spelling mistakes, and perhaps could be worded more clearly." I hope my new patch is an improvement upon what was there. This patch supersedes '0001-Clarify-docstring-for-defmulti.patch' from 14/Sep/11. |
| Comment by Fogus [ 16/Aug/12 2:49 PM ] |
|
This is a million times better than what was there before, but (who knew!?) it could be better. A couple points of contention:
|
| Comment by Rich Hickey [ 19/Dec/12 7:58 AM ] |
|
Please leave examples out of docs strings. Use precise language. |
[CLJ-823] Piping seque into seque can deadlock Created: 03/Aug/11 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Greg Chapman | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Environment: |
Windows 7; JVM 1.6; Clojure 1.3 beta 1 |
||
| Approval: | Vetted |
| Description |
|
I'm not sure if this is a supported scenario, but the following deadlocks in Clojure 1.3: (let [xs (seque (range 150000)) As I understand it, the problem is that ys' fill takes place on an agent thread, so when it calls xs' drain, the (send-off agt fill) does not immediately trigger xs' fill, but is instead put on the nested list to be performed when ys' agent returns. Unfortunately, ys' fill will eventually block trying to take from xs, and so it never returns and the pending send-offs are never sent. Wrapping the send-off in drain to: (future (send-off agt fill)) is a simple (probably not optimal) way to fix the deadlock. |
| Comments |
| Comment by Peter Monks [ 07/Jan/13 3:43 PM ] |
|
Reproduced on 1.4.0 and 1.5.0-RC1 as well, albeit with this example: (seque 3 (seque 3 (range 10))) |
| Comment by Stuart Halloway [ 30/Mar/13 9:16 AM ] |
|
release-pending-sends? |
[CLJ-821] should reify merge rather than replace on repeated specs? Created: 20/Jul/11 Updated: 09/Aug/11 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | Backlog |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Alan Malloy | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Description |
|
reify, deftype, and the like fail silently if you specify a class twice: (macroexpand '(reify Map (size [this] 0), The later Map section entirely supersedes the former, which I discovered when I wrote a macro that injects some automated method bodies into a reify for you. I've attached a fix to make the above expand to the expected [for me, anyway] output. |
| Comments |
| Comment by Stuart Halloway [ 25/Jul/11 5:01 PM ] |
|
In Clojure, it is generally the case that redefining something replaces the original, as opposed to augmenting it by merging the old and the new. This makes it easy to reason locally about how code works. One could argue that the following snippet has the same kind of issue you describe: (defn foo [a] 1) (defn foo [a b] 1) (foo 1) ; is it a bug that the first arity is gone? I also wonder whether the current behavior might be a convenience for some macros. (Clearly it wasn't for yours!) I am changing the type and title of the ticket to better reflect the nature of the request and see what the BDFL says. |
| Comment by Rich Hickey [ 29/Jul/11 7:32 AM ] |
|
Everything in this ticket needs to be said with more precision. I don't know what exactly the problem is nor what the proposed solution is. One thing to note is that it is necessary to accept definitions under base interfaces, so the class areas are not strict, nor expected to be complete. |
| Comment by Alan Malloy [ 09/Aug/11 2:16 PM ] |
|
Stuart: The two foo forms you give are entirely separate, and to unify the two behaviors you would have to group them together. It's not at all unreasonable to suppose the user wants to define foo once, fiddle with it, and then redefine it - clojure.core does similar stuff with let, reduce, etc. As written, deftype/reify have a somewhat similar "look" - because there is nothing physically grouping the declaration of Map with its functions, it's not clear what should happen when a heading like Map is given twice, and it's not specified in the docs. I think the difference is that in the reify case, the two are in the same top-level form, so the compiler can detect that you're trying to do something "weird", so a silent redefinition (reasonable for your defn example) is surprising. There are a number of solutions that would reduce this surprise: 1) Permit or require reify to group things, as in (reify (Comparable (compare [this other] 1))). Then the explicit grouping of Comparable with its methods serves two purposes: it implies that other definitions for Comparable should be included in that grouping; and it makes it easier to do that, because you can just iterate over forms until you find Comparable, and then insert another definition. 2) Throw an exception if an interface is specified twice. This is not ideal because it can be a lot of work for the user to group things together themselves, while it's easy for deftype to do given the grouping it's already doing. However, it would avoid the confusion and surprise, by saying "that's not allowed" rather than leaving the user guessing what's gone wrong. 3) Interpret my original example code as an attempt to open the Map interface, add implementations, and then later add some more implementations. I would have liked reify to implement (1) to begin with, but at this point I don't think the syntax is backwards-compatible, so it doesn't seem like a good idea. I suppose either (2) or (3) is fine, and they both seem like an improvement over the current confusing behavior. Of course, I prefer (3), but I can understand a desire to make reify reject syntax that is not immediately obvious in intent rather than interpreting it as what I think is the most useful intent. |
[CLJ-809] fn's created using defn should not lexical shadow the var that holds them Created: 11/Jun/11 Updated: 29/Jul/11 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.2 |
| Fix Version/s: | None |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Kevin Downey | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
currently (defn foo [x] (foo x)) expands to something like (def foo because of this lexical shadowing self calls to fns defined with defn the lexical shadowing also breaks memoization if you create the 1.3 has changes to eliminate some of the cost of going through the var. since going through the var is much cheaper now it would be nice to http://groups.google.com/group/clojure-dev/browse_thread/thread/33b52b24616967f?hl=en |
| Comments |
| Comment by Kevin Downey [ 11/Jun/11 2:40 PM ] |
|
tests indicate that accessing the fn through the var vs. accessing through the lexical binding have very similar access times https://gist.github.com/1013008 results in $ java -jar clojure.jar ~/src/lexicaltest.clj |
| Comment by Jason Wolfe [ 13/Jun/11 5:05 PM ] |
|
Here's another test that makes sure no JIT funny business (e.g. dead code elimination) is going on, and also looks at primitive hinted versions. https://gist.github.com/1023816 var-obj result, time: 14930352 ,"Elapsed time: 965.577 msecs" I'm not sure how to properly hint the var in the var-prim version to get truly comparable results. In any case, this use case should definitely be kept in mind. |
| Comment by Kevin Downey [ 13/Jun/11 5:35 PM ] |
|
I think the point is we want to make sure the jvm can optimize both just as well, so making the code purposefully unoptimizable is kind of silly, yes? |
| Comment by Jason Wolfe [ 21/Jun/11 4:41 PM ] |
|
@Kevin In your gist, the return value of foo is not used, and foo has no side effects. A sufficiently smart compiler could optimize the calls out entirely, which would not tell us much about the runtime of foo. |
| Comment by Aaron Bedra [ 28/Jun/11 6:49 PM ] |
|
Rich: Given the performance testing (in the email thread) what is the next step here?
Are there things that this might break that we need to consider? |
| Comment by Rich Hickey [ 29/Jul/11 7:39 AM ] |
|
Someone needs to make a patch, and then test perf with and without the patch. These simulated tests aren't necessarily indicative. Naive fib is an ok test once you have a patch. And yes, more things might break - needs careful assessment. |
[CLJ-807] hash-maps print-dup as literal, thus can be read as array-maps Created: 07/Jun/11 Updated: 29/Jul/11 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3 |
| Fix Version/s: | Approved Backlog |
| Type: | Defect | Priority: | Minor |
| Reporter: | Alexander Taggart | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
Per Rich in user=> (hash-map :k :v)
{:k :v}
user=> (type *1)
clojure.lang.PersistentHashMap
user=> (binding [*print-dup* true] (print-str *2))
"{:k :v}"
user=> (read-string *1)
{:k :v}
user=> (type *1)
clojure.lang.PersistentArrayMap
The cause is due to RT.map conditionally creating an array-map if the size is within the PersistentArrayMap.HASHTABLE_THRESHOLD. |
| Comments |
| Comment by Aaron Bedra [ 28/Jun/11 6:47 PM ] |
|
Rich: do you want a patch for this? |
| Comment by Rich Hickey [ 29/Jul/11 7:42 AM ] |
|
Only if it important to someone, solves some problem. |
[CLJ-803] IAtom interface Created: 27/May/11 Updated: 04/Jul/11 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | Approved Backlog |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Pepijn de Vos | Assignee: | Aaron Bedra |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code |
| Description |
|
Atom and the other reference types do not have interfaces and are marked final. Use cases for interfaces for the reference types include database wrappers. CouchDB behaves exactly like compare-and-set! and is shared, synchronous, independent state, so it makes sense to use the Atom interface to update a CouchDB document. I talked to Rich about this, and he said "patch welcome for IAtom", complete conversation: http://clojure-log.n01se.net/date/2010-12-29.html#10:04c |
| Comments |
| Comment by Stuart Halloway [ 27/May/11 2:33 PM ] |
|
Please add a patch formatted by "git format-patch" so that attribution is included. |
| Comment by Pepijn de Vos [ 04/Jun/11 5:56 AM ] |
|
I added the formatted patch a few days ago. Does 'no news is good news' apply here? And, silly question, will it make it into 1.3? I can't figure out how to tell Jira to show me that. |
| Comment by Kevin Downey [ 04/Jul/11 9:06 PM ] |
|
I fail to see the need for an IAtom, if you want something atom like for couchdb the interfaces are already there. Maybe I ICompareAndSwap. Atoms and couchdb are different so making them appear the same is a bad idea. http://en.wikipedia.org/wiki/Fallacies_of_Distributed_Computing http://clojure.org/state one of the distinctions between agents and actors raised in the section titled "Message Passing and Actors" is local vs. distributed and the same distinction can be made between couchdb (regardless of compare and swap) and atoms |
| Comment by Aaron Bedra [ 04/Jul/11 9:18 PM ] |
|
This ticket has already been moved into approved backlog. It will be revisited again after the 1.3 release where we will take a closer look at things. For now, this will remain as is. |
[CLJ-787] transient blows up when passed a vector created by subvec Created: 03/May/11 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Backlog |
| Fix Version/s: | Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Alexander Redington | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Approval: | Vetted |
| Description |
|
Subvectors created with subvec from a PersistentVector cannot be made transient: user=> (transient (subvec [1 2 3 4] 2)) ClassCastException clojure.lang.APersistentVector$SubVector cannot be cast to clojure.lang.IEditableCollection clojure.core/transient (core.clj:2864) |
| Comments |
| Comment by Stuart Sierra [ 31/May/11 9:28 AM ] |
|
Confirmed. APersistentVector$SubVector does not implement IEditableCollection. The current implementation of TransientVector depends on implementation details of PersistentVector, so it is not a trivial fix. The simplest fix might be to implement IEditableCollection.asTransient in SubVector by creating a new PersistentVector, but I do not know the performance implications. |
[CLJ-783] clojure.inspector/inspect-tree doesn't work on sets --patch in the description by Jason Wolfe Created: 28/Apr/11 Updated: 12/Apr/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | Release 1.6 |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Armando Blancas | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 1 |
| Labels: | None | ||
| Environment: |
Any |
||
| Attachments: |
|
| Patch: | Code |
| Approval: | Ok |
| Waiting On: | Rich Hickey |
| Description |
|
As reported by Jason Wolfe on March 19, 2009 in the clojure group: clojure.inspector/inspect-tree doesn't work on sets; patch attached I was debugging with inspect-tree and noticed that it errors when it I made a small patch (below) that makes inspect-tree work on Cheers, Index: src/clj/clojure/inspector.clj
(defmulti is-leaf collection-tag) -(defmethod is-leaf :map [m]
(defn tree-model [data] |
| Comments |
| Comment by Andy Fingerhut [ 14/Feb/12 12:54 PM ] |
|
Created a properly formatted patch, attached, for Jason's enhancement. I tested it with (inspect-tree (:members (clojure.reflect/reflect java.lang.Math))) and it worked, whereas it had many errors without Jason's changes. |
| Comment by Andy Fingerhut [ 23/Feb/12 11:58 PM ] |
|
Jason Wolfe has signed a CA. Patch applies cleanly with latest master as of Feb 14, 2012. No errors, warnings, or test failures with the patch applied. No doc strings need updating. |
| Comment by Stuart Sierra [ 09/Nov/12 4:12 PM ] |
|
Screened. |
[CLJ-776] seque broken for some BlockingQueues Created: 21/Apr/11 Updated: 22/Apr/11 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | None |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Pepijn de Vos | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
clojure.core/seque takes an optional argument that can be the initial capacity for a LinkedBlockingQueue or an instance of the BlockingQueue interface. PriorityBlockingQueue is such a class, but fails to work because seque makes a few assumptions about BlockingQueues that are not true for all BlockingQueues. user=> (def s (seque (java.util.concurrent.PriorityBlockingQueue. 100) (shuffle (range 100)))) user=> (seque (java.util.concurrent.SynchronousQueue.) (shuffle (range 100))) user=> (seque (java.util.concurrent.ArrayBlockingQueue. 10) (shuffle (range 100))) |
| Comments |
| Comment by Pepijn de Vos [ 21/Apr/11 11:32 AM ] |
|
A working implementation with some tests. |
| Comment by Pepijn de Vos [ 22/Apr/11 9:27 AM ] |
|
Attachement removed, I'm working on it here: https://gist.github.com/934781 |
[CLJ-771] Move unchecked-prim casts to clojure.unchecked Created: 07/Apr/11 Updated: 13/Feb/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Backlog |
| Fix Version/s: | Backlog |
| Type: | Enhancement | Priority: | Minor |
| Reporter: | Alexander Taggart | Assignee: | Alexander Taggart |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Incomplete |
| Waiting On: | Rich Hickey |
| Description |
|
Per Rich's comment in
|
| Comments |
| Comment by Alexander Taggart [ 29/Apr/11 3:41 PM ] |
|
Requires that patch on |
| Comment by Stuart Sierra [ 31/May/11 10:43 AM ] |
|
Applies on master as of commit 66a88de9408e93cf2b0d73382e662624a54c6c86 |
| Comment by Rich Hickey [ 09/Dec/11 8:40 AM ] |
|
still considering when to incorporate this |
| Comment by John Szakmeister [ 19/May/12 9:36 AM ] |
|
v2 of the patch applies to master as of commit eccde24c7fb63679f00c64b3c70c03956f0ce2c3 |
| Comment by Andy Fingerhut [ 07/Sep/12 12:40 AM ] |
|
Patch clj-771-move-unchecked-casts-patch-v3.txt dated Sep 6 2012 is the same as Alexander Taggart's patch move-unchecked-casts.patch except that it has been updated to apply cleanly to latest Clojure master. |
| Comment by Andy Fingerhut [ 20/Oct/12 12:18 PM ] |
|
Patch clj-771-move-unchecked-casts-patch-v4.txt dated Oct 20 2012 is the same as Alexander Taggart's patch move-unchecked-casts.patch except that it has been updated to apply cleanly to latest Clojure master. |
| Comment by Andy Fingerhut [ 01/Jan/13 11:37 AM ] |
|
The patch clj-771-move-unchecked-casts-patch-v4.txt applies cleanly to latest master and passes all tests. Rich marked this ticket as Incomplete on Dec 9 2011 with the comment "still considering when to incorporate this" above. Is it reasonable to change it back to Vetted or Screened so it can be considered again, perhaps after Release 1.5 is made? |
| Comment by Andy Fingerhut [ 13/Feb/13 12:50 AM ] |
|
Patch clj-771-move-unchecked-casts-patch-v5.txt dated Feb 12 2013 is the same as Alexander Taggart's patch move-unchecked-casts.patch except that it has been updated to apply cleanly to latest Clojure master. |
[CLJ-766] Implicit casting behaviour of into-array differs from <primitive>-array Created: 01/Apr/11 Updated: 03/May/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.3 |
| Fix Version/s: | Release 1.6 |
| Type: | Defect | Priority: | Minor |
| Reporter: | Alexander Taggart | Assignee: | Karsten Schmidt |
| Resolution: | Unresolved | Votes: | 3 |
| Labels: | None | ||
| Attachments: |
|
| Patch: | Code and Test |
| Approval: | Incomplete |
| Description |
|
Current patch: byte-short-array-ctors.diff The behavior of byte-array and short-array is inconsistent with the other <type>-array functions and with the into-array function when invoked with types other than byte or short. All of the other cases upcast to Number, then extract the primitive value, allowing this operation to succeed (assuming the value is in range). byte-array and short-array throw a ClassCastException. Example: base64v3a=> (into-array Byte/TYPE [1 2 3 4]) ;; int to byte ok #<byte[] [B@5ee04fd> base64v3a=> (byte-array [1 2 3 4]) ;; int to byte NOT ok!! ClassCastException java.lang.Long cannot be cast to java.lang.Byte clojure.lang.Numbers.byte_array (Numbers.java:1418) base64v3a=> (long-array [1 2 3 4]) ;; int to long ok #<long[] [J@3f9f4d1d> into-array (via RT.seqToTypedArray) and the other <type>-array functions all upcast to Number (via Numbers.<type>_array}}), then obtain the proper primitive value. Numbers.byte-array and Numbers.short-array do casts directly to Byte and Short (yielding the ClassCastException). The attached patch makes the Byte and Short cases match the other types and the into-array behavior. Tests are included. The submitter is a contributor. |
| Comments |
| Comment by Alexander Taggart [ 02/Apr/11 2:04 PM ] |
|
See |
| Comment by Andy Fingerhut [ 28/May/12 6:45 PM ] |
|
Some more details from Alexandar Taggart: This is not a duplicate of |
| Comment by Karsten Schmidt [ 02/Mar/13 5:11 PM ] |
|
I'd like to bump up this issue, since it'd be great if all the (xxx-array) factory functions have the same expected behavior (i.e. not throw an exception, especially not if the values are in range). The attached patch is changing the behaviour for byte-array & short-array to the same pattern used as for int/long/float/double and therefore will not throw an exception for valid (even if overflown) numbers. You can find more discussion in this thread on: https://groups.google.com/forum/?hl=en&fromgroups=#!topic/clojure/KyQrbph-zqo |
| Comment by Andy Fingerhut [ 03/Mar/13 8:11 AM ] |
|
Voting on a ticket (click the "Vote" link under the "People" heading while viewing the ticket on JIRA) may help draw attention to it, too. |
| Comment by Andy Fingerhut [ 04/Mar/13 1:08 PM ] |
|
Karsten, patches should be in the format created by the "git format-patch" command as described in the instructions under the heading "Development" on this page: http://dev.clojure.org/display/design/JIRA+workflow |
| Comment by Karsten Schmidt [ 04/Mar/13 2:05 PM ] |
|
Sorry Andy, I used Atlassian SourceTree to create the patch and assumed it's in standard git format... I've removed the old one and attach a (hopefully) properly formatted one. Apologies, contributing-beginners-luck! |
| Comment by Stuart Halloway [ 30/Mar/13 8:52 AM ] |
|
While investigating this, I noticed that long-array coerces across type, e.g. (seq (long-array [1.0])) => (1) Is this what we want? I don't think so. |
| Comment by Stuart Halloway [ 30/Mar/13 8:53 AM ] |
|
I agree that all the numeric array constructors should work the same way, but I am not sue we should adopt long-array's approach, which allows coercion from float to integer types. |
| Comment by Alex Miller [ 03/May/13 8:31 PM ] |
|
I think the patch approach is valid. However, the patch does not cover the same problem in the 2-arity version of byte_array and short_array (when a size is supplied). Please update the patch to include a fix in the 2-arity version of byte_array and short_array and tests for the same. Ex: (byte-array 1 [1]). Also, there is a whitespace issue in the patch - please just use spaces! /Users/alex/work/code/clojure/.git/rebase-apply/patch:24: space before tab in indent. ret[i] = ((Number)s.first()).byteValue(); warning: 1 line adds whitespace errors. Re Stuart's comments, I don't think that's in the scope of this ticket or solution. |
| Comment by Alex Miller [ 03/May/13 8:32 PM ] |
|
Sending back to Karsten for the requested patch updates. |
[CLJ-764] (partition 0 seq) and (parition-all 0 seq) are infinite sequences of empty sequences Created: 21/Mar/11 Updated: 21/Jan/13 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Release 1.1, Release 1.2 |
| Fix Version/s: | None |
| Type: | Defect | Priority: | Minor |
| Reporter: | Paul Stadig | Assignee: | Unassigned |
| Resolution: | Unresolved | Votes: | 0 |
| Labels: | None | ||
| Description |
|
(partition n seq) and (partition-all n seq) are implemented by taking n and dropping n from seq. When n=0 this becomes an infinite sequence of empty sequences. While conceptionally this makes sense, I think practically it may surprise people, and perhaps it should return an empty sequence or a sequence of a single empty sequence. |
| Comments |
| Comment by Paul Stadig [ 21/Mar/11 9:22 AM ] |
|
Ugh! I didn't mean for this to be major priority, and I can't seem to edit it after the fact. |
| Comment by Mike Anderson [ 21/Jan/13 5:40 AM ] |
|
I think the current behaviour is logically more correct than returning a empty sequence or a single empty sequence. In particular, I would expect (partition n infinite-seq) to return an infinite sequence of sequences of length n, for any value of n >= 0. Anything else would be very surprising. The only other sensible option would be throwing an exception, on the philosophical grounds that it isn't possible to partition a non-empty sequence into sub-sequences of length 0. But I think that changing behaviour in this way would break backwards compatibility for no obvious gain. I suggest closing this issue. |
[CLJ-761] print-dup generates call to nonexistent method for APersistentVector$SubVector Created: 19/Mar/11 Updated: 04/Nov/11 |
|
| Status: | Open |
| Project: | Clojure |
| Component/s: | None |
| Affects Version/s: | Backlog |
| Fix Version/s: | Backlog |
| Type: | Defect | Priority: | Minor |
| Reporter: | Stuart Sierra | Assignee: | Unassigned |
| Resolution: | Unresolved |