From a804f7c916095ffb5dce64ddfe90397310b1dfd4 Mon Sep 17 00:00:00 2001 From: Christophe Grand Date: Tue, 8 Jun 2010 16:23:14 +0200 Subject: read ^:foo bar as ^{:foo true} bar and merge existing metatada. See #375. Signed-off-by: Rich Hickey --- src/jvm/clojure/lang/LispReader.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'src') 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"); -- cgit v1.2.3-70-g09d2