2016-06-28 14 views
3

elt、nth、mapcarなどの名前をプロトタイプ作成の新しいデータ構造に使用したいと思いますが、これらの名前は通常の関数を指定するため、ジェネリック関数として再定義される。一般関数を汎用関数に置き換える

おそらく、これらの名前を再定義するのは悪いフォームですか?

defgenericにプログラムエラーを生成しないように指示し、関数バインディングを置き換える方法はありますか?

これらは汎用関数ではない、または歴史的な理由がありますか?

ここで考慮された知恵とベストプラクティスはどうですか?

答えて

7

あなたはSBCLやABCLを使用しており、ANSI準拠に関係していない場合は、拡張可能なシーケンスを調査することができます:

http://www.sbcl.org/manual/#Extensible-Sequences

http://www.doc.gold.ac.uk/~mas01cr/papers/ilc2007/sequences-20070301.pdf

...あなたは、関数を再定義することはできませんCOMMON-LISPパッケージでは、新しいパッケージを作成し、再定義する関数のインポートをシャドーすることができます。

6

これらは一般的な機能ではない、または歴史的な理由がありますか?

Common Lispにはいくつかの領域があります。ソフトウェアのより高いレベルの部分は、より低いレベルの構築物上に構築する必要があるかもしれない。

目的の1つは、さまざまなアプリケーションで十分に高速でした。

Common Lispはまた、という配列というアイデアを導入しました。これはリストとベクターに対する抽象化で、言語にはオブジェクトシステムがないときです。 CLOSは、初期のCommon Lispデザインの数年後に登場しました。

たとえば、数字の場合、等価のようなものを使用します。

Lispは=があります。数字を比較するための最速の方法です

(= a b) 

=も番号に対してのみ定義されています。

次に、eql,equalおよびequalpがあります。それらは数字だけでなく、他のいくつかのデータ型にも作用します。

あなたはもっとスピードが必要な場合さて、あなたは型を宣言し、高速なコードを生成するようにコンパイラーに指示することができます。

だから、
(locally 
    (declare (fixnum a b) 
      (optimize (speed 3) (safety 0))) 
    (= a b)) 

、なぜ=ないCLOS総称関数はありますか?

A)それはCLOSは

が、同様に重要な存在していなかったときに導入されました:

B)のCommon Lispの中で、それが(そしてそれはまだありません)CLOSは、一般的な作り方は知られていませんでした関数=は、一般的な使用シナリオでは非ジェネリック関数と同じくらい高速ですが、動的な型指定と拡張性は維持します。

CLOSジェネリック関数は速度ペナルティを持っています。ランタイム・ディスパッチ・コスト。

CLOSは、拡張性、マルチディスパッチ、継承/組み合わせなどの機能を実際に享受する上位レベルのコードに最適です。同様のメソッドのコレクションではなく、ジェネリック関数を定義されたジェネリックの動作に使用する必要があります。

より優れた実装技術、実装固有の言語拡張などを使用すると、CLOSを使用して効率的に記述できるコードの範囲を広げることができます。これは、DylanやJuliaのようなプログラミング言語で試されてきました。

おそらく、これらの名前を再定義するのは悪いフォームですか?

一般的なLispの実装では、それを置き換えることはできません。置き換え関数は、古い関数と一貫して動作するように実装する必要があることに注意してください。また、古いバージョンは何らかの方法でインライン化され、どこでも置き換えられることはありません。

defgenericにプログラムエラーを生成しないように指示し、関数バインディングを置き換える方法はありますか?

置き換え中は、交換が正常に行われていることを確認する必要があります。コードを置き換える関数は、置き換える関数を使用することがあります。

実装では、CL関数を置き換えることができますが、これは実装固有のものです。たとえば、LispWorksは変数lispworks:*packages-for-warn-on-redefinition*lispworks:*handle-warn-on-redefinition*を提供します。 1つは、それらを拘束するか、またはそれらをグローバルに変更できます。

ここで考慮された知恵とベストプラクティスはどうですか?標準のCommon Lispを交換する

  • 使用の実装固有の方法が

これは危険なことを機能:

は二つのアプローチがあります。さらに、使用したいCLのすべての実装でサポートする必要があります。

  • 新しい言語を定義する言語パッケージを使用します。ここではこれは標準のCommon Lispとあなたの拡張/変更です。ユーザーが使用するすべてのものをエクスポートします。ソフトウェアでCLの代わりにこのパッケージを使用してください。
関連する問題