0

さまざまな任意のトラバーサルを実行しrecords、それらを分析してから、に変換したいと考えていますHashtbl。そして、それが何であれ、コードは自動的にそれを行いますrecord structure


たとえば、さまざまなレコード (レコードの種類が異なる場合があります) をハッシュテーブルに変換したいと考えています。

記録のために言う

{
   name = "john";
   age = 50;
}

コードを実行すると、このレコードは自動的に に変換されHashble、{"name", "john"} と {"age", "50"} という 2 つの {key, value} ペアが含まれます。ここで、コードが50int を検出できるようにしたいので、それをstring_of_intに変換するために使用することに注意してくださいstring

別のレコードが来たら、言う

{
   id = 12;
   type = "book"
   price = 34.5
}

私のコードは自動的にHashtbl- {"id", "12"}, {"type", "book"}, {"price", "34.5"} を生成します


どうやってやるの?コードを使用してレコード タイプを分析するにはどうすればよいですか?

4

3 に答える 3

3

できません。タイプセーフのため、OCaml にはイントロスペクション ライブラリがありません。

しかし、「ランタイムタイプ」に関する研究があります: http://www.lexifi.com/files/resources/runtime_types.pdfはそれを可能にします。

イントロスペクション機能の欠如は、OCaml コンパイラ チームの強い選択であることに注意してください。

于 2013-06-20T13:09:25.813 に答える
2

type_convまたは派生ツール/フレームワークを使用して、レコード型宣言を受け取り、予想される変換コードを (ハッシュテーブルに) 生成する構文拡張を実装できます。

別の方法として (はるかに単純なので、より良いアイデアです)、sexplib (s-expressions) などの既存の拡張機能を使用するか、JSON コンバーターを生成する拡張機能の 1 つを使用して、その表現 (s-expressions または JSON) からハッシュテーブルに変換します。

于 2013-06-20T13:23:58.907 に答える
1

他の人が言ったことを別の言い方をすれば、フィールドが実行時に決定されるレコードは OCaml レコードではありません。OCaml には静的な型、つまりプログラムを書くときに固定される型があります。OCaml で進める最善の方法は、データを辞書、つまり名前と値のペアの動的なセットとして再概念化することだと思います。辞書の OCaml 型は Hashtbl と Map です。これで、あなたの質問に答えるのは非常に簡単になりました(私には思えます)。

于 2013-06-20T14:33:08.507 に答える