00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _IMPULSE_MESSAGE_H_
00009 #define _IMPULSE_MESSAGE_H_
00010
00011 #include "../impulse.h"
00012
00013 namespace impulse {
00014
00015
00016
00017
00018
00023
00024 class Message : public Frame {
00025
00026 public:
00027
00028 Message( Symbol& selector ) : _selector( selector ) { }
00029 Message( Symbol& selector, Value arg1 ) : _selector( selector ), _args( arg1 ) { }
00030 Message( Symbol& selector, Value arg1, Value arg2 ) : _selector( selector ), _args( arg1, arg2 ) { }
00031
00032 Value eval( Array& args, Value self );
00033
00034 Value evaluate( Array& args, Value self, Value context );
00035
00036 string inspect() { return "[Message]"; }
00037
00038 private:
00039
00040 Symbol& _selector;
00041 Array _args;
00042
00043 };
00044
00045
00046
00047
00048
00049 class Assign : public Frame {
00050
00051 public:
00052
00053 Assign( Symbol& symbol, Express& expr ) : _symbol( symbol ), _expr( expr ) { }
00054
00055 Value eval( Array& args, Value self )
00056 {
00057 Value context = args.at(0);
00058 Array margs;
00059
00060 return self.setSlot( _symbol, _expr.eval( margs, context ) );
00061 }
00062
00063 private:
00064
00065 Symbol& _symbol;
00066 Express& _expr;
00067
00068 };
00069
00070
00071
00072
00073
00074 Value Message::eval( Array& args, Value self )
00075 {
00076 BEG( "Message::eval( self = " << self.inspect() << " )" );
00077
00078 Value context = args.at(0);
00079
00080 Array sendArgs( _args.size() );
00081 for (unsigned int i = 0; i < _args.size(); i++)
00082 {
00083 sendArgs.atPut( i, _args.at(i).eval( args, context ) );
00084 }
00085
00086 Value result = self.send( _selector, sendArgs );
00087
00088 END( result.inspect() );
00089
00090 return result;
00091 }
00092
00093 }
00094
00095 #endif