F # Тип Поставщики против Lisp макросов
Я читал о поставщиках типа F # 3.0 (например, здесь), и кажется, что они основаны на своего рода компиляции генерации кода. В этом отношении мне было интересно, как они сравниваются с макросами Lisp. Казалось бы, как поставщики типа F # 3.0, так и макросы Lisp позволяют выполнять код пользователя во время компиляции и вводить новые типы, доступные компилятору. Может ли кто-нибудь пролить свет на вопрос и связанные с ним нюансы?
Ответы
Ответ 1
Существует некоторое совпадение между поставщиками типов F # и метапрограммированием с других языков, но я согласен с Даниэлем, что у них мало общего. F # имеет некоторые другие методы метапрограммирования, такие как цитаты, которые, возможно, ближе к макросам LISP.
В частности:
-
LISP макросы обычно используются для преобразования выражений (вы можете взять выражение LISP и либо интерпретировать его, либо преобразовать, а затем выполнить). Обратите внимание, что преобразование принимает выражение LISP в качестве входа - с другой стороны, поставщики типов могут принимать только очень ограниченные параметры (строки, целые числа).
-
Котировки более похожи. Они могут использоваться для обработки выражения F # - вы можете обрабатывать фрагмент кода F # как данные и интерпретировать его или преобразовывать. Преобразование принимает (подмножество) выражения F #, но обычно не выполняет его.
-
Поставщики типов используются исключительно для генерации типов. Поскольку LISP является динамически типизированным, это не проблема, которая возникла бы в LISP. Однако это своего рода генерация кода (форма метапрограммирования, которую вы, безусловно, можете сделать в LISP).
Ответ 2
Интересным аспектом провайдеров типа F # является то, что они работают не только во время компиляции, но и во время разработки, то есть таким образом, что взаимодействуют с полным набором инструментов IDE. Поставщики типов предоставляют "типы" из внешнего схематизированного источника данных, но механизм реализации также позволяет множество инструментов IDE, включая IntelliSense (автозавершение идентификатора), документацию, подсказки данных и т.д. В сочетании с интерактивным REPL это дает возможность легко исследовать незнакомых наборов данных таким образом, который не совсем похож на опыт любого другого языка.
Ответ 3
F # Поставщики типов - это очень специфический случай генерации кода времени компиляции, то есть они предназначены для решения конкретной проблемы с помощью генерации временного кода компиляции. Они позволяют создавать новые типы во время компиляции.
LISP макросы являются более общим подходом к метапрограммированию и, следовательно, обслуживают множество случаев использования. Макрос в основном принимает ввод как S-выражение (код или данные) и испускает другое S-выражение.
Таким образом, поставщик типов может быть легко реализован с использованием макроса, тогда как вы не можете охватить весь диапазон "какие макросы могут делать" с поставщиками типов.
Ответ 4
Я не знаком с макросами Lisp, но макросы вообще используются для метапрограммирования (для сохранения ввода и добавления контрольных конструкций на язык). С другой стороны, поставщики типов генерируют строго типизированные API для внешних источников данных.
Я не могу думать ни о чем, кроме времени компиляции "расширения", которое они имеют вместе.