diff options
author | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2009-11-01 05:25:14 +0000 |
---|---|---|
committer | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2009-11-01 05:25:14 +0000 |
commit | 6b94d489977c1cb2eeddded3ee329fe6b9605d5c (patch) | |
tree | f51d8b2373102cb6c8ac9fc0e051b6f1227a414c /cpp/sca/modules/eval | |
parent | 9f187b46ae761e8275362d6c1533e9fe79028c7b (diff) |
Minor refactoring of read/write functions and primitive procs. Added functions to help store data in memcached. Fixes to HTTP support and more tests.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@831640 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
-rw-r--r-- | cpp/sca/modules/eval/driver.hpp | 23 | ||||
-rw-r--r-- | cpp/sca/modules/eval/environment.hpp | 8 | ||||
-rw-r--r-- | cpp/sca/modules/eval/eval-test.cpp | 30 | ||||
-rw-r--r-- | cpp/sca/modules/eval/eval.hpp | 2 | ||||
-rw-r--r-- | cpp/sca/modules/eval/io.hpp (renamed from cpp/sca/modules/eval/read.hpp) | 18 | ||||
-rw-r--r-- | cpp/sca/modules/eval/primitive.hpp | 68 |
6 files changed, 78 insertions, 71 deletions
diff --git a/cpp/sca/modules/eval/driver.hpp b/cpp/sca/modules/eval/driver.hpp index f777973ebf..4c69ecb0a1 100644 --- a/cpp/sca/modules/eval/driver.hpp +++ b/cpp/sca/modules/eval/driver.hpp @@ -36,40 +36,39 @@ namespace eval { const std::string evalOutputPrompt("; "); const std::string evalInputPrompt("=> "); -const bool promptForInput(std::ostream& out, const std::string str) { +const bool promptForInput(const std::string str, std::ostream& out) { out << "\n\n" << str; return true; } -const bool announceOutput(std::ostream& out, const std::string str) { +const bool announceOutput(const std::string str, std::ostream& out) { out << "\n" << str; return true; } -const bool userPrint(std::ostream& out, const value object) { - if(isCompoundProcedure(object)) - out << mklist<value>(compoundProcedureSymbol, procedureParameters(object), procedureBody(object), "<procedure-env>"); - out << object; +const bool userPrint(const value val, std::ostream& out) { + if(isCompoundProcedure(val)) + writeValue(mklist<value>(compoundProcedureSymbol, procedureParameters(val), procedureBody(val), "<procedure-env>"), out); + writeValue(val, out); return true; } const value evalDriverLoop(std::istream& in, std::ostream& out, Env& globalEnv, const gc_pool& pool) { - promptForInput(out, evalInputPrompt); - value input = read(in); + promptForInput(evalInputPrompt, out); + value input = readValue(in); if (isNil(input)) return input; const value output = evalExpr(input, globalEnv, pool); - announceOutput(out, evalOutputPrompt); - userPrint(out, output); + announceOutput(evalOutputPrompt, out); + userPrint(output, out); return evalDriverLoop(in, out, globalEnv, pool); } const bool evalDriverRun(std::istream& in, std::ostream& out) { gc_pool pool; - setupEvalOut(out); + setupDisplay(out); Env globalEnv = setupEnvironment(pool); evalDriverLoop(in, out, globalEnv, pool); - cleanupEnvironment(globalEnv); return true; } diff --git a/cpp/sca/modules/eval/environment.hpp b/cpp/sca/modules/eval/environment.hpp index 90a1d88854..fa9667b1ba 100644 --- a/cpp/sca/modules/eval/environment.hpp +++ b/cpp/sca/modules/eval/environment.hpp @@ -151,14 +151,6 @@ const Env setupEnvironment(const gc_pool& pool) { return env; } -const bool cleanupEnvironment(Env& env) { - if (isNil(env)) - return true; - *firstFrame(env) = list<value>(); - Env enclosing = enclosingEnvironment(env); - return cleanupEnvironment(enclosing); -} - const value lookupEnvLoop(const value& var, const Env& env); const value lookupEnvScan(const value& var, const list<value>& vars, const list<value>& vals, const Env& env) { diff --git a/cpp/sca/modules/eval/eval-test.cpp b/cpp/sca/modules/eval/eval-test.cpp index 584c8470b1..7d92c79eba 100644 --- a/cpp/sca/modules/eval/eval-test.cpp +++ b/cpp/sca/modules/eval/eval-test.cpp @@ -39,7 +39,6 @@ bool testEnv() { defineVariable("x", env, env); assert(lookupVariableValue(value("x"), env) == env); assert(lookupVariableValue("a", env) == value(1)); - cleanupEnvironment(env); return true; } @@ -59,23 +58,41 @@ bool testEnvGC() { bool testRead() { std::istringstream is("abcd"); - assert(read(is) == "abcd"); + assert(readValue(is) == "abcd"); std::istringstream is2("123"); - assert(read(is2) == value(123)); + assert(readValue(is2) == value(123)); std::istringstream is3("(abcd)"); - assert(read(is3) == mklist(value("abcd"))); + assert(readValue(is3) == mklist(value("abcd"))); std::istringstream is4("(abcd xyz)"); - assert(read(is4) == mklist<value>("abcd", "xyz")); + assert(readValue(is4) == mklist<value>("abcd", "xyz")); std::istringstream is5("(abcd (xyz tuv))"); - assert(read(is5) == mklist<value>("abcd", mklist<value>("xyz", "tuv"))); + assert(readValue(is5) == mklist<value>("abcd", mklist<value>("xyz", "tuv"))); return true; } +bool testWrite() { + const list<value> i = list<value>() + << (list<value>() << "item" << "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b" + << (list<value>() << "item" + << (list<value>() << "name" << "Apple") + << (list<value>() << "price" << "$2.99"))) + << (list<value>() << "item" << "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c" + << (list<value>() << "item" + << (list<value>() << "name" << "Orange") + << (list<value>() << "price" << "$3.55"))); + const list<value> a = cons<value>("Feed", cons<value>("feed-1234", i)); + std::ostringstream os; + writeValue(a, os); + std::istringstream is(os.str()); + assert(readValue(is) == a); + return true; +} + const std::string testSchemeNumber( "(define (testNumber) (if (= 1 1) (display \"testNumber ok\") (error \"testNumber\"))) " "(testNumber)"); @@ -178,6 +195,7 @@ int main() { tuscany::eval::testEnv(); tuscany::eval::testEnvGC(); tuscany::eval::testRead(); + tuscany::eval::testWrite(); tuscany::eval::testEval(); tuscany::eval::testEvalExpr(); tuscany::eval::testEvalGC(); diff --git a/cpp/sca/modules/eval/eval.hpp b/cpp/sca/modules/eval/eval.hpp index 78051c5a2b..01d242f07b 100644 --- a/cpp/sca/modules/eval/eval.hpp +++ b/cpp/sca/modules/eval/eval.hpp @@ -30,7 +30,7 @@ #include "list.hpp" #include "value.hpp" #include "primitive.hpp" -#include "read.hpp" +#include "io.hpp" #include "environment.hpp" namespace tuscany { diff --git a/cpp/sca/modules/eval/read.hpp b/cpp/sca/modules/eval/io.hpp index 994462f145..2a55e67bbf 100644 --- a/cpp/sca/modules/eval/read.hpp +++ b/cpp/sca/modules/eval/io.hpp @@ -19,11 +19,11 @@ /* $Rev$ $Date$ */ -#ifndef tuscany_eval_read_hpp -#define tuscany_eval_read_hpp +#ifndef tuscany_eval_io_hpp +#define tuscany_eval_io_hpp /** - * Script evaluator read functions. + * Script evaluator IO functions. */ #include <iostream> @@ -96,7 +96,7 @@ 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 readNumber(const char chr, std::istream& in); -const value read(std::istream& in); +const value readValue(std::istream& in); const value readToken(std::istream& in) { const char firstChar = readChar(in); @@ -121,7 +121,7 @@ const value readToken(std::istream& in) { } const value readQuoted(std::istream& in) { - return mklist(quoteSymbol, read(in)); + return mklist(quoteSymbol, readValue(in)); } const list<value> readList(const list<value>& listSoFar, std::istream& in) { @@ -172,13 +172,17 @@ const value readNumber(const char chr, std::istream& in) { return stringToNumber(listToString(readNumberHelper(mklist(chr), in))); } -const value read(std::istream& in) { +const value readValue(std::istream& in) { 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; +} + } } -#endif /* tuscany_eval_read_hpp */ +#endif /* tuscany_eval_io_hpp */ diff --git a/cpp/sca/modules/eval/primitive.hpp b/cpp/sca/modules/eval/primitive.hpp index 423e5af07b..9d62d6b1a6 100644 --- a/cpp/sca/modules/eval/primitive.hpp +++ b/cpp/sca/modules/eval/primitive.hpp @@ -40,73 +40,67 @@ const value primitiveSymbol("primitive"); const value quoteSymbol("'"); const value lambdaSymbol("lambda"); -std::ostream* evalOut = &std::cout; +std::ostream* displayOut = &std::cout; -const bool setupEvalOut(std::ostream& out) { - evalOut = &out; +const bool setupDisplay(std::ostream& out) { + displayOut = &out; return true; } -const value valueCar(list<value>& args) { +const value carProc(list<value>& args) { return car((list<value> )car(args)); } -const value valueCdr(list<value>& args) { +const value cdrProc(list<value>& args) { return cdr((list<value> )car(args)); } -const value valueCons(list<value>& args) { +const value consProc(list<value>& args) { return cons(car(args), (list<value> )cadr(args)); } -const value valueList(list<value>& args) { +const value listProc(list<value>& args) { return args; } -const value valueNul(list<value>& args) { +const value nulProc(list<value>& args) { return (bool)isNil(car(args)); } -const value valueEqual(list<value>& args) { +const value equalProc(list<value>& args) { return (bool)(car(args) == cadr(args)); } -const value valueAdd(list<value>& args) { +const value addProc(list<value>& args) { if (isNil(cdr(args))) return (double)car(args); return (double)car(args) + (double)cadr(args); } -const value valueSub(list<value>& args) { +const value subProc(list<value>& args) { if (isNil(cdr(args))) return (double)0 - (double)car(args); return (double)car(args) - (double)cadr(args); } -const value valueMul(list<value>& args) { +const value mulProc(list<value>& args) { return (double)car(args) * (double)cadr(args); } -const value valueDiv(list<value>& args) { +const value divProc(list<value>& args) { return (double)car(args) / (double)cadr(args); } -const value valueDisplay(list<value>& args) { - *evalOut << car(args); +const value displayProc(list<value>& args) { + *displayOut << car(args); return true; } -const value valueComment(list<value>& args) { - *evalOut << "; " << car(args); +const value commentProc(list<value>& args) { return true; } -const value valueError(list<value>& args) { - std::cerr << (std::string)car(args); - return true; -} - -const value valueUuid(list<value>& args) { +const value uuidProc(list<value>& args) { apr_uuid_t uuid; apr_uuid_get(&uuid); char buf[APR_UUID_FORMATTED_LENGTH]; @@ -164,20 +158,20 @@ const list<value> primitiveProcedureNames() { } const list<value> primitiveProcedureObjects() { - list<value> l = mklist(primitiveProcedure(valueCar)); - l = cons(primitiveProcedure(valueCdr), l); - l = cons(primitiveProcedure(valueCons), l); - l = cons(primitiveProcedure(valueList), l); - l = cons(primitiveProcedure(valueNul), l); - l = cons(primitiveProcedure(valueEqual), l); - l = cons(primitiveProcedure(valueAdd), l); - l = cons(primitiveProcedure(valueSub), l); - l = cons(primitiveProcedure(valueMul), l); - l = cons(primitiveProcedure(valueDiv), l); - l = cons(primitiveProcedure(valueEqual), l); - l = cons(primitiveProcedure(valueDisplay), l); - l = cons(primitiveProcedure(valueUuid), l); - l = cons(primitiveProcedure(valueComment), l); + list<value> l = mklist(primitiveProcedure(carProc)); + l = cons(primitiveProcedure(cdrProc), l); + l = cons(primitiveProcedure(consProc), l); + l = cons(primitiveProcedure(listProc), l); + l = cons(primitiveProcedure(nulProc), l); + l = cons(primitiveProcedure(equalProc), l); + l = cons(primitiveProcedure(addProc), l); + l = cons(primitiveProcedure(subProc), l); + l = cons(primitiveProcedure(mulProc), l); + l = cons(primitiveProcedure(divProc), l); + l = cons(primitiveProcedure(equalProc), l); + l = cons(primitiveProcedure(displayProc), l); + l = cons(primitiveProcedure(uuidProc), l); + l = cons(primitiveProcedure(commentProc), l); return l; } |