クォートと問題2.54
問題2.53と2.55はScheme特有の話なのでパス。
Schemeでのeq?はアドレスの比較で、equal?は値の比較なのだが、
実際の使われ方を見ているとC++での対応物として、
さしあたりeq?はList内部のstringの値の比較として差し支えないように見える。
が、3章で参照が出た時に困ってくるのかも・・・。
アドレスの比較でちゃんと実装しようと思ったら、
そこまでする必要があるのか現時点で確信できない。
とりあえず値の比較で押してみるか。
----
//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 件のコメント :
コメントを投稿