Next: , Previous: , Up: Top   [Contents][Index]


Appendix C 古いCLとの互換性

下記は、このパッケージとより古いQuirozのcl.elパッケージとの間の すべての既知の非互換のリストである。

このパッケージの関数の多重戻り値のエミュレーションは、より古い パッケージのそれと非互換である。あのパッケージは、真のCommon Lisp 多重戻り値にできる限り近付くように試みた; 不幸にも、それは100% 信頼できるものではなく、自由に使われた場合に時おり 意外なことになりがちだった。このパッケージは、よりシンプルな方法を 使う。すなわち、値のリストで多値を置き換える。それは、著しくCommon Lispとは相違するが、より予測可能である。

defkeywordフォームとkeywordp関数は、このパッケージでは 実装されていない。

memberfloorceilingtruncateroundmodrem関数は、Emacs 18またはEmacs 19に 存在する関数との衝突を避けるために、このパッケージでは接尾辞‘*’が 付けられる。より古いパッケージは、単にこれらの関数を再定義し、 組み込みの意味を上書きして、Emacs 19で重大な可搬性の問題を引き 起こした(いくつかのより最近のQuirozパッケージの版は、それらの名前を cl-memberその他へ変えた; このパッケージは、member* その他への別名として後者の名前を定義する)。

古いパッケージのバグがあるかCommon Lisp標準と一致しないある種の 関数は、このパッケージの準拠している版と非互換である。たとえば、 eqlmemberは、あのパッケージではeqmemq の同義語であったり、setfはその引数の評価の正しい順序を 保存できなかったり、など。

最後に、より古いパッケージとは異なり、このパッケージは注意深く、 内部名のすべてに接頭辞cl-を付けている。(floatp-safeletfのような)追加の機能として明示的に定義されているいくつかの 関数を除いて、このパッケージは、Common Lispの一部ではない、どんな 非‘cl-’シンボルも移出しない。

C.1 cl-compatパッケージ

CLパッケージは、互換パッケージcl-compatのフォームの中に、 古いcl.elのいくつかの機能のエミュレーションを含む。それを 使うためには、あなたのプログラムの中に(require 'cl-compat)を 置くこと。

古いパッケージは、cl-接頭辞や他の表記法なしで、かなりの数の内部 ルーチンを定義していた。これらのルーチンへの呼び出しが、既存のLisp コードに入り込んでしまっているかもしれない。cl-compatは、下記の 内部ルーチンのエミュレーションを提供する: pair-with-newsymszip-listsunzip-listsreassemble-arglistsduplicate-symbols-psafe-idiv.

いくつかのsetfフォームは、ユーザコードが直接呼び出す かもしれない内部関数への呼び出しへ翻訳された。関数setnthsetnthcdrseteltがこのカテゴリに入る; それらは cl-compatで定義されるが、最良の修正はsetfを適正に 使うように変えることである。

cl-compatファイルは、キーワード関数keywordpkeyword-ofdefkeywordを定義する。データとしての キーワードの使用には反対なので、それらは新しいCL パッケージによっては定義されない。

キーワード引数構文解析用のbuild-klistメカニズムは、 cl-compatでエミュレートされている; しかし with-keyword-argsはエミュレートされておらず、どんな場合でも、 defun*によって提供されるより自然なキーワード引数処理を 使うように変えるのが最良である。

多重戻り値は、2つのCommon Lispパッケージで異なって扱われる。古い パッケージの方法は、真のCommon Lispにより互換だったが、ある場合には 偽の多重戻り値を報告することを引き起こす発見的方法を使った。 cl-compatパッケージは、古いCLパッケージと互換の多重値マクロの 集合を定義する; 再び、それらは本質的に発見的であるが、古いパッケージの マクロが動作するところならどこでも動作することが保証される。“公式の” 多重値機能との名前の衝突を避けるため、cl-compatのそれは 大文字で始まる名前を持つ: ValuesValues-listMultiple-value-bindなど。

関数cl-floorcl-ceilingcl-truncatecl-roundは、古いスタイルの多値メカニズムを使うために、ちょうど それらが古いパッケージでしたのと同じようにcl-compatで定義される。 より新しいfloor*や友人は、多値としてではなくリスト中にその2つの 結果を戻す。古いパッケージの古い版は、ありのままの名前floorceilingその他を使ったことに注意せよ; それらはEmacs 19の組み込み のものと衝突するので、cl-compatはそれらの名前を使えない。