etolisp進捗(2)
今日は if の実装。九行。
LISPF_TRY( If ) { const Cons *pCons = pValue->asCons(); const Value *pCond = pCons->car(); pCons = pCons->cdr()->asCons(); const Value *pTSub = pCons->car(); pCons = pCons->cdr()->asCons(); const Value *pFSub = pCons->car(); if ( !pCons->cdr()->isNil() ) THROW_TOO_MANY_ARG; auto_ptrpCondValue( pEngine->eval(&pCond->entity(pEngine)) ); return pEngine->eval( &(pCondValue->asBool()?pTSub:pFSub)->entity(pEngine) ); } CATCH_RUN_AND_THROW( "if failed." )
evalを,pEngine(LispCore クラス,処理系そのもの)のメンバにするんじゃなくて,Valueのメンバにした方がすっきりしそうな気がする(んでもって,entity()の中で評価してしまう)。そのコンセプトで問題ないかなあ。
追記:けっきょくこうなった。
進捗(3)の考察も取り入れた。
LISPF_TRY( If ) { const Cons *pCons = pValue->asCons(); const Value *pCond = pCons->car(); pCons = pCons->cdr()->asCons(); const Value *pTSub = pCons->car(); pCons = pCons->cdr()->asCons(); const Value *pFSub = pCons->car(); pCons->IamRearGuard(); auto_ptrpCondValue( pCond->eval(pE) ); return (pCondValue->asBool()?pTSub:pFSub)->eval(pE); } CATCH_RUN_AND_THROW( "if failed." )