summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2007-09-12 12:33:01 +0000
committerRich Hickey <richhickey@gmail.com>2007-09-12 12:33:01 +0000
commitc66048a95c042a098881b7b6d32e9d548f76cdd6 (patch)
tree035a0e2336046a708623564bd89362a90840ed20 /src
parent5cee1402e46ff04792da9e49004ebaca23c19403 (diff)
got rid of unquote and unquote-splicing specials
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java8
-rw-r--r--src/jvm/clojure/lang/LispReader.java44
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);
}
}