F # тоже может сделать это с помощью Code Quotations .
Для этого вы должны убедиться, что система типов нижележащего языка напрямую учитывается / проверяется самой метапрограммой. С практической точки зрения, это почти заставляет метапрограммирование быть на основном языке ... так что я не удивлен, что вы можете сделать это в metaocaml.
Большинство из нас не имеет инструментов метапрограммирования, встроенных в базовый язык (C ++ является скорее исключением, и я отвергаю его и системы, основанные на отражении, как слишком слабые для выполнения произвольных преобразований).
Система, которая может выполнять произвольные преобразования (или метапрограммы, составленные из их наборов) в коде, - это DMS Software Reengineering Toolkit . DMS имеет внешние интерфейсы для многих реальных языков, строит структуры данных компилятора при синтаксическом анализе (включая AST). DMS предоставляет преобразования программы из исходного кода , которые представляют преобразования в виде перезаписи AST с использованием поверхностного синтаксиса целевого языка. Это в определенной степени соответствует вашим требованиям: если ваши правила преобразования синтаксически правильны (и они проверены DMS), то преобразованная программа будет синтаксически правильной. Это не соответствует вашим требованиям к правильности типов, поскольку механизмы проверки типов реализованы за пределами целевого языка. В принципе, можно было бы использовать средство проверки безопасности типов для расширения программных преобразований; на практике мы обнаружили, что можем достаточно надежно кодировать преобразования.
И даже если у вас есть типобезопасные преобразования, у вас нет гарантии семантической безопасности по отношению к вашей исходной программе. Так что вам все равно придется отлаживать метапрограммы.