2012-08-13

SCIP in C++11 ― 2.3.1節


クォートと問題2.54

問題2.532.55Scheme特有の話なのでパス。

Schemeでのeq?はアドレスの比較で、equal?は値の比較なのだが、
実際の使われ方を見ているとC++での対応物として、
さしあたりeq?List内部のstringの値の比較として差し支えないように見える。
が、3章で参照が出た時に困ってくるのかも・・・。
アドレスの比較でちゃんと実装しようと思ったら、
Flyweightパターン使ってリスト管理をしないといけないと思うが、
そこまでする必要があるのか現時点で確信できない。
とりあえず値の比較で押してみるか。

----
//eq?
template <typename LeafType>
const bool isEq(const LeafType& leafItem,
                const List& x)
{
    return(leafItem==value<LeafType>(x));
}


//equal?
template<typename LeafType>
const bool isEqual(const List& list1,
                   const List& list2)
{
    if(isNull(list1) && isNull(list2)){return(true);}
    else if(isNull(list1) || isNull(list2)){return(false);}
    else if(value<LeafType>(car(list1))
            !=value<LeafType>(car(list2)))
        {return(false);}
    return(isEqual<LeafType>(cdr(list1),cdr(list2)));
}

//memq
template <typename LeafType>
const List memq(const LeafType& searchLeafItem,
                const List& x)
{
    if(isNull(x)){return(x);}
    else if(isEq(searchLeafItem,car(x))){return(x);}
    return(memq(searchLeafItem,cdr(x)));
}




//---------abstraction barrier---------

int main(int argc, char** argv)
{
    const auto list1(makeList("apple","banana","prune"));
    cout<<"list1 ="<<listString(list1)<<endl;
    cout<<"(memq 'banana list1) = "
        <<listString(memq(string("banana"),list1))<<endl;

    cout<<endl<<"Excersize 2.54:"<<endl;
    const auto list2(makeList("apple","banana","pear"));
    cout<<"list2 ="<<listString(list2)<<endl;
    cout<<"(equal? list1 list2) = "<<isEqual<string>(list1,list2)<<endl;
   
    cout<<endl;
    const List list3(makeList("apple","banana","prune"));
    cout<<"list3 ="<<listString(list3)<<endl;
    cout<<"(equal? list1 list3) = "<<isEqual<string>(list1,list3)<<endl;
   


    return(0);
}
----
出力
----
list1 =(apple banana prune)
(memq 'banana list1) = (banana prune)

Excersize 2.54:
list2 =(apple banana pear)
(equal? list1 list2) = 0

list3 =(apple banana prune)
(equal? list1 list3) = 1

0 件のコメント :

コメントを投稿