#:g1: C++ STLにCommon Lispの影響はあるのかを探る旅(1)

Posted 2015-04-15 17:40:35 GMT

自分は、C++のことは殆ど知らないのですが、関数名にremove_ifや、count_ifset_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

comments powered by Disqus