00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _IMPULSE_EXPRESSION_H_
00009 #define _IMPULSE_EXPRESSION_H_
00010
00011 #include "array.h"
00012
00013 namespace impulse {
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 class Expression : public Frame {
00027
00028 public:
00029
00030
00031
00032 Expression( Value* code ) : _code( code ) { }
00033 Expression( Array& code ) : _code2( &code ) { }
00034
00035
00036
00037 Value eval( Array& args, Value self );
00038
00039 string inspect() { return "[Expression]"; }
00040
00041 Value invoke( Array& args, Value self );
00042
00043 private:
00044
00045 Value* _code;
00046 Array* _code2;
00047
00048 };
00049
00050
00051
00052
00053
00054 Value Expression::eval( Array& args, Value self )
00055 {
00056 Value result = -1.0;
00057
00058 BEG( "Expression::eval()" );
00059
00060 result = invoke( args, self );
00061
00062 END( "" );
00063
00064 return result;
00065 }
00066
00067
00068 Value Expression::invoke( Array& args, Value self )
00069 {
00070 Value* ip = _code2->data();
00071 Value* end = _code2->data() + _code2->size();
00072 Value value = self;
00073
00074 while (ip < end)
00075 {
00076 value = ip++->eval( args, value );
00077 }
00078
00079 return value;
00080 }
00081
00082 }
00083
00084 #endif