7

I know that both Eiffel (the progenitor) and Racket both to implement "Design by Contract" features. Sadly, I am not sure how one would different from the other. Eiffel's DBC is reliant on the OOP paradigm and inheritance, but how would Racket, a very different language account for such a disparity?

4

3 に答える 3

13

Racket が名声を得る主な理由は非難の概念であり、日常の Racket プログラミングにとって、ho 関数の処理は間違いなく大きな部分を占めています。

このホワイト ペーパーの最初の 2 つのセクションも参照してください。

http://www.ccs.neu.edu/scheme/pubs/oopsla01-ff.pdf

于 2011-04-15T02:41:52.837 に答える
9

まず第一に、この時点での最良の情報源はラケット ガイドです。これはリファレンス マニュアルではなく、入門テキストとして意図されています。具体的には、役立つ契約に関する広範な章があります。編集: ロビーが指摘した論文も参照してください。彼はラケットの主な契約担当者です。

質問ですが、エッフェル契約制度についてはよくわかりませんが、ラケットの制度よりも先行していると思います。ただし(これも「IIRC」です)Racket のコントラクト システムは、高次のコントラクトを導入した最初のシステムだったと思います。具体的には、適切な責任を割り当てる高階関数を扱う場合、もう少し複雑fooになりX? -> Y?ます。へのX?価値fooが非難されます。しかし、関数が満たされ(X? -> Y?) -> Z?X?述語が満たされていない場合、責任はfooクライアントではなく、それ自体にあります (Y?満たされていない場合、責任は依然としてクライアントにあります)。

于 2011-04-15T02:16:54.730 に答える
8

あなたが質問していると思いますが、OOPと継承なしで契約システムはどのように機能するのでしょうか?エッフェルに不慣れなラケットのユーザーとして、なぜ契約システムがOOPや継承と関係があるのだろうかと思っています。:)

実用的なレベルでは、動的型付け言語の柔軟性を維持しながら、静的型宣言の利点のいくつかを取得する方法として、Racketコントラクトを考えています。さらに、コントラクトはタイプだけでなく、アサートの役割を果たすことができます。

たとえば、関数には正確な整数である1つの引数が必要であると言えますが、正確なの整数、特定の値の和集合、または実際には渡された値の任意に複雑なテストである必要があるとも言えます。このように、Racketのコントラクトは、(a)型宣言と(b)C /C++のアサーションの両方で実行できることを組み合わせたものです。

ラケットの契約に関する1つの落とし穴は、それらが遅くなる可能性があるということです。これに対処する1つの方法は、開発中に最初にそれらを使用し、次に特に「内部ループ」タイプの関数からそれらを選択的に削除することです。私が試したもう1つのアプローチは、それらを大規模にオン/オフにすることです。contracts-on.rktとcontract-off.rktのようなペアモジュールを作成します。後者は、何もしないマクロを提供します。モジュールにcontracts.rktが必要であるようにします。これは、-onまたは-offファイルのいずれかからすべてを提供します。これは、DEBUGvsRELEASEモードでコンパイルするようなものです。

Eiffelから来ている場合は、Racket契約に対する私のC / C ++の傾斜は役に立たないかもしれませんが、とにかくそれを共有したいと思いました。

于 2011-04-15T17:34:32.213 に答える