summaryrefslogtreecommitdiffstats
path: root/cpp/sca/modules/eval
diff options
context:
space:
mode:
authorjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2009-11-01 05:25:14 +0000
committerjsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68>2009-11-01 05:25:14 +0000
commit6b94d489977c1cb2eeddded3ee329fe6b9605d5c (patch)
treef51d8b2373102cb6c8ac9fc0e051b6f1227a414c /cpp/sca/modules/eval
parent9f187b46ae761e8275362d6c1533e9fe79028c7b (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.hpp23
-rw-r--r--cpp/sca/modules/eval/environment.hpp8
-rw-r--r--cpp/sca/modules/eval/eval-test.cpp30
-rw-r--r--cpp/sca/modules/eval/eval.hpp2
-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.hpp68
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;
}