summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/modules/eval
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2009-11-30 08:36:07 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2009-11-30 08:36:07 +0000
commitcd7dae28b034deebc9c2c2469ed9d8f1f3dab1ed (patch)
tree80cead86cff364718c968849e1c185121a79892d /sca-cpp/trunk/modules/eval
parenta9941f3ba6624b88ef62a2a7bf260f50761ffbf9 (diff)
Added debug macros and cleaned up debug logging. Added locking macros used when compiling for multithreading. Fixed value conversions to numbers. Fixed compile warnings.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@885348 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
-rw-r--r--sca-cpp/trunk/modules/eval/driver.hpp4
-rw-r--r--sca-cpp/trunk/modules/eval/environment.hpp6
-rw-r--r--sca-cpp/trunk/modules/eval/eval-test.cpp12
-rw-r--r--sca-cpp/trunk/modules/eval/eval.hpp8
-rw-r--r--sca-cpp/trunk/modules/eval/io.hpp26
-rw-r--r--sca-cpp/trunk/modules/eval/primitive.hpp49
6 files changed, 76 insertions, 29 deletions
diff --git a/sca-cpp/trunk/modules/eval/driver.hpp b/sca-cpp/trunk/modules/eval/driver.hpp
index 4c69ecb0a1..3076e677c4 100644
--- a/sca-cpp/trunk/modules/eval/driver.hpp
+++ b/sca-cpp/trunk/modules/eval/driver.hpp
@@ -37,12 +37,12 @@ const std::string evalOutputPrompt("; ");
const std::string evalInputPrompt("=> ");
const bool promptForInput(const std::string str, std::ostream& out) {
- out << "\n\n" << str;
+ out << std::endl << std::endl << str;
return true;
}
const bool announceOutput(const std::string str, std::ostream& out) {
- out << "\n" << str;
+ out << std::endl << str;
return true;
}
diff --git a/sca-cpp/trunk/modules/eval/environment.hpp b/sca-cpp/trunk/modules/eval/environment.hpp
index fa9667b1ba..3a19c01deb 100644
--- a/sca-cpp/trunk/modules/eval/environment.hpp
+++ b/sca-cpp/trunk/modules/eval/environment.hpp
@@ -82,7 +82,7 @@ const bool isDotVariable(const value& var) {
const Frame makeBinding(const Frame& frameSoFar, const list<value>& variables, const list<value> values) {
if (isNil(variables)) {
if (!isNil(values))
- std::cout << "Too many arguments supplied " << values << "\n";
+ logStream() << "Too many arguments supplied " << values << std::endl;
return frameSoFar;
}
if (isDotVariable(car(variables)))
@@ -90,7 +90,7 @@ const Frame makeBinding(const Frame& frameSoFar, const list<value>& variables, c
if (isNil(values)) {
if (!isNil(variables))
- std::cout << "Too few arguments supplied " << variables << "\n";
+ logStream() << "Too few arguments supplied " << variables << std::endl;
return frameSoFar;
}
@@ -163,7 +163,7 @@ const value lookupEnvScan(const value& var, const list<value>& vars, const list<
const value lookupEnvLoop(const value& var, const Env& env) {
if(env == theEmptyEnvironment()) {
- std::cout << "Unbound variable " << var << "\n";
+ logStream() << "Unbound variable " << var << std::endl;
return value();
}
return lookupEnvScan(var, frameVariables(*firstFrame(env)), frameValues(*firstFrame(env)), env);
diff --git a/sca-cpp/trunk/modules/eval/eval-test.cpp b/sca-cpp/trunk/modules/eval/eval-test.cpp
index 984b17b26d..fb755b9077 100644
--- a/sca-cpp/trunk/modules/eval/eval-test.cpp
+++ b/sca-cpp/trunk/modules/eval/eval-test.cpp
@@ -47,9 +47,9 @@ bool testEnvGC() {
resetListCounters();
resetValueCounters();
testEnv();
- assert(countValues == 0);
- assert(countLambdas == 0);
- assert(countlists == 0);
+ assert(checkValueCounters());
+ assert(checkLambdaCounters());
+ assert(checkListCounters());
//printLambdaCounters();
//printListCounters();
//printValueCounters();
@@ -211,9 +211,9 @@ bool testEvalGC() {
testEval();
testEvalExpr();
testEvalLambda();
- assert(countValues == 0);
- assert(countLambdas == 0);
- assert(countlists == 0);
+ assert(checkValueCounters());
+ assert(checkLambdaCounters());
+ assert(checkListCounters());
//printLambdaCounters();
//printListCounters();
//printValueCounters();
diff --git a/sca-cpp/trunk/modules/eval/eval.hpp b/sca-cpp/trunk/modules/eval/eval.hpp
index 8c9ecfdecc..1b4d94c631 100644
--- a/sca-cpp/trunk/modules/eval/eval.hpp
+++ b/sca-cpp/trunk/modules/eval/eval.hpp
@@ -141,12 +141,12 @@ const value evalSequence(const list<value>& exps, Env& env, const gc_pool& pool)
const value applyProcedure(const value& procedure, list<value>& arguments, const gc_pool& pool) {
if(isPrimitiveProcedure(procedure))
- return applyPrimitiveProcedure(procedure, arguments, pool);
+ return applyPrimitiveProcedure(procedure, arguments);
if(isCompoundProcedure(procedure)) {
Env env = extendEnvironment(procedureParameters(procedure), arguments, procedureEnvironment(procedure), pool);
return evalSequence(procedureBody(procedure), env, pool);
}
- std::cout << "Unknown procedure type " << procedure << "\n";
+ logStream() << "Unknown procedure type " << procedure << std::endl;
return value();
}
@@ -208,7 +208,7 @@ const value expandClauses(const list<value>& clauses) {
if(isCondElseClause(first)) {
if(isNil(rest))
return sequenceToExp(condActions(first));
- std::cout << "else clause isn't last " << clauses << "\n";
+ logStream() << "else clause isn't last " << clauses << std::endl;
return value();
}
return makeIf(condPredicate(first), sequenceToExp(condActions(first)), expandClauses(rest));
@@ -254,7 +254,7 @@ const value evalExpr(const value& exp, Env& env, const gc_pool& pool) {
list<value> operandValues = listOfValues(operands(exp), env, pool);
return applyProcedure(evalExpr(operat(exp), env, pool), operandValues, pool);
}
- std::cout << "Unknown expression type " << exp << "\n";
+ logStream() << "Unknown expression type " << exp << std::endl;
return value();
}
diff --git a/sca-cpp/trunk/modules/eval/io.hpp b/sca-cpp/trunk/modules/eval/io.hpp
index a898a11440..53657ce055 100644
--- a/sca-cpp/trunk/modules/eval/io.hpp
+++ b/sca-cpp/trunk/modules/eval/io.hpp
@@ -77,14 +77,14 @@ const char readChar(std::istream& in) {
if(in.eof()) {
return -1;
}
- char c = in.get();
+ char c = (char)in.get();
return c;
}
const char peekChar(std::istream& in) {
if(in.eof())
return -1;
- char c = in.peek();
+ char c = (char)in.peek();
return c;
}
@@ -95,7 +95,7 @@ const bool isQuote(const value& token) {
const value skipComment(std::istream& in);
const value readQuoted(std::istream& in);
const value readIdentifier(const char chr, std::istream& in);
-const value readString(const char chr, std::istream& in);
+const value readString(std::istream& in);
const value readNumber(const char chr, std::istream& in);
const value readValue(std::istream& in);
@@ -112,14 +112,14 @@ const value readToken(std::istream& in) {
if(firstChar == ')')
return rightParenthesis;
if(firstChar == '"')
- return readString(firstChar, in);
+ return readString(in);
if(isIdentifierStart(firstChar))
return readIdentifier(firstChar, in);
if(isDigit(firstChar))
return readNumber(firstChar, in);
if(firstChar == -1)
return value();
- std::cout << "Illegal lexical syntax '" << firstChar << "'" << "\n";
+ logStream() << "Illegal lexical syntax '" << firstChar << "'" << std::endl;
return readToken(in);
}
@@ -167,7 +167,7 @@ const list<char> readStringHelper(const list<char>& listSoFar, std::istream& in)
return reverse(listSoFar);
}
-const value readString(const char chr, std::istream& in) {
+const value readString(std::istream& in) {
return listToString(readStringHelper(list<char>(), in));
}
@@ -189,11 +189,25 @@ const value readValue(std::istream& in) {
return nextToken;
}
+const value readValue(const std::string s) {
+ std::istringstream in(s);
+ const value nextToken = readToken(in);
+ if(isLeftParenthesis(nextToken))
+ return readList(list<value> (), in);
+ return nextToken;
+}
+
const bool writeValue(const value& val, std::ostream& out) {
out << val;
return true;
}
+const std::string writeValue(const value& val) {
+ std::ostringstream out;
+ out << val;
+ return out.str();
+}
+
const value readScript(std::istream& in) {
const value val = readValue(in);
if (isNil(val))
diff --git a/sca-cpp/trunk/modules/eval/primitive.hpp b/sca-cpp/trunk/modules/eval/primitive.hpp
index bd36c0e226..49bb3e2087 100644
--- a/sca-cpp/trunk/modules/eval/primitive.hpp
+++ b/sca-cpp/trunk/modules/eval/primitive.hpp
@@ -40,13 +40,27 @@ const value primitiveSymbol("primitive");
const value quoteSymbol("'");
const value lambdaSymbol("lambda");
-std::ostream* displayOut = &std::cout;
+std::ostream* displayOutStream = &std::cout;
+std::ostream* logOutStream = &std::cerr;
const bool setupDisplay(std::ostream& out) {
- displayOut = &out;
+ displayOutStream = &out;
return true;
}
+std::ostream& displayStream() {
+ return *displayOutStream;
+}
+
+const bool setupLog(std::ostream& out) {
+ logOutStream = &out;
+ return true;
+}
+
+std::ostream& logStream() {
+ return *logOutStream;
+}
+
const value carProc(const list<value>& args) {
return car((list<value> )car(args));
}
@@ -64,7 +78,12 @@ const value listProc(const list<value>& args) {
}
const value nulProc(const list<value>& args) {
- return (bool)isNil(car(args));
+ const value v(car(args));
+ if (isNil(v))
+ return true;
+ if (isList(v))
+ return isNil(list<value>(v));
+ return false;
}
const value equalProc(const list<value>& args) {
@@ -92,12 +111,24 @@ const value divProc(const list<value>& args) {
}
const value displayProc(const list<value>& args) {
- *displayOut << car(args);
- (*displayOut).flush();
- return true;
+ if (isNil(args)) {
+ displayStream() << std::endl;
+ return true;
+ }
+ displayStream() << car(args);
+ return displayProc(cdr(args));
+}
+
+const value logProc(const list<value>& args) {
+ if (isNil(args)) {
+ logStream() << std::endl;
+ return true;
+ }
+ logStream() << car(args);
+ return logProc(cdr(args));
}
-const value uuidProc(const list<value>& args) {
+const value uuidProc(unused const list<value>& args) {
apr_uuid_t uuid;
apr_uuid_get(&uuid);
char buf[APR_UUID_FORMATTED_LENGTH];
@@ -105,7 +136,7 @@ const value uuidProc(const list<value>& args) {
return std::string(buf, APR_UUID_FORMATTED_LENGTH);
}
-const value applyPrimitiveProcedure(const value& proc, list<value>& args, const gc_pool& pool) {
+const value applyPrimitiveProcedure(const value& proc, list<value>& args) {
const lambda<value(list<value>&)> func(cadr((list<value>)proc));
return func(args);
}
@@ -151,6 +182,7 @@ const list<value> primitiveProcedureNames() {
l = cons<value>("/", l);
l = cons<value>("equal?", l);
l = cons<value>("display", l);
+ l = cons<value>("log", l);
l = cons<value>("uuid", l);
return l;
}
@@ -168,6 +200,7 @@ const list<value> primitiveProcedureObjects() {
l = cons(primitiveProcedure(divProc), l);
l = cons(primitiveProcedure(equalProc), l);
l = cons(primitiveProcedure(displayProc), l);
+ l = cons(primitiveProcedure(logProc), l);
l = cons(primitiveProcedure(uuidProc), l);
return l;
}