我有几个Haskell扩展的想法,可以通过将扩展语言翻译成普通语言来实现(扩展将提供一些编译指示和关键字)。 实施它们的更好方法是什么?它应该建立在GHC之上。
其中一个想法是为“功能类”添加关键字,这些类将由函数自动定义。 例如,使用这个假设的扩展,标准的Num类可以这样定义:
class (funclass(+) a,funclass(-) a, ...) => Num a
答案 0 :(得分:3)
正如我所看到的,有三种方法可以做到这一点:
实现一个预处理器,它读取扩展的Haskell源代码,将其转换为普通的Haskell,并将其保存回磁盘。然后,您可以正常编译已翻译的Haskell代码。
使用Template Haskell实现一些代码,为您完成翻译。 (特别是,某种准引物可能是合适的。)
修改GHC本身。 (这显然需要重新编译GHC,然后检查你没有意外破坏任何现有功能。)我建议这可能是一项很多工作。
我要提到你可以写一个GHC插件 - 但是, no 这样的插件允许你定义新的语法。 (虽然他们做允许您定义新的编译器编译指示,然后将其转换为普通的Haskell。)如果您可以使用此方法,则意味着您可以避免重新编译GHC。你只需要编写一个小的,自包含的插件。但是模板Haskell可能更容易完成这项工作。
至于你提议的扩展是否是一个好主意......我不认为它是,但你当然欢迎尝试使用它。
答案 1 :(得分:1)
我有几个Haskell扩展的想法,可以通过将扩展语言翻译成普通语言来实现。
SugarHaskell就是为此而构建的。它是可扩展语言的SugarJ项目的一部分。另请参阅Haskell symposium paper和package on Hackage。
关于SugarHaskell的潜在强点:它附带了一个可扩展的语法,支持布局约束的模块化规范,因此您可以轻松定义行为类似于符号的语法。它附带了一个知道语法扩展的Eclipse插件,因此您可以获得可扩展的语法突出显示。 Eclipse插件的其他功能也是可扩展的(代码完成,错误报告,大纲视图......)。
关于SugarHaskell的潜在弱点:它是用Java(胶水代码和Eclipse插件),SDF(语法)和Stratego(desugarings)实现的。 hackage包主要包含一堆Java代码。这不一定是一个弱点,但也许您更愿意使用Haskell来指定您的desugarings而不是Stratego。 Eclipse之外的其他编辑器没有集成。 Eclipse插件很好地可扩展,但是对Haskell的基本支持很弱,所以它目前还不适用于大型Haskell项目。
鉴于潜在的弱点,SugarHaskell目前不适合生产使用,但它可能对语言扩展的实验和原型设计很有用。