summaryrefslogtreecommitdiff
path: root/src
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 /src
parent42df6a0ad721a798411e9a701d51a42f6686777f (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.java11
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");