2016-09-20 2 views
0

Существует ли система типов, которая расширяет макросы и дает вам ошибки типа сгенерированного кода, который в конечном итоге будет выполнен?Ошибки времени компиляции для сгенерированного кода?

Практический пример может генерировать некоторый SQL динамически, но получать синтаксические ошибки от компилятора на основе некоторых ограничений (перед выполнением кода).

Другим примером может быть генерация функции с n вложенными циклами для генерации n комбинаций.

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

+1

Я не уверен, что это то, что вы хотите, но посмотрели ли вы на поставщиков F #? – TeaDrivenDev

+0

Мне неинтересно говорить с SQL. Я заинтересован в получении обратной связи с компилятором при написании кода, который генерирует код. –

+1

Примером может быть запись транспилятора в javascript, вы будете генерировать JS, и было бы неплохо получить компилятор обратной связи на вашем языке, если ваша функция будет генерировать неверный код при исполнении. –

ответ

2

Ближайшая вещь к тому, что вы наметили, приходит на ум typed tagless final approach. Хотя это не строго говоря, макрофункция, но она очень похожа на макроразложение (и во многих отношениях я бы лучше спорила). Что для вас важно, так это выражения, предназначенные для расширения/преобразования, строго типизированы по строительству - целевые типы выражений непосредственно представлены как типы метаязыков и проверяются компилятором.

Этот подход предполагает, что у вас есть достаточно выразительная система типов в метаязыке, который охватывает типы вашего целевого языка. В качестве has been demonstrated вы можете покрыть большое подмножество SQL таким образом (фактически вложенное реляционное исчисление, оно напрямую преобразуется в SQL и, как и все приложения конечного безболезненного подхода, строго типизировано по построению.)

Если вы проверите приведенные выше ссылки вы найдете множество примеров в ML, поэтому для этой цели вам не нужно будет использовать F #.