我怎样才能删除“删除”;如果。。。然后。。。否则……”;Haskell中的关键词(GHC)?
如果。。。然后。。。else…关键字,因为我在Haskell中嵌入了一种语言/DSL<代码>如果,我怎样才能删除“删除”;如果。。。然后。。。否则……”;Haskell中的关键词(GHC)?,haskell,ghc,leksah,Haskell,Ghc,Leksah,如果。。。然后。。。else…关键字,因为我在Haskell中嵌入了一种语言/DSL如果,那么和其他在许多领域都传达了很多意义,如果我能重新定义(或不定义)它们以反映语言/领域的性质,那就太好了 我在谷歌和stackoverflow上搜索过,但什么也没找到。(我确实找到了一个关于Haskell中为什么if…then…else…被列为关键字的老帖子。) 我的IDE在Leksah中,如果关键字可以被删除,那么如果有一个设置来更改,如果。。。然后。。。否则…关键字将恢复为正常字体/颜色/未绑定 我已
那么
和其他
在许多领域都传达了很多意义,如果我能重新定义(或不定义)它们以反映语言/领域的性质,那就太好了
我在谷歌和stackoverflow上搜索过,但什么也没找到。(我确实找到了一个关于Haskell中为什么if…then…else…
被列为关键字的老帖子。)
我的IDE在Leksah中,如果关键字可以被删除,那么如果有一个设置来更改,如果。。。然后。。。否则…
关键字将恢复为正常字体/颜色/未绑定
我已经为
if
等尝试了if'
的命名约定。感觉不太好,尤其是当我想定义if
和if'
,而必须定义if'
和if'
,或者if1
和if2
时。同时出现if'
和if
也可能令人困惑。(在我的情况下,这种混淆并不是一个严重的问题,因为DSL的用户都是Haskell程序员,但我想它在其他情况下也会有所帮助)
总结迄今为止的答复:
- 使用GHC的
重新绑定语法扩展名。不像删除关键字那样通用:保留Haskell的if-then-else语法。(弗里希·拉贝)
- 解决方法:使用非常相似的单词/名称,方法是使用
(仅适用于某些上下文)。(C.A.麦肯)数据条件b a=If b(Then a)(Else a)
ifThenElse
函数用于定义替代含义<代码>如果e1,则e2 else e3“表示ifThenElse e1 e2 e3
有关此功能的详细讨论,请参阅博客文章,包括一些示例。如何:
cond True t _ = t
cond False _ f = f
您不能删除现有的关键字。正如前面指出的,您可以使用RebindableSyntax,但这可能不是您想要的 唯一接近删除关键字的方法是打开CPP选项,并执行以下操作
#define if if_
#define then then_
#define else else_
然后,预处理器将if/then/else扩展为if/then/else。是否确实要删除语言的关键字,以便编译器将其视为变量?如果您的DSL与周围的Haskell完全不同,并且通过构建某种数据结构来表示DSL中的表达式,您也可以使用一种数据类型。例如,类似于
data Conditional b a=If b(Then a)(Else a)
。你应该记住,你的DSL的设计不应该让代码看起来像英语,你应该让代码看起来像英语,你应该让代码很容易看出来是否工作。Antal:谢谢你的编辑。;camccann:好的建议。(看起来你已经重构了你的名字。);eternalmatt:我同意在删除关键字时会有一些缺点,必须加以适当考虑。然而,Haskell的if-then-else即使像sugar一样也不必要,但它们使用了素数短名称。这真的没有抓住要点。当然,我们可以实现与“if…then…else…”相同的行为。。。“使用不同的名称,但我们真正想要的是使用相同名称的不同行为。天真地这样做是不安全的。正确地这样做需要编写Haskell解析器来重构Haskell代码……总体上肯定是不安全的。