camlp5 IFNDEF STRICT делает противоположное тому, что я ожидаю

HOL Light имеет некоторую замкнутую логику camlp5 для изменения синтаксиса ocaml. Я исправил его для работы под ocaml 4.04 и 6.17, но он работает только в строгом режиме camlp5. Я проследил проблему до следующего кода:

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 определяется, и первый, если STRICT не определено. Я проверил с camlp5r pa_macro.cmo -defined тот STRICT определяется на моей машине со строгим режимом camlp5 и не определен на моей машине с переходным режимом camlp5.

К сожалению, вторая ветка берется на обеих машинах, как будто STRICT был определен на обоих. изменения IFNDEF STRICT THEN в IFNDEF BLAH THEN переключается на первую ветку, опять как будто STRICT был определен на обоих. Тем не менее, положить UNDEF STRICT; непосредственно перед тем, как код не имеет никакого эффекта.

Я в растерянности и буду рад любым предложениям о том, что может происходить, или экспериментам, которые будут проведены дальше.

1 ответ

Загадка разгадана: один из импортированных этим файлом модулей явно включает строгий режим. UNDEF не имел никакого эффекта, потому что STRICT по-видимому, специально обработанный встроенный.

Другие вопросы по тегам