/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /* $Rev$ $Date$ */ #ifndef tuscany_eval_primitive_hpp #define tuscany_eval_primitive_hpp /** * Script evaluator primitive functions. */ #include #include #include #include "function.hpp" #include "list.hpp" #include "value.hpp" namespace tuscany { namespace eval { const value primitiveSymbol("primitive"); const value quoteSymbol("'"); const value lambdaSymbol("lambda"); std::ostream* displayOut = &std::cout; const bool setupDisplay(std::ostream& out) { displayOut = &out; return true; } const value carProc(const list& args) { return car((list )car(args)); } const value cdrProc(const list& args) { return cdr((list )car(args)); } const value consProc(const list& args) { return cons(car(args), (list )cadr(args)); } const value listProc(const list& args) { return args; } const value nulProc(const list& args) { return (bool)isNil(car(args)); } const value equalProc(const list& args) { return (bool)(car(args) == cadr(args)); } const value addProc(const list& args) { if (isNil(cdr(args))) return (double)car(args); return (double)car(args) + (double)cadr(args); } const value subProc(const list& args) { if (isNil(cdr(args))) return (double)0 - (double)car(args); return (double)car(args) - (double)cadr(args); } const value mulProc(const list& args) { return (double)car(args) * (double)cadr(args); } const value divProc(const list& args) { return (double)car(args) / (double)cadr(args); } const value displayProc(const list& args) { *displayOut << car(args); (*displayOut).flush(); return true; } const value uuidProc(const list& args) { apr_uuid_t uuid; apr_uuid_get(&uuid); char buf[APR_UUID_FORMATTED_LENGTH]; apr_uuid_format(buf, &uuid); return std::string(buf, APR_UUID_FORMATTED_LENGTH); } const value applyPrimitiveProcedure(const value& proc, list& args, const gc_pool& pool) { const lambda&)> func(cadr((list)proc)); return func(args); } const bool isPrimitiveProcedure(const value& proc) { return isTaggedList(proc, primitiveSymbol); } const bool isSelfEvaluating(const value& exp) { if(isNil(exp)) return true; if(isNumber(exp)) return true; if(isString(exp)) return true; if(isBool(exp)) return true; if(isChar(exp)) return true; if(isLambda(exp)) return true; return false; } const value primitiveImplementation(const list& proc) { return car(cdr(proc)); } template const value primitiveProcedure(const F& f) { return mklist(primitiveSymbol, (lambda&)>)f); } const list primitiveProcedureNames() { list l = mklist("car"); l = cons("cdr", l); l = cons("cons", l); l = cons("list", l); l = cons("nul", l); l = cons("=", l); l = cons("+", l); l = cons("-", l); l = cons("*", l); l = cons("/", l); l = cons("equal?", l); l = cons("display", l); l = cons("uuid", l); return l; } const list primitiveProcedureObjects() { list 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); return l; } const bool isFalse(const value& exp) { return (bool)exp == false; } const bool isTrue(const value& exp) { return (bool)exp == true; } const bool isQuoted(const value& exp) { return isTaggedList(exp, quoteSymbol); } const value textOfQuotation(const value& exp) { return car(cdr((list )exp)); } const value makeLambda(const list& parameters, const list& body) { return cons(lambdaSymbol, cons(parameters, body)); } } } #endif /* tuscany_eval_primitive_hpp */