空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

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_ptr pCondValue( 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_ptr pCondValue( pCond->eval(pE) );
    return (pCondValue->asBool()?pTSub:pFSub)->eval(pE);
}
CATCH_RUN_AND_THROW( "if failed." )