void LispContinuation::EvaluateForm(const SExpressionCons *form) { SExpressionSpecialToken *tk = form->Car().DynamicCastGetPtr<SExpressionSpecialToken>(); if(tk) { SExpressionForm *f; SReference func; tk->GetApplicable(&f, &func, *this); if(f) { // special form f->Call(form->Cdr(), *this); } else { if(!func.GetPtr()) throw IntelibX_no_associated_function(tk); PushResult(func); //#error from might be null pointer... may throw but its not a bug! INTELIB_ASSERT(form, IntelibX_unexpected_unbound_value()); SExpressionCons *cdr = form->Cdr().DynamicCastGetPtr<SExpressionCons>(); if(cdr) { PlaceFormToStack(cdr, 1); } else { PushTodo(0); } } } else { // may be it's a lambda-list? SExpressionCons *dp = form->Car().DynamicCastGetPtr<SExpressionCons>(); if(dp) { if(dp->Car() == *PTheLispSymbolLambda) { LReference tmp = dp->Cdr(); PushResult(new LExpressionLambda(GetContext(), tmp.Car(), tmp.Cdr())); SExpressionCons *cdr = form->Cdr().DynamicCastGetPtr<SExpressionCons>(); if(cdr) { PlaceFormToStack(cdr, 1); } else { PushTodo(0); } } else { throw IntelibX_not_a_function(form->Car()); } } // okay, the last chance is that it is just a function... // let's place it to the stack, may be it will work PlaceFormToStack(form, 0); } }
void LispContinuation::CustomCommand(int opcode, const SReference& param) { switch(opcode) { case take_result_as_form: { SReference r; PopResult(r); PushTodo(just_evaluate, r); break; } case duplicate_last_result: { SReference r; PopResult(r); PushResult(r); PushResult(r); break; } default: // this will just throw an exception IntelibContinuation::CustomCommand(opcode, param); } }
//************************************************************************************ void CBCGPOutlineParser::DoParse (const CString& strBuffer, const int nStartOffset, const int nEndOffset, CObList& lstResults) { ASSERT (nStartOffset >= 0); ASSERT (nEndOffset < strBuffer.GetLength ()); ASSERT (nStartOffset <= nEndOffset); m_strOut.Empty (); CList <Lexeme, Lexeme&> lstStack; Lexeme lexemStackTop (0, LT_Eps, 0, 0); lstStack.AddTail (lexemStackTop); int nOffset = nStartOffset; while (nOffset <= nEndOffset) { // Get next lexem: Lexeme lexemNext = GetNext (strBuffer, nOffset, nEndOffset); Lexeme lexemTop = lstStack.GetTail (); if (lexemNext.m_nType == LT_EndOfText) { break; } // Parser logic: switch (lexemNext.m_nType) { case LT_BlockStart: lstStack.AddTail (lexemNext); break; case LT_BlockEnd: if (lexemTop.m_nType == LT_BlockStart && lexemTop.m_nBlockType == lexemNext.m_nBlockType) { // Push Block: lstStack.RemoveTail (); Lexeme lexemRes (lexemTop.m_nBlockType, LT_CompleteBlock, lexemTop.m_nStart, lexemNext.m_nEnd); PushResult (lexemRes, lstResults); } else { lstStack.AddTail (lexemNext); } break; case LT_CompleteBlock: { // Push Comment: PushResult (lexemNext, lstResults); } break; case LT_CustomBlock: break; } } // Finish parsing: while (!lstStack.IsEmpty ()) { Lexeme lexem = lstStack.RemoveTail (); PushResult (lexem, lstResults); } }
void wxGISTaskManager::OnGisNetEvent(wxGISNetEvent& event) { wxNetMessage msg = event.GetNetMessage(); wxString sErrMsg; switch(msg.GetCommand()) { case enumGISNetCmdBye: //server disconnected DeleteAllTasks(); //start task manager server StartTaskManagerServer(); //start timer to connect task server m_timer.Start(5000, false); break; case enumGISNetCmdHello: { wxNetMessage msg(enumGISNetCmdCmd, enumGISCmdGetChildren, enumGISPriorityHigh); m_pConn->SendNetMessage(msg); //QuereTasks(sErrMsg); } break; case enumGISNetCmdNote: //if message id != -1 add to notify if(msg.GetId() != wxNOT_FOUND) { TSKMNGR_RESULT Res = {msg.GetId(), msg.GetMessage(), msg.GetState()}; PushResult(Res); } else { switch(msg.GetState()) { case enumGISNetCmdStOk: wxLogMessage(msg.GetMessage()); break; case enumGISNetCmdStErr: wxLogError(msg.GetMessage()); break; //case enumGISCmdNoteVol: // UpdateVolume(msg.GetXMLRoot()->GetChildren()); // break; //case enumGISCmdNotePercent: // UpdatePercent(msg.GetXMLRoot()->GetChildren()); // break; case enumGISCmdNoteMsg: AddMessage(msg.GetXMLRoot()->GetChildren()); break; default: wxLogVerbose(msg.GetMessage()); break; } } break; case enumGISNetCmdCmd: //do something usefull if(msg.GetId() != wxNOT_FOUND) { TSKMNGR_RESULT Res = {msg.GetId(), msg.GetMessage(), msg.GetState()}; PushResult(Res); } if(msg.GetXMLRoot()) { switch(msg.GetState()) { case enumGISCmdStAdd: AddTask(msg.GetXMLRoot()->GetChildren()); break; case enumGISCmdStDel: DeleteTask(msg.GetXMLRoot()->GetChildren()); break; case enumGISCmdStStart: case enumGISCmdStStop: case enumGISCmdStChng: ChangeTask(msg.GetXMLRoot()->GetChildren()); break; case enumGISCmdGetChildren: LoadTasks(msg.GetXMLRoot()->GetChildren()); break; case enumGISCmdStPriority://TODO: change priority for all task simultaniasly default: break; } } break; default: break; } }