aboutsummaryrefslogtreecommitdiffstats
path: root/tuplr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tuplr.cpp')
-rw-r--r--tuplr.cpp43
1 files changed, 42 insertions, 1 deletions
diff --git a/tuplr.cpp b/tuplr.cpp
index 8e18d5f..580416c 100644
--- a/tuplr.cpp
+++ b/tuplr.cpp
@@ -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");