gpt4 book ai didi

preprocessor - OCaml 中的注释

转载 作者:行者123 更新时间:2023-12-01 01:32:12 24 4
gpt4 key购买 nike

标题可能有点误导,所以让我解释一下我想要实现的目标。

我正在编写一种具有大量运算符的编程语言,这些运算符可以处理具有不同行为的多种类型。实现在不断发展,运营商正在改变/适应我在尝试时发现更有用的东西。

问题是如何保持语言文档、实现和语言的内联帮助(具有某种 REPL)之间的一致性。

由于大多数行为是在大模式匹配块内定义的,我想知道是否有可能以某种方式(可能使用 Camlp4)注释代码,以便预处理运行可以提取列出的 txt 文件(或任何类似的 csv、html 等)所有的运营商都实现了。

我的意思是,如果我有类似的东西

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 -> (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 *)

以某种方式我能够预处理我的源代码并构建一个所有已实现操作的列表及其类型和描述,只是从注释中获取。我不需要修改我的代码中的任何内容。这只是为了在一个地方保持一致性,而不必以单独的方式跟踪所有可用指令(因为我也需要为文档和内联帮助索引它们)。

我想在不使用任何外部处理工具的情况下做到这一点,这就是为什么我问是否有能够在编译阶段处理注释或类似的东西。

提前致谢

最佳答案

你看了吗ocamldoc ?

不过,通常更多的是 .mli 文件接收注释。在您的情况下,您介意在类型 instruction 的定义处编写文档吗? ?喜欢:

(** Comment for type weather  *)
type weather =
| Rain of int (** The comment for construtor Rain *)
| Sun (** The comment for constructor Sun *)

关于preprocessor - OCaml 中的注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4063039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com