1

私はこのプロパティを書きました

prop_lookupsymbol = forAll $ \name table scope -> case lookupsymbol name table scope of
                                                  Just (s,_) -> property $ is_ancestor s scope
                                                  Nothing ->  forAll $ \s->is_ancestor s ==> (lookupsymbol name table s) == Nothing

で実行するとsmallCheck 3 prop_lookupsymbol、結果は次のようになります。

9000回のテストを失敗なく完了しました。
しかし、9000 は ==> 条件を満たしていませんでした。

プロパティの呼び出しを指していることは知ってい==>ますが、それはどういう意味did not meetですか? これについて心配する必要がありますか?はいの場合、条件を満たさなかったテストを取得するにはどうすればよいですか?

編集

is_ancestor2 番目のパラメーターが欠けているところに間違いがあったため、プロパティは次のようになりました。

   prop_lookupsymbol = forAll $ \name table scope -> case lookupsymbol name table scope of
                                                  Just (s,_) -> property $ is_ancestor s scope
                                                  Nothing ->  forAll $ \s->is_ancestor s scope ==> (lookupsymbol name table s) == Nothing

しかし9000から8340は条件を満たさなかった。

上記のタイプと機能の説明は次のとおりです。

SymbolTableHashMap (Scope,String) Symbol( unordered-containers パッケージから)の型シノニムですHashMap.Strict。これは単にコンパイラを構築するためのものです :)。

シンボルにはさまざまなコンストラクター (変数、関数、型など) がありScope、シンボルが定義されているスコープを定義します。ファイル、クラス、関数、メソッド (クラス内の関数)、インターフェイスがあります。

スコープには名前(ファイル名、クラス名など)と上位スコープがあり、クラスの場合、親スコープ(継承の親)とインターフェーススコープのリスト(クラスが実装する)もあり、インターフェーススコープには親がありますスコープとその上部スコープ。

この関数is_ancestor s1 s2は、s1 が s2 の上位スコープ (または upper-upperscope または upper-upper-upper...) であるか、親スコープ (または parent-parent または parent-parent-...) であるか、またはいずれかのインターフェース (または親のインターフェースなど)、それis_ancestor s sは常に真実であることに言及する必要があります。

最後に、名前がでスコープがtrueのlookupsymbol name table scopeシンボルを見つけようとします。その戻り値の型は、見つかったシンボルをシンボルが定義されているスコープと共に返すことを意味します (何も見つからない場合は Nothing)。namesis_ancestor s scopeMaybe (Scope,Symbol)

私のプロパティは次のように述べています。任意の名前テーブル スコープについて、lookupsymbol が返されるJust (s,_)場合は であるs必要がありますis_ancestorが、何も返さない場合は、 のスコープに対してはscope何も返されません。is_ancestorscope

4

0 に答える 0