diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-09-12 12:33:01 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-09-12 12:33:01 +0000 |
commit | c66048a95c042a098881b7b6d32e9d548f76cdd6 (patch) | |
tree | 035a0e2336046a708623564bd89362a90840ed20 /src | |
parent | 5cee1402e46ff04792da9e49004ebaca23c19403 (diff) |
got rid of unquote and unquote-splicing specials
Diffstat (limited to 'src')
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 8 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 44 |
2 files changed, 32 insertions, 20 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index f0ebf1bc..a477a2fe 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -44,8 +44,8 @@ static final Symbol INSTANCE = Symbol.create("instance?"); static final Symbol THISFN = Symbol.create("thisfn"); static final Symbol CLASS = Symbol.create("class"); -static final Symbol UNQUOTE = Symbol.create("unquote"); -static final Symbol UNQUOTE_SPLICING = Symbol.create("unquote-splicing"); +//static final Symbol UNQUOTE = Symbol.create("unquote"); +//static final Symbol UNQUOTE_SPLICING = Symbol.create("unquote-splicing"); //static final Symbol SYNTAX_QUOTE = Symbol.create("clojure", "syntax-quote"); static final Symbol LIST = Symbol.create("clojure", "list"); static final Symbol HASHMAP = Symbol.create("clojure", "hashmap"); @@ -78,8 +78,8 @@ static IPersistentMap specials = RT.map( INSTANCE, new InstanceExpr.Parser(), THISFN, null, CLASS, null, - UNQUOTE, null, - UNQUOTE_SPLICING, null, +// UNQUOTE, null, +// UNQUOTE_SPLICING, null, // SYNTAX_QUOTE, null, _AMP_, null ); diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java index c248d2eb..5a12c544 100644 --- a/src/jvm/clojure/lang/LispReader.java +++ b/src/jvm/clojure/lang/LispReader.java @@ -21,8 +21,8 @@ public class LispReader{ static Symbol QUOTE = Symbol.create(null, "quote");
//static Symbol SYNTAX_QUOTE = Symbol.create(null, "syntax-quote");
-static Symbol UNQUOTE = Symbol.create(null, "unquote");
-static Symbol UNQUOTE_SPLICING = Symbol.create(null, "unquote-splicing");
+//static Symbol UNQUOTE = Symbol.create(null, "unquote");
+//static Symbol UNQUOTE_SPLICING = Symbol.create(null, "unquote-splicing");
static Symbol CONCAT = Symbol.create("clojure", "concat");
static Symbol LIST = Symbol.create("clojure", "list");
static Symbol APPLY = Symbol.create("clojure", "apply");
@@ -323,6 +323,10 @@ static class SyntaxQuoteReader extends AFn{ ret = RT.list(Compiler.QUOTE, form);
else if(form instanceof Symbol)
ret = RT.list(Compiler.QUOTE, Compiler.resolveSymbol((Symbol) form));
+ else if(form instanceof Unquote)
+ return ((Unquote) form).o;
+ else if(form instanceof UnquoteSplicing)
+ throw new IllegalStateException("splice not in list");
else if(form instanceof IPersistentCollection)
{
if(form instanceof IPersistentMap)
@@ -337,14 +341,7 @@ static class SyntaxQuoteReader extends AFn{ else if(form instanceof ISeq)
{
ISeq seq = RT.seq(form);
- if(RT.equal(UNQUOTE, RT.first(seq)))
- return RT.second(seq);
- else if(RT.equal(UNQUOTE_SPLICING, RT.first(seq)))
- throw new IllegalStateException("splice not in list");
- else
- {
- ret = RT.cons(CONCAT, sqExpandList(seq));
- }
+ ret = RT.cons(CONCAT, sqExpandList(seq));
}
else
throw new UnsupportedOperationException("Unknown Collection type");
@@ -368,10 +365,10 @@ static class SyntaxQuoteReader extends AFn{ for(; seq != null; seq = seq.rest())
{
Object item = seq.first();
- if(item instanceof ISeq && RT.equal(UNQUOTE, RT.first(item)))
- ret = ret.cons(RT.list(LIST, RT.second(item)));
- else if(item instanceof ISeq && RT.equal(UNQUOTE_SPLICING, RT.first(item)))
- ret = ret.cons(RT.second(item));
+ if(item instanceof Unquote)
+ ret = ret.cons(RT.list(LIST, ((Unquote) item).o));
+ else if(item instanceof UnquoteSplicing)
+ ret = ret.cons(((UnquoteSplicing) item).o);
else
ret = ret.cons(RT.list(LIST, syntaxQuote(item)));
}
@@ -391,6 +388,21 @@ static class SyntaxQuoteReader extends AFn{ }
+static class Unquote{
+ final Object o;
+
+ public Unquote(Object o){
+ this.o = o;
+ }
+}
+
+static class UnquoteSplicing{
+ final Object o;
+
+ public UnquoteSplicing(Object o){
+ this.o = o;
+ }
+}
static class UnquoteReader extends AFn{
public Object invoke(Object reader, Object comma) throws Exception{
@@ -401,13 +413,13 @@ static class UnquoteReader extends AFn{ if(ch == '@')
{
Object o = read(r, true, null, true);
- return RT.list(Compiler.UNQUOTE_SPLICING, o);
+ return new UnquoteSplicing(o);
}
else
{
r.unread(ch);
Object o = read(r, true, null, true);
- return RT.list(Compiler.UNQUOTE, o);
+ return new Unquote(o);
}
}
|