Что необходимо с точки зрения языковой реализации для реализации поставщиков типов, как в F # 3.0? - PullRequest
8 голосов
/ 15 сентября 2011

F # 3.0 добавляет поставщиков типа , что делает ненужным ручное написание или генерацию отображений между БД (или другим поставщиком данных) и системой язык / тип, поскольку язык может запрашивать структурную информацию сама база данных напрямую с провайдерами типов.

Что необходимо с точки зрения языковой реализации, чтобы добавить такую ​​функцию в язык?

Требуется ли полностью подключаемая система типов? Или это больше похоже на какой-то генератор скрытого кода, встроенный в компилятор?

Что необходимо для реализации нового поставщика типов для F #?

Ответы [ 4 ]

14 голосов
/ 15 сентября 2011

Технически, вы можете думать о провайдерах типа F # как о «плагинах» для компилятора.Вместо генерации отображений компилятор спрашивает поставщика типов: «Какие типы вы знаете?»или "Ты знаешь этот тип?"(в зависимости от контекста).

Плагин (поставщик типов) отвечает и указывает, как выглядит тип (абстрактно, без фактического его создания).Затем компилятор работает с этой информацией, а затем просит поставщика типов предоставить код, который следует использовать при компиляции кода, использующего эти «поддельные» типы.Также возможно генерировать код (некоторые примеры делают это, потому что они просто используют инструменты, которые уже есть).

Так что да, вы можете реализовать свой собственный поставщик типов.Я сказал кое-что об этом в GOTO Копенгагенской лекции , которая была записана , и Дон Сайм сказал несколько вещей в его предыдущих выступлениях (я еще не видел его выступление BUILD).

3 голосов
/ 15 сентября 2011

Документы API показывают, что «интерфейс провайдера типов» удивительно мал, см. ITypeProvider и IProvidedNamespace , а также все пространство имен API Ответ Томаса дает обзор, а документы API показывают конкретные интерфейсы.

1 голос
/ 14 октября 2011

Просмотр документов MSDN для ITypeProvider и IProvidedNamespace Я не вижу документацию по фактическим методам, которые вы бы использовали для определения типов, ProvidedTypeDefinition (x, y, z) и ProvidedPropertyDefinition (x, y, z)

возможно, именно это http://fsharp3sample.codeplex.com/SourceControl/changeset/view/8670#195262

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

1 голос
/ 15 сентября 2011

Поскольку эта страница существует, это, вероятно, будет возможно.Но вы ссылаетесь на вещи, которые в настоящее время находятся в бета-версии, поэтому все может измениться.

Поскольку я понимаю доступную документацию, выведенные типы будут строго типизированы, поэтому я предполагаю, что это скорее компилятор, чем языквещь (кроме, возможно, некоторого синтаксиса).

...