summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Grand <christophe@cgrand.net>2010-06-08 16:23:14 +0200
committerRich Hickey <richhickey@gmail.com>2010-06-08 10:53:26 -0400
commita804f7c916095ffb5dce64ddfe90397310b1dfd4 (patch)
treee71c4bb3359977d6c08ceaf8f4e8967c888dadbf
parent42df6a0ad721a798411e9a701d51a42f6686777f (diff)
read ^:foo bar as ^{:foo true} bar and merge existing metatada. See #375.
Signed-off-by: Rich Hickey <richhickey@gmail.com>
-rw-r--r--src/jvm/clojure/lang/LispReader.java11
-rw-r--r--test/clojure/test_clojure/reader.clj9
2 files changed, 12 insertions, 8 deletions
diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java
index 2618876d..d4b8dde8 100644
--- a/src/jvm/clojure/lang/LispReader.java
+++ b/src/jvm/clojure/lang/LispReader.java
@@ -657,8 +657,10 @@ public static class MetaReader extends AFn{
if(r instanceof LineNumberingPushbackReader)
line = ((LineNumberingPushbackReader) r).getLineNumber();
Object meta = read(r, true, null, true);
- if(meta instanceof Symbol || meta instanceof Keyword || meta instanceof String)
+ if(meta instanceof Symbol || meta instanceof String)
meta = RT.map(RT.TAG_KEY, meta);
+ else if (meta instanceof Keyword)
+ meta = RT.map(meta, true);
else if(!(meta instanceof IPersistentMap))
throw new IllegalArgumentException("Metadata must be Symbol,Keyword,String or Map");
@@ -672,7 +674,12 @@ public static class MetaReader extends AFn{
((IReference)o).resetMeta((IPersistentMap) meta);
return o;
}
- return ((IObj) o).withMeta((IPersistentMap) meta);
+ Object ometa = RT.meta(o);
+ for(ISeq s = RT.seq(meta); s != null; s = s.next()) {
+ IMapEntry kv = (IMapEntry) s.first();
+ ometa = RT.assoc(ometa, kv.getKey(), kv.getValue());
+ }
+ return ((IObj) o).withMeta((IPersistentMap) ometa);
}
else
throw new IllegalArgumentException("Metadata can only be applied to IMetas");
diff --git a/test/clojure/test_clojure/reader.clj b/test/clojure/test_clojure/reader.clj
index 1629076f..d11eb311 100644
--- a/test/clojure/test_clojure/reader.clj
+++ b/test/clojure/test_clojure/reader.clj
@@ -274,10 +274,6 @@
(deftest t-Comment)
-;; Meta (^)
-
-(deftest t-Meta)
-
;; Deref (@)
(deftest t-Deref)
@@ -290,9 +286,10 @@
(deftest t-Regex)
-;; Metadata (#^)
+;; Metadata (^ or #^ (deprecated))
-(deftest t-Metadata)
+(deftest t-Metadata
+ (is (= (meta '^:static ^:awesome ^{:static false :bar :baz} sym) {:awesome true, :bar :baz, :static true})))
;; Var-quote (#')