summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 (#')