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
по-видимому, специально обработанный встроенный.