Posted 2015-04-15 17:40:35 GMT
自分は、C++のことは殆ど知らないのですが、関数名にremove_if
や、count_if
、set_difference
があるのを見て、これってCommon Lispに由来してるんじゃないのかなと思っていました。
しかし、C++のBoostは関数型言語に強い影響を受けているという話を耳にすることはあれ、C++ STLががCommon Lispに影響を受けているという話は耳にしたことが無い気がします。
適当にウェブをググってみたりしても、そんな話もないので、大元であるSTL作者の一人 Alexander A. Stepanov氏のWikipediaでの記述や、氏のウェブページを眺めてみたところ、STLの先祖は、Adaのリスト(シークエンス)ライブラリで、そのコンセプトの検証にSchemeが使われたらしいことが分かりました。
A library of generic algorithms in Adaの方には、リストライブラリは、Common Lispをベースにしているという記述もあります。
このページから、このリストライブラリもダウンロードできるので、暇潰しにどれだけCommon Lispに似ているか一覧を作ってみることにしました。
名前は同じものの動作が違っているものには、(※)を付けました。
Ada | CLそのまま | CLとは別名 |
---|---|---|
Accumulate | … | … |
Add_Current | … | … |
Add_First | … | PUSH |
Add_Last | … | … |
Advance | … | POP |
Append | APPEND | … |
Append_First_N | … | … |
Attach_To_Tail | … | … |
Butlast | BUTLAST※ | … |
Butlast_Copy | … | BUTLAST |
Concatenate | CONCATENATE※ | NCONC |
Concatenate_Copy | … | CONCATENATE |
Construct | … | … |
Copy_First_N | … | … |
Copy_Sequence | … | COPY-SEQ |
Count | COUNT | … |
Count_If | COUNT-IF | … |
Count_If_Not | COUNT-IF-NOT | … |
Create | … | … |
Current | … | … |
Delete | DELETE | … |
Delete_Copy | … | REMOVE |
Delete_Copy_Append | … | … |
Delete_Copy_Duplicates | … | REMOVE-DUPLICATES |
Delete_Copy_Duplicates_Append | … | … |
Delete_Copy_If | … | REMOVE-IF |
Delete_Copy_If_Not | … | REMOVE-IF-NOT |
Delete_Duplicates | DELETE-DUPLICATES | … |
Delete_If | DELETE-IF | … |
Delete_If_Not | DELETE-IF-NOT | … |
Drop_Head | … | POP |
Drop_Tail | … | … |
Empty | … | NULL |
Equal | EQUAL | … |
Every | EVERY | … |
Find | FIND | … |
Find_If | FIND-IF | … |
Find_If_Not | FIND-IF-NOT | … |
First | FIRST | … |
For_Each | … | MAPC |
For_Each_2 | … | MAPC |
For_Each_Cell | … | MAPL |
For_Each_Cell_2 | … | MAPL |
Free | … | … |
Free_Construct | … | … |
Free_Sequence | … | … |
Front | … | … |
Full | … | … |
Initialize | … | … |
Invert | … | … |
Invert_Copy | … | … |
Invert_Partition | … | … |
Is_Empty | … | NULL |
Is_End | … | ENDP |
Is_Not_End | … | … |
Last | LAST※ | … |
Length | LENGTH | … |
Make_Sequence | MAKE-SEQUENCE | … |
Map | MAP | … |
Map_2 | … | … |
Map_Copy | … | … |
Map_Copy_2 | … | … |
Map_Copy_2_Append | … | … |
Map_Copy_Append | … | … |
Merge | MERGE | … |
Merge_Non_Empty | … | … |
Mismatch | MISMATCH | … |
Next | … | CDR REST |
Not_Any | … | NOTANY |
Not_Every | … | NOTEVERY |
Nth | NTH | … |
Nth_Rest | … | NTHCDR |
Pop | POP | … |
Pop_Front | … | … |
Position | POSITION | … |
Position_If | POSITION-IF | … |
Position_If_Not | POSITION-IF-NOT | … |
Push | PUSH | … |
Push_Front | … | PUSH |
Push_Rear | … | … |
Rear | … | … |
Reduce | REDUCE | … |
Reverse_Append | … | REVAPPEND |
Reverse_Concatenate | … | NRECONC |
Search | SEARCH | … |
Set_Current | … | … |
Set_First | … | (SETF FIRST) RPLACA |
Set_Last | … | … |
Set_Next | … | (SETF REST) RPLACD |
Set_Nth | … | (SETF NTH) |
Some | SOME | … |
Sort | SORT | … |
Split | … | … |
Subsequence | … | SUBSEQ |
Substitute | SUBSTITUTE | … |
Substitute_Copy | … | … |
Substitute_Copy_If | … | … |
Substitute_Copy_If_Not | … | … |
Substitute_If | SUBSTITUTE-IF | … |
Substitute_If_Not | SUBSTITUTE-IF-NOT | … |
Top | … | … |
このリストでは、双方向リンクリストや、スタック、ベクタのための関数もあるのでCommon Lispのものと対応していないものも散見されますが、Common Lispもリストを含めてシークエンスに関しては、genericな関数が多いので大体同じです。
主な違いとしては、このAdaのライブラリは、副作用ありの処理が標準となっていて、名前もそちらが標準という感じで、コピーを作るものは、なんとか_Copy
という名前が付いていることでしょうか。
この表をみる限りでは、Common LispのシークエンスライブラリをAdaに移植したといっても良いような気さえします。
さて、後継のC++ STLではどうなっているのか。続けられたら続きます…。
■
HTML generated by 3bmd in SBCL 1.2.10