diff options
Diffstat (limited to 'src/parse.cpp')
-rw-r--r-- | src/parse.cpp | 24 |
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>)); |