私はこのプロパティを書きました
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_ancestor
2 番目のパラメーターが欠けているところに間違いがあったため、プロパティは次のようになりました。
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は条件を満たさなかった。
上記のタイプと機能の説明は次のとおりです。
SymbolTable
HashMap (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)。name
s
is_ancestor s scope
Maybe (Scope,Symbol)
私のプロパティは次のように述べています。任意の名前テーブル スコープについて、lookupsymbol が返されるJust (s,_)
場合は であるs
必要がありますis_ancestor
が、何も返さない場合は、 のスコープに対してはscope
何も返されません。is_ancestor
scope