From cd7dae28b034deebc9c2c2469ed9d8f1f3dab1ed Mon Sep 17 00:00:00 2001 From: jsdelfino Date: Mon, 30 Nov 2009 08:36:07 +0000 Subject: 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 --- sca-cpp/trunk/modules/eval/driver.hpp | 4 +-- sca-cpp/trunk/modules/eval/environment.hpp | 6 ++-- sca-cpp/trunk/modules/eval/eval-test.cpp | 12 ++++---- sca-cpp/trunk/modules/eval/eval.hpp | 8 ++--- sca-cpp/trunk/modules/eval/io.hpp | 26 ++++++++++++---- sca-cpp/trunk/modules/eval/primitive.hpp | 49 +++++++++++++++++++++++++----- 6 files changed, 76 insertions(+), 29 deletions(-) (limited to 'sca-cpp/trunk/modules/eval') 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& variables, const list 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& 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& 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& exps, Env& env, const gc_pool& pool) const value applyProcedure(const value& procedure, list& 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& 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 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 readStringHelper(const list& 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(), 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 (), 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& args) { return car((list )car(args)); } @@ -64,7 +78,12 @@ const value listProc(const list& args) { } const value nulProc(const list& args) { - return (bool)isNil(car(args)); + const value v(car(args)); + if (isNil(v)) + return true; + if (isList(v)) + return isNil(list(v)); + return false; } const value equalProc(const list& args) { @@ -92,12 +111,24 @@ const value divProc(const list& args) { } const value displayProc(const list& 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& args) { + if (isNil(args)) { + logStream() << std::endl; + return true; + } + logStream() << car(args); + return logProc(cdr(args)); } -const value uuidProc(const list& args) { +const value uuidProc(unused const list& args) { apr_uuid_t uuid; apr_uuid_get(&uuid); char buf[APR_UUID_FORMATTED_LENGTH]; @@ -105,7 +136,7 @@ const value uuidProc(const list& args) { return std::string(buf, APR_UUID_FORMATTED_LENGTH); } -const value applyPrimitiveProcedure(const value& proc, list& args, const gc_pool& pool) { +const value applyPrimitiveProcedure(const value& proc, list& args) { const lambda&)> func(cadr((list)proc)); return func(args); } @@ -151,6 +182,7 @@ const list primitiveProcedureNames() { l = cons("/", l); l = cons("equal?", l); l = cons("display", l); + l = cons("log", l); l = cons("uuid", l); return l; } @@ -168,6 +200,7 @@ const list 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; } -- cgit v1.2.3