命名の慣習 - lisp-cookbook-ja/common-lisp GitHub Wiki
ここでは、関数名や変数名の主な命名の慣習を挙げます。
変数名
:global-variable: 大域変数で用いられます。Common Lispの場合は、更にスペシャル変数であることを意味することが多いようです。 スペシャル変数に**が一貫して付いているのはCommon Lispの仕様策定の際に投票で議決された結果です。
:constant-variable: 大域定数。Common Lisp標準の大域定数は、飾りは付いていません (pi、most-positive-fixnum等々) 一貫して定数には何も装飾がされていないのはCommon Lispの仕様策定の際に投票で議決された結果です。
:+constant-variable+: 比較的最近の慣習のようですがユーザ定義の定数で用いられます。
CLIM方面が発祥のようです。
関数名
:foo1: :foo-1: fooの補助関数を表わすことが多いようです。foo1の補助関数は、foo2となります。かなり古くからある慣習のようでLISP 1.5時代からあるようです。
:foo-aux: :foo-internal: fooの補助関数を表わします。
:%foo: :|foo-internal|: ユーザが使うことを意図していない、内部的な関数を意味することが多いようです。 |で囲むのは、伝統的に関数名は大文字だけの所を敢えて小文字を含めて特殊な記述することにより内部的なものであることを強調する意図があるようです(特殊な記号を含めることもあります)。
MIT Lispマシンでは、%fooというのはマイクロコードで書かれた関数を表わしており、処理系の内部的なところに使われていましたので、この辺りが由来と思われます。
:nfoo: :dfoo: :foo!: fooと同じ結果を返す破壊的な関数です。例えばreverseに対するnreverseなどです。Nは「No Consing」からのようです。 Interlisp方面では、d(estructive)を付けます。(dreverse等) Schemeでは!を付けるのが慣習となっています。
述語
:foop: :foo-p: :foo?: 述語(predicate)の場合、最後にpを付けることが昔からの伝統になっています。foo?も多く使われます。 singlep、multi-word-pのように一語にはpを、複数語にはハイフン付き-pを使うのも伝統のようです。 CLtL2ではstring-lesspはstring型に対するlesspである、としてハイフンの使い方の一貫性にこだわりを見せています。
変換するもの
:foo-to-bar: :bar-from-foo: :foo->bar: :foo-bar: fooからbarへ変換するようなものに付けられます。 :ensure-foo: 引数が既に要求を満している場合は、そのまま引数を、そうでなければ、要求を満すように加工して返したり、新しく生成したりするものに良く使われます
CLOS
:foo-mixin: mixinという考えは、Rubyで有名になりましたが、それ自体はインスタンスを作らず何かと混ぜて利用するクラスをfoo-mixinのように命名する慣習は、CLOS以前のFlavorsの時代からあるようです。
マクロ
:deffoo: :define-foo-bar: fooを定義するようなマクロに付けられます。
-p系と同じく、一単語で完結する場合は、deffooを、複数単語で構成する場合は、define-foo-barとする場合が多いようです。
:with-foo: :without-foo: 何かの処理を準備し、本体が終了すれば、後始末をするようなマクロに付けられることが多いようです。 with-open-file等。
:do-foo: 主に副作用目的で何かをするマクロに付けられることが多いようです。
:make-foo: fooを生成する場合に用いられます。defstructの定義では自動で生成もされます。
:foof: setfのように汎変数を扱うfooマクロを表わします。FはFieldの略だそうです。
:set-foo: fooになにかを設定する場合に使われますが、CLの場合、setfでの汎変数の仕組みがありますので、(setf (foo x) val)とする場合が多いようです。
:fooq:
setq等。かなり古くからの伝統のようですが、CLでは、setqに残るのみです。
(foo 'bar)というものがあった場合、quoteの省略としてqを付けます。eqで比較するmember)等。
(foo 'bar :test #'eq)というものがあった場合、省略形態としてqを付けます。CL以前の処理系の慣習です。CL以前の処理系では、CLのようにテスト関数を取ることはありませんでしたので、比較関数に応じたものが存在していました。memq等(その他
:*foo:
fooの補助関数を表わしますが、fooよりも機能が足りないものを表わすことがあるようです。固定引数の*my-equalを定義し、それを利用して可変引数のmy-equalを定義する、等。
fooという関数が先にあった場合、名前の衝突を避けるために付けることがあるようです。
:foo*:
letとlet*、doとdo*等。
主に束縛をするマクロの場合、パラレルに束縛するのではなくシリアルに束縛する場合に付けられます。fooの補助関数を表わしますが、fooよりも機能が多い万能的な関数を表わすことがあるようです。万能的な関数としてmap*を定義し、それに与えるオプションを変えることにより、mapcar、mapc、maplist、maplを作成する等。
参考
[CLiki:Naming conventions](//www.cliki.net/Naming conventions)