PH Logo
Logo intepreter modeled after UCB Logo.
/Users/paul/Documents/phlogo/core/ArithmeticVerbs.cpp
00001 /*
00002  *  PredicateVerbs.cpp
00003  *
00004  *  Author: Paul Hamilton
00005  *      Date: 17 Aug 2011
00006  *
00007  */
00008 
00009 #include "Verbs.h"
00010 
00011 #include "Thing.h"
00012 #include "World.h"
00013 #include "TokenStream.h"
00014 #include "Interpreter.h"
00015 
00016 #include <boost/algorithm/string/case_conv.hpp>
00017 
00018 #include <math.h>
00019 
00020 #define PI 3.14159265
00021 
00022 using namespace std;
00023 using namespace boost;
00024 using namespace boost::algorithm;
00025 
00026 namespace phlogo {
00027 
00028 void Verbs::sum(TokenStream *ts) {
00029 
00030     bool isdouble = false;
00031     bool d = false;
00032     double x = getNum(ts, &d);
00033     if (d)
00034         isdouble = true;
00035 
00036         if (ts->withinSubExpression()) {
00037                 while (ts->hasMoreSubExpression()) {
00038             d = false;
00039             x += getNum(ts, &d);
00040             if (d)
00041                 isdouble = true;
00042                 }
00043         }
00044         else {
00045         d = false;
00046         x += getNum(ts, &d);
00047         if (d)
00048             isdouble = true;
00049     }
00050     if (isdouble)
00051         setDoubleResult(x);
00052     else
00053         setLongResult(x);
00054 }
00055 
00056 void Verbs::difference(TokenStream *ts) {
00057 
00058     bool isdouble = false;
00059     bool d = false;
00060     double x = getNum(ts, &d);
00061     if (d)
00062         isdouble = true;
00063     
00064     d = false;
00065     x -= getNum(ts, &d);
00066     if (d)
00067         isdouble = true;
00068     
00069     if (isdouble)
00070         setDoubleResult(x);
00071     else
00072         setLongResult(x);
00073 }
00074 
00075 void Verbs::minus(TokenStream *ts) {
00076     
00077     bool isdouble = false;
00078     double x = getNum(ts, &isdouble);
00079     if (isdouble)
00080         setDoubleResult(-x);
00081     else
00082         setLongResult(-x);
00083  
00084 }
00085 
00086 void Verbs::product(TokenStream *ts) {
00087 
00088     bool isdouble = false;
00089     bool d = false;
00090     double x = getNum(ts, &d);
00091     if (d)
00092         isdouble = true;
00093     
00094         if (ts->withinSubExpression()) {
00095                 while (ts->hasMoreSubExpression()) {
00096             d = false;
00097             x *= getNum(ts, &d);
00098             if (d)
00099                 isdouble = true;
00100                 }
00101         }
00102         else {
00103         d = false;
00104         x *= getNum(ts, &d);
00105         if (d)
00106             isdouble = true;
00107     }
00108     if (isdouble)
00109         setDoubleResult(x);
00110     else
00111         setLongResult(x);
00112 }
00113 
00114 void Verbs::quotient(TokenStream *ts) {
00115 
00116     bool d = false;
00117     double x = getNum(ts, &d);
00118         if (ts->withinSubExpression()) {
00119         x = 1/x;
00120         }
00121     else {
00122         x /= getNum(ts, &d);
00123     }  
00124     setDoubleResult(x);
00125 }
00126 
00127 void Verbs::remainder(TokenStream *ts) {
00128 
00129     setLongResult(getLong(ts) % getLong(ts));
00130     
00131 }
00132 
00133 void Verbs::integer(TokenStream *ts) {
00134     
00135     bool d = false;
00136     double x = getNum(ts, &d);
00137     setLongResult((int)x);
00138     
00139 }
00140 
00141 void Verbs::round(TokenStream *ts) {
00142 
00143     bool d = false;
00144     double x = getNum(ts, &d);
00145     setLongResult(::round(x));
00146     
00147 }
00148 
00149 void Verbs::sqrt(TokenStream *ts) {
00150     
00151     setDoubleResult(::sqrt(getDouble(ts)));
00152     
00153 }
00154 
00155 void Verbs::power(TokenStream *ts) {
00156     
00157     double a = getDouble(ts);
00158     double b = getDouble(ts);
00159     setDoubleResult(::pow(a, b));
00160     
00161 }
00162 
00163 void Verbs::exp(TokenStream *ts) {
00164 
00165     setDoubleResult(::exp(getDouble(ts)));
00166     
00167 }
00168 
00169 void Verbs::log10(TokenStream *ts) {
00170 
00171     setDoubleResult(::log10(getDouble(ts)));
00172 
00173 }
00174 
00175 void Verbs::ln(TokenStream *ts) {
00176 
00177     setDoubleResult(::log(getDouble(ts)));
00178     
00179 }
00180 
00181 double degToRad(double deg) {
00182     return (deg/180.0)*PI;
00183 }
00184     
00185 void Verbs::sin(TokenStream *ts) {
00186 
00187     setDoubleResult(::sin(degToRad(getDouble(ts))));
00188 
00189 }
00190 
00191 void Verbs::radsin(TokenStream *ts) {
00192 
00193     setDoubleResult(::sin(getDouble(ts)));
00194 
00195 }
00196 
00197 void Verbs::cos(TokenStream *ts) {
00198     
00199     setDoubleResult(::cos(degToRad(getDouble(ts))));
00200     
00201 }
00202 
00203 void Verbs::radcos(TokenStream *ts) {
00204 
00205     setDoubleResult(::cos(getDouble(ts)));
00206     
00207 }
00208 
00209 void Verbs::arctan(TokenStream *ts) {
00210 
00211     setDoubleResult(::atan(degToRad(getDouble(ts))));
00212     
00213 }
00214 
00215 void Verbs::radarctan(TokenStream *ts) {
00216 
00217     setDoubleResult(::atan(getDouble(ts)));
00218     
00219 }
00220 
00221 void Verbs::iseq(TokenStream *ts) {
00222     
00223     long a = getLong(ts);
00224     long b = getLong(ts);
00225     
00226     pThing t(new Thing());
00227     List l = t->allocList();
00228     if (a < b) {
00229         for (long i=a; i<=b; i++) {
00230             pThing u(new Thing());
00231             u->set(i);
00232             l.add(u);
00233         }
00234     }
00235     else {
00236         for (long i=a; i>=b; i--) {
00237             pThing u(new Thing());
00238             u->set(i);
00239             l.add(u);
00240         }
00241     }
00242     _world->setResult(t);
00243 }
00244 
00245 void Verbs::rseq(TokenStream *ts) {
00246     
00247     long a = getLong(ts);
00248     long b = getLong(ts);
00249     long c = getLong(ts);
00250     
00251     double dist = ((double)(b - a))/((double)c-1);
00252     
00253     pThing t(new Thing());
00254     List l = t->allocList();
00255     for (double i=a; i<=b; i += dist) {
00256         pThing u(new Thing());
00257         u->set(i);
00258         l.add(u);
00259     }
00260     _world->setResult(t);
00261 }
00262 
00263 void Verbs::lessp(TokenStream *ts) {
00264 
00265     setBooleanResult(getDouble(ts) < getDouble(ts));
00266     
00267 }
00268 
00269 void Verbs::greaterp(TokenStream *ts) {
00270     
00271     setBooleanResult(getDouble(ts) > getDouble(ts));
00272     
00273 }
00274 
00275 void Verbs::lessequalp(TokenStream *ts) {
00276     
00277     setBooleanResult(getDouble(ts) <= getDouble(ts));
00278     
00279 }
00280 
00281 void Verbs::greaterequalp(TokenStream *ts) {
00282     
00283     setBooleanResult(getDouble(ts) >= getDouble(ts));
00284     
00285 }
00286     
00287 
00288 }
 All Classes Functions