タイトルはやや誤解を招く可能性があるので、私が達成しようとしていることを説明させてください.
私は、動作が異なる複数の型で機能する多数の演算子を持つプログラミング言語を書いています。実装は進化しており、オペレーターは試行中に私がより便利だと思うものに変更/適応しています。
問題は、言語のドキュメント、実装、および言語のインライン ヘルプ (一種の REPL があります) の間で一貫性を維持する方法です。
ほとんどの動作は大きなパターン マッチ ブロック内で定義されているため、前処理の実行で txt ファイル (または同様の csv、html など) を抽出できるように、何らかの方法で (おそらく Camlp4 を使用して) コードに注釈を付けることができるかどうか疑問に思っていました。すべての演算子が実装されています。
つまり、次のようなものがある場合
match instruction with
Plus -> ...
| Minus -> ...
次のようなものが欲しい
match instruction with
(* Plus, +, int -> int -> int, computes the sum *)
Plus -> ...
(* Minus, -, int -> int -> int, computes the difference *)
| Minus -> ...
コメント内の情報 (何かを使用するためだけにコメント構文を使用しました。実際に OCaml プリプロセッサを使用したことがないため、どのように機能するかはまだわかりません) は、プロジェクトをコンパイルするときに抽出され、どこかに保存されます。
おそらく、求めていることは不可能であり、ソースを ocaml プリプロセッサ/コンパイラ自体とは異なるもので個別に処理する必要があります。
手がかりはありますか?
編集:私がやりたいことを示すために具体的な例を挙げます...
たとえば、 plus 命令は、私の言語で書かれたプログラムを次のようにコンパイルします。
| Plus -> (fun s ->
let o2 = vm_pop s and o1 = vm_pop s in
(match o1, o2 with
Float f1, Float f2 -> vm_push s (Float (f1 +. f2))
| Float f, Int i -> vm_push s (Float (f +. float i))
| Int i, Float f -> vm_push s (Float (float i +. f))
| Int i1, Int i2 -> vm_push s (Int (i1 + i2))
| Complex c1, Complex c2 -> vm_push s (Complex (Complex.add c1 c2))
| String str, v -> vm_push s (String (Printf.sprintf "%s%s" str (string_value_short v)))
| List l, a -> l := a :: !l; vm_push s (Types.I.List l)
| (Set c as set), a -> c := Types.ValueSet.add a !c; vm_push s set;
| w, w2 -> throw_exc2 "+" w w2
); s
)
このパターンマッチのすべての句に次のような注釈を付けたいと思います
(* Plus, +, float -> float -> float, sum, computes the sum between two floats *)
(* Plus, +, string -> any -> string, append, appends the string representation of the value *)
(* etc *)
ソースコードを前処理し、実装されたすべての操作の種類と説明を注釈から取得したリストのようなものを作成できるようにします。コードを変更する必要はありません。利用可能なすべての指示を別々の方法で追跡する必要なく、一貫性を維持するためだけです (ドキュメントとインライン ヘルプのためにそれらをインデックス化する必要があるため)。
外部の処理ツールを使わずにやりたいので、コンパイル段階でコメントなどを処理できるものがないか聞いてみました。
前もって感謝します