aboutsummaryrefslogtreecommitdiffstats
path: root/src/parse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parse.cpp')
-rw-r--r--src/parse.cpp24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/parse.cpp b/src/parse.cpp
index 20d0816..2c59c56 100644
--- a/src/parse.cpp
+++ b/src/parse.cpp
@@ -92,6 +92,16 @@ parseFn(PEnv& penv, const AST* exp, void* arg)
return ret;
}
+inline AST*
+parseQuote(PEnv& penv, const AST* exp, void* arg)
+{
+ const ATuple* texp = exp->to<const ATuple*>();
+ THROW_IF(texp->size() != 2, exp->loc, "`quote' requires exactly 1 argument");
+ const AST* quotee = (*(texp->begin() + 1))->to<ALexeme*>();
+ THROW_IF(!quotee, exp->loc, "`quote' argument is not a lexeme");
+ return new AQuote(texp);
+}
+
/***************************************************************************
* Language Definition *
@@ -108,7 +118,8 @@ initLang(PEnv& penv, TEnv& tenv)
tenv.def(penv.sym("Float"), new AType(penv.sym("Float")));
tenv.def(penv.sym("String"), new AType(penv.sym("String")));
tenv.def(penv.sym("Lexeme"), new AType(penv.sym("Lexeme")));
-
+ tenv.def(penv.sym("Quote"), new AType(penv.sym("Quote")));
+
// Literals
static bool trueVal = true;
static bool falseVal = false;
@@ -119,11 +130,12 @@ initLang(PEnv& penv, TEnv& tenv)
penv.defmac("def", macDef);
// Special forms
- penv.reg(true, "fn", PEnv::Handler(parseFn));
- penv.reg(true, "if", PEnv::Handler(parseCall<AIf>));
- penv.reg(true, "cons", PEnv::Handler(parseCall<ACons>));
- penv.reg(true, ".", PEnv::Handler(parseCall<ADot>));
- penv.reg(true, "def", PEnv::Handler(parseCall<ADef>));
+ penv.reg(true, "fn", PEnv::Handler(parseFn));
+ penv.reg(true, "quote", PEnv::Handler(parseQuote));
+ penv.reg(true, "if", PEnv::Handler(parseCall<AIf>));
+ penv.reg(true, "cons", PEnv::Handler(parseCall<ACons>));
+ penv.reg(true, ".", PEnv::Handler(parseCall<ADot>));
+ penv.reg(true, "def", PEnv::Handler(parseCall<ADef>));
// Numeric primitives
penv.reg(true, "+", PEnv::Handler(parseCall<APrimitive>));