FPARSECのアップグレード:差別された組合をアップグレードして、新しい平等/比較の制約を満たす
-
21-09-2019 - |
質問
だから、aによって こんにちはlarIousシリーズのイベント, 、FPARSECソースをダウンロードして構築しようとしました。残念ながら、それは新しい1.9.9.9と互換性がありません。簡単な問題を修正しましたが、まだ機能しない差別された組合がいくつかあります。
具体的には、 ドン・シムの投稿 タイプのアイテムを含む差別された組合が説明している obj
また ->
オブジェクトは比較をサポートせず、関数も平等をサポートしないため、平等や比較の制約を自動的に取得しないでください。 (自動的に生成された平等/比較が以前にバギーだったかどうかは明らかではありませんが、コードが生成されなくなったのでコンパイルさえしません。)
問題のあるDUSの例をいくつか紹介します。
type PrecedenceParserOp<'a,'u'> =
| PrefixOp of string * Parser<unit,'u> * int * bool * ('a -> 'a)
| others ...
type ErrorMessage =
| ...
| OtherError of obj
| ...
問題は次のとおりです。
member t.RemoveOperator (op: PrecedenceParserOp<'a, 'u>) =
// some code ...
if top.OriginalOp <> op then false // requires equality constraint
// etc etc ...
または、比較制約の場合
let rec printMessages (pos: Pos) (msgs: ErrorMessage list) ind =
// other code ...
for msg in Set.ofList msgs do // iterate over ordered unique messages
// etc etc ...
私が言うことができる限り、各インスタンスに一意のINTでタグを付けるというドンのソリューションは、カスタムの平等/比較制約を実装する正しい方法です(または、DUの個々のブランチを順序付けることができるように、おそらく一意のINTタプルです)。しかし、これはDUのユーザーにとって不便です。現在、DUの構築には、次のスタンプを取得するために関数を呼び出す必要があります。
タグ獲得を隠し、同じコンストラクターをライブラリのユーザーに提示する方法はありますか?つまり、インターフェイスを変更せずに実装を変更することですか?これは(コードを理解していることから)見えるので特に重要です PrecedenceParserOp
パブリックタイプです。
解決
FPARSEC用にどのソースをダウンロードしましたか? FPARSECから最新のものをつかみました Bitbucketリポジトリ, 、そして、VS 2010 RCでコンパイルするためにFPARSECソースに変更を加える必要はありませんでした。
編集:私はそれを取り戻します。 InterplexyaccおよびInterpfparsecのサンプルプロジェクトからビルドエラーが発生しましたが、Core FPARSECおよびFPARSECCSプロジェクトは正常に構築されました。
他のヒント
できることの1つは、追加することです [<CustomEquality>]
と [<CustomComparison>]
独自の属性を定義します .Equals
オーバーライドと IComparable
実装。もちろん、これはあなたが obj
と _ -> _
コンポーネントは適切な方法で自分自身であり、それは可能であるかもしれません。何が渡されているのかを制御できる場合 OtherError
コンストラクター、あなたはこの作品を作ることができるはずです ErrorMessage
ダウンキャスティングで入力します obj
それ自体が構造的に同等のタイプに。しかし PrecendenceParserOp
ケースは少し難しいです - 比較する必要がない限り、関数コンポーネントに参照等式を使用することで取得できるかもしれません。