Подтвердить что ты не робот

Типизированные языки метапрограммирования

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

Насколько мне известно, только metaocaml может это сделать. (Нет, ни шаблоны шаблонов Haskell, ни С++ не соответствуют законопроекту - см. этот документ). Вопрос: что позволяют другие языки/системы?

EDIT: Насколько я могу судить, metaocaml мертв. Oleg пытался воскресить его, но это все еще застряло несколько версий за OCaml. Если вы хотите пойти с экспериментальными языками (т.е. Даже больше, чем метакамль, кажется, что Ur и, вполне возможно, Idris соответствует счету. Любые другие новые записи в поле?

4b9b3361

Ответ 2

Чтобы сделать это, вы должны убедиться, что система типов базового языка непосредственно удостоена/проверена самой метапрограммой. Как практический вопрос, это почти заставляет метапрограммирование находиться в базовом языке... поэтому я думаю, я не удивлен, что вы могли бы сделать это в метакомале.

Большинство из нас не получают инструменты метапрограммирования, встроенные в базовый язык (С++ скорее исключение, и я отвергаю его, а системы, основанные на отражении, слишком слабы, чтобы выполнять произвольные преобразования).

Система, которая может выполнять произвольные преобразования (или метапрограммы, составленные из этих наборов), представляет собой DMS Software Reengineering Toolkit. DMS имеет передние концы для многих реальных langauges, строит структуры данных компилятора при разборе (включая AST). DMS предоставляет преобразования исходных файлов в исходные тексты, которые представляют собой преобразования как AST-переписывающие, используя поверхностный синтаксис целевого языка. Это в определенной степени соответствует вашему требованию: если ваши правила преобразования являются синтаксически правильными (и они проверяются DMS), тогда преобразованная программа будет синтаксически правильной. Он не достигает вашего требования к правильности типа, поскольку механизмы проверки типов реализуются за пределами целевого языка. В принципе, можно было бы проверять тип проверки, чтобы увеличить программные преобразования; на практике мы обнаружили, что мы с успехом можем преобразовывать преобразования.

И даже если у вас есть безопасные преобразования типа, у вас нет гарантии семантической безопасности в отношении вашей оригинальной программы. Итак, вам все равно придется отлаживать метапрограммы.

Ответ 4

Метапрограммирование времени компиляции в Scala.

Our flavor of macros is reminiscent of Lisp macros, adapted to incorporate type safety and rich syntax. Unlike infamous C/C++ preprocessor macros, Scala macros: 1) are written in full-fledged Scala, 2) work with expression trees, not with raw strings, 3) cannot change syntax of Scala.