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


Appendix B Common Lispとの互換性

下記は、このパッケージとSteele(第2版)に文書化されたCommon Lispとの間の すべての既知の非互換のリストである。

memberassocfloorのようなある種の関数名は、 (非互換な)Emacs Lisp関数によってすでに取られていた; このパッケージは、 これらの関数のCommon Lisp版の名前に‘*’を付加する。

defun*は、拡張されたCommon Lisp引数リストを関数で使うために、 defunの代わりに必要である。同様に、defmacro*function*は、これらのフォームの完全な機能の引数リストを理解する 版である。&wholeキーワードは、defmacro引数リストでは (再帰的引数リストの中を例外として)動作しない。

効率的な実装を許すために、キーワード引数は、キーワードシンボルが他の キーワード引数のとして渡された場合に混乱するかもしれない、 わずかに下等な構文解析器を使う(つまり、 (memq :keyword rest-of-arguments)が、与えられた キーワード引数の中を:keywordを見つけようと走査するために 使われる)。

eqlequal述語は、IEEE浮動小数点の正の0と負の0を 区別しない。equalp述語は、Common Lispといくつかの相違がある; see 述語.

setfメカニズムは完全に互換だが、setf-methodは5つの値を 直接戻すのではなく、5つの値のリストを戻す点が異なる。また、 ((defun (setf foo) …)が典型的であるような)新しい “setf関数”の概念は実装されていない。

do-all-symbolsフォームは、obarray引数がない do-symbolsと同じである。Common Lispでは、このフォームはすべての パッケージ中のすべてのシンボルの上で繰り返す。Emacsのobarrayは、 ファーストクラスのパッケージメカニズムではないので、 do-all-symbolsが既定のobarray以外を確認する方法はない。

loopマクロは、loop-finishと型指定子が実装されていない 点を除いて完全である。

多値戻し機能はリストを多値として扱うが、それはEmacs Lispは多重戻り値を 直接サポートしないためである。valuesまたはvalues-listが、 multiple-value-bindや他の多値受け取り側へ戻るために常に使われる 場合、マクロはCommon Lispと互換だろう; valuesmultiple-value-…なしで使われたり、 multiple-value-…valuesなしで使われたりする場合、 効果はCommon Lispとは異なるだろう。

多くのCommon Lisp宣言は無視され、その他は概念としてはCommon Lisp標準に マッチするが、詳細はマッチしない。たとえば局所special宣言は、 Emacs Lispでは純粋に助言だが、Steeleの本に規定されたスコープ規則に 厳密には従わない。

変数*gensym-counter*は、0ではなく疑似乱数値で開始する。これは、 生成されたシンボルは、ファイルへ書かれ、ファイルからロードされたときに internされるという事実をうまく処理できる。

defstruct機能は互換だが、構造体は、ある特殊な別の型ではなく、 既定では:type vector :namedの型である点が異なる。 また、:typeスロットオプションは無視される。

check-typeの第2引数は異なる扱いをされる。