diff options
Diffstat (limited to 'tuplr.cpp')
-rw-r--r-- | tuplr.cpp | 43 |
1 files changed, 42 insertions, 1 deletions
@@ -31,6 +31,7 @@ Funcs ASTConsCall::funcs; std::ostream& err = std::cerr; std::ostream& out = std::cout; + /*************************************************************************** * S-Expression Lexer :: text -> S-Expressions (SExp) * ***************************************************************************/ @@ -93,6 +94,45 @@ readExpression(Cursor& cur, std::istream& in) /*************************************************************************** + * Standard Definitions * + ***************************************************************************/ + +void +initLang(PEnv& penv, TEnv& tenv) +{ + // Literals + static bool trueVal = true; + static bool falseVal = false; + penv.reg(false, "#t", PEnv::Handler(parseLiteral<bool>, &trueVal)); + penv.reg(false, "#f", PEnv::Handler(parseLiteral<bool>, &falseVal)); + + // Special forms + penv.reg(true, "fn", PEnv::Handler(parseFn)); + penv.reg(true, "if", PEnv::Handler(parseCall<ASTIf>)); + penv.reg(true, "def", PEnv::Handler(parseCall<ASTDefinition>)); + penv.reg(true, "cons", PEnv::Handler(parseCall<ASTConsCall>)); + penv.reg(true, "car", PEnv::Handler(parseCall<ASTCarCall>)); + penv.reg(true, "cdr", PEnv::Handler(parseCall<ASTCdrCall>)); + + // Numeric primitives + penv.reg(true, "+", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, "-", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, "*", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, "/", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, "%", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, "&", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, "|", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, "^", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, "=", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, "!=", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, ">", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, ">=", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, "<", PEnv::Handler(parseCall<ASTPrimitive>)); + penv.reg(true, "<=", PEnv::Handler(parseCall<ASTPrimitive>)); +} + + +/*************************************************************************** * EVAL/REPL/MAIN * ***************************************************************************/ @@ -115,6 +155,7 @@ main(int argc, char** argv) { PEnv penv; TEnv tenv(penv); + initTypes(penv, tenv); initLang(penv, tenv); CEnv* cenv = newCenv(penv, tenv); @@ -154,7 +195,7 @@ main(int argc, char** argv) is.close(); } - if (files.empty() || args.find("-r") != args.end()) + if (args.find("-r") != args.end() || (files.empty() && args.find("-e") == args.end())) ret = repl(*cenv); a = args.find("-o"); |