Add standard stack manipulation functions
diff --git a/Evaluator.cpp b/Evaluator.cpp
index b52b843..5177fe5 100644
--- a/Evaluator.cpp
+++ b/Evaluator.cpp
@@ -2,6 +2,7 @@
#include "Function.h"
#include "Matcher.h"
#include "VarContext.h"
+#include "PPrint.h"
#include <QDebug>
@@ -38,6 +39,40 @@
Evaluator::Evaluator()
{
+ Function buryFn("Br");
+ buryFn.addNativeSentence("s.Name '=' e.Expr", [this](VarContext args)
+ {
+ Token name = args.singleVar("Name");
+ if (name.type() != Token::IDENT)
+ rtError("Invalid argument", "First argument to <Br> must be an identifier, received " + pprint(name));
+
+ bury(name.name(), args.expressionVar("Expr"));
+
+ return QList<Token>();
+ });
+ addFunction(buryFn);
+
+ Function digFn("Dg");
+ digFn.addNativeSentence("s.Name", [this](VarContext args)
+ {
+ Token name = args.singleVar("Name");
+ if (name.type() != Token::IDENT)
+ rtError("Invalid argument", "First argument to <Dg> must be an identifier, received " + pprint(name));
+
+ return dig(name.name());
+ });
+ addFunction(digFn);
+
+ Function copyFn("Cp");
+ copyFn.addNativeSentence("s.Name", [this](VarContext args)
+ {
+ Token name = args.singleVar("Name");
+ if (name.type() != Token::IDENT)
+ rtError("Invalid argument", "First argument to <Cp> must be an identifier, received " + pprint(name));
+
+ return copy(name.name());
+ });
+ addFunction(copyFn);
}
void Evaluator::addFunction(Function func)
@@ -132,7 +167,7 @@
if (sentence.isExternal())
{
- return RuntimeResult(sentence.externResult(args));
+ return RuntimeResult(sentence.externResult(res));
}
QList<Token> final;
@@ -148,5 +183,52 @@
return RuntimeResult(final);
}
- return RuntimeResult("Function " + name + " had no matching sentences for input");
+ return RuntimeResult("Function " + name + " had no matching sentences for input");
+}
+
+QList<Token> Evaluator::dig(QString name)
+{
+ if (_vars.contains(name))
+ {
+ QList<Token> value = _vars[name].pop();
+
+ if (_vars[name].empty())
+ {
+ _vars.remove(name);
+ }
+
+ return value;
+ }
+ else
+ {
+ return {};
+ }
+}
+
+QList<Token> Evaluator::copy(QString name)
+{
+ if (_vars.contains(name))
+ {
+ return _vars[name].last();
+ }
+ else
+ {
+ return {};
+ }
+}
+
+void Evaluator::bury(QString name, QList<Token> expression)
+{
+ if (!_vars.contains(name))
+ {
+ _vars[name] = QStack<QList<Token>>();
+ }
+
+ _vars[name].push(expression);
+}
+
+void rtError(QString brief, QString details)
+{
+ eout("Runtime Error: " + brief);
+ eout(details);
}