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 /src | |
parent | 42df6a0ad721a798411e9a701d51a42f6686777f (diff) |
read ^:foo bar as ^{:foo true} bar and merge existing metatada. See #375.
Signed-off-by: Rich Hickey <richhickey@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 11 |
1 files changed, 9 insertions, 2 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"); |