|
PH Logo
Logo intepreter modeled after UCB Logo.
|
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 }
1.7.4