Ocaml 使用ppx时启用有关未使用/无效属性的警告

Ocaml 使用ppx时启用有关未使用/无效属性的警告,ocaml,ppx,Ocaml,Ppx,我正在尝试使用一些ppx扩展,我刚刚发现OCaml不会对未使用/无效的属性发出警告。例如,如果我写了以下内容: let[@blaa] () = () 即使使用了-w+A,OCaml也不会说明@blaa从未被使用过的事实,而且可能输入错误 当试图使用ppx重写器并错误输入给定属性(例如,@blaa而不是@bla)并且无法找到它时,这尤其令人沮丧。或者,当一个给定的ppx重写器从未启用过,并且所有属性都被默默忽略时 有没有办法在这种情况下启用警告 注意:我在4.03.0和4.04.0中都试过了,但

我正在尝试使用一些ppx扩展,我刚刚发现OCaml不会对未使用/无效的属性发出警告。例如,如果我写了以下内容:

let[@blaa] () = ()
即使使用了
-w+A
,OCaml也不会说明
@blaa
从未被使用过的事实,而且可能输入错误

当试图使用ppx重写器并错误输入给定属性(例如,
@blaa
而不是
@bla
)并且无法找到它时,这尤其令人沮丧。或者,当一个给定的ppx重写器从未启用过,并且所有属性都被默默忽略时

有没有办法在这种情况下启用警告


注意:我在4.03.0和4.04.0中都试过了,但在这两种情况下都没有得到任何警告。

一般来说,这是不可能的,因为属性只是添加到语法树元素中,然后对树进行多次处理,处理器可能会查找不同的属性,而忽略其他属性。处理器不需要报告他们已经处理了一个属性,或者他们没有找到期望的属性。属性语义非常通用,默认情况下,所有属性都是不必要的

但是,您可以在它们的基础上构建自己的语义。例如,从JaneStreet派生的
将施加一个限制,即预处理器应该存在:

# type t = Hello [@@deriving some];;
Cannot locate deriver some

我想写一个ppx来捕获任何属性并报告它们是不可行的?我可以认为任何剩余的属性在我的程序中都是不受欢迎的,并且把这样的PPX应用到我的链表中的最后一个转换器。是的,你可以编写一个预处理器,它会为每个未知属性发出警告(除了白名单)。