2016-09-20 55 views
0

是否有一個類型系統擴展宏,並給你生成的代碼,最終將被執行的類型錯誤?爲生成的代碼編譯時間錯誤?

一個實際的例子可能是動態生成一些SQL,但會根據一些約束(執行代碼之前)從編譯器接收語法錯誤。

另一個例子可能是用n個嵌套for循環來生成一個函數來生成n個組合。

經常生成源代碼是因爲它會被「字符串類型」而不贊同,所以我想知道是否有一個類型系統可以使用約束在編寫生成代碼的代碼時提供有價值的反饋。

+1

我不確定這是你想要的,但你看過F#類型的提供者嗎? – TeaDrivenDev

+0

我對與SQL交談不是特別感興趣。我有興趣在編寫生成代碼的代碼時獲得編譯器反饋。 –

+1

一個例子可能是將編譯器編寫爲javascript,您將生成JS,如果您的函數在執行時將生成無效代碼,那麼使用給定語言編譯器反饋會很好。 –

回答

2

與您想到的輪廓最接近的是typed tagless final approach。雖然它不是嚴格意義上的宏觀特徵,但它的表現與宏觀擴展非常相似(我會在很多方面進行更好的討論)。與您相關的是擴展/轉換的目標表達式,由施工 - 目標表達式類型直接呈現爲元語言類型並由編譯器檢查。

該方法假定您的元語言中包含足夠表現力的類型系統,其中涵蓋了目標語言的類型。作爲has been demonstrated,你可以用這種方式覆蓋SQL的大部分子集(實際上是嵌套關係演算,它直接轉換爲SQL,並且與最終無標記方法的所有應用程序一樣,通過構建強制類型化。)

如果您檢查以上參考你會在ML中找到大量的例子,所以你應該沒有使用F#來達到這個目的。