diff options
author | Christophe Grand <christophe@cgrand.net> | 2010-06-08 16:23:14 +0200 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-06-08 10:53:26 -0400 |
commit | a804f7c916095ffb5dce64ddfe90397310b1dfd4 (patch) | |
tree | e71c4bb3359977d6c08ceaf8f4e8967c888dadbf | |
parent | 42df6a0ad721a798411e9a701d51a42f6686777f (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.java | 11 | ||||
-rw-r--r-- | test/clojure/test_clojure/reader.clj | 9 |
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 (#') |