0

HOL Light 有一些复杂的 camlp5 逻辑来改变 ocaml 的语法。我已经对其进行了修补,使其可以在 ocaml 4.04 和 6.17 下工作,但它只能在 camlp5 strict mode 下工作。我已将问题追溯到以下代码

value vala_map f =
  IFNDEF STRICT THEN
    fun x -> f x
  ELSE
    fun
    [ Ploc.VaAnt s -> Ploc.VaAnt s
    | Ploc.VaVal x -> Ploc.VaVal (f x) ]
  END
;

据我所知,如果已定义,这应该执行第二个宏分支STRICT,而第一个 ifSTRICT未定义。我已经检查了camlp5r pa_macro.cmo -definedSTRICT是在我的机器上使用camlp5 严格模式定义的,而在我的机器上使用camlp5 过渡模式定义的。

不幸的是,第二个分支在两台机器上都进行了,就好像在两台机器STRICT上都定义了一样。更改IFNDEF STRICT THENIFNDEF BLAH THEN切换到第一个分支,就像在两个分支STRICT上都定义了一样。UNDEF STRICT;但是,在代码之前放置一个没有效果。

我很茫然,并且会喜欢任何关于可能发生的事情的建议,或者接下来要运行的实验。

4

1 回答 1

0

谜团解开了:该文件导入的模块之一显式打开了严格模式。UNDEF没有效果,因为显然STRICT是一个经过特殊处理的内置函数。

于 2016-12-12T20:07:04.063 回答