2011-08-09 3 views
15

Haskellに言語/ DSLを埋め込んでいるため、if ... then ... else ...のキーワードを削除したいと考えています。 if,thenおよびelseは、多くのドメインで多くの意味を伝えています。言語/ドメインの性質を反映するために再定義する(または定義しない)のが良いと思います。Haskell(GHC)の "if ... then ... else ..."キーワードを削除するにはどうすればいいですか?

Googleとstackoverflowで検索しましたが、何も見つかりませんでした。 (私が古いスレッドを見つけたのは、if ... then ... else ...がHaskellのキーワードに含まれていた理由です)

My IDEはLeksahにあり、キーワードを削除できれば、if ... then ... else ...キーワードを通常のフォント/カラー/アンボールドに戻します。


私はすでにそうにifためif'の命名規則を試してみましたが、しました。 は特にifif'を定義し、if'if''を代わりに定義する必要がある場合や、if1if2と定義したい場合は、とよく似ていません。 if'ifの両方の存在も混乱する可能性があります。 (混乱は、DSLのユーザーがHaskellのプログラマーであるため、私の状況ではそれほど深刻な問題ではないが、他の状況では助けになると思う)。これまでの回答をまとめる


  • はGHCへRebindableSyntax拡張子を使用してください。キーワードを削除するほど一般的ではありません:Haskellのif-then-elseの構文はそのままです。 (Frerich Raabe)
  • 回避方法:data Conditional b a = If b (Then a) (Else a)(一部のコンテキストでのみ適用可能)を使用して、非常によく似た単語/名前を使用してください。 (C. A. McCann)

RebindableSyntaxが比較的新しい機能であれば、少なくとも次のバージョンのGHCまでは、もっと一般的な方法を見つけることはまずありません。

+0

実際には、コンパイラがそれらを変数として扱うことができるように、キーワードの_remove_をしたいですか? – eternalmatt

+3

あなたのDSLが周囲のHaskellとは十分に異なっていて、DSLに式を表す何らかの種類のデータ構造を作っている場合は、データ型を使うこともできます。たとえば、 '条件付きデータb a = bならば(a)(Else a)'のようなものである。 –

+0

英語のようなコードを作成するようにDSLを設計すべきではないことを覚えておく必要があります。コードが機能しないかどうかを簡単に確認できるように設計する必要があります。 – Anonymous

答えて

29

RebindableSyntax GHCを拡張すると、独自のバージョンでif ... then ... elseの式をオーバーロードできます。特に、ifThenElse関数は、別の意味を定義するために使用されます。 if e1 then e2 else e3"ifThenElse e1 e2 e3を意味します。

いくつかの例を含めて、この機能の良い説明については、ブログの記事Rebindable if..then..else expressionsをご覧ください。

0

についてどのように:

cond True t _ = t 
cond False _ f = f 
+1

これは本当にポイントがありません。もちろん、別の名前で "if ... then ... else ..."と同じ動作を実装できますが、実際には同じ名前の別の動作が必要です。 –

+0

@ダニエルワグナー:十分な公正。 – user2023370

11

既存のキーワードを削除することはできません。あなたが指摘したように、RebindableSyntaxを使うことができますが、それはあなたが望むことをしないかもしれません。

削除キーワードに近づい唯一のことは、その後のif/then /他にIF_/then_/else_拡大するCPPオプションをオンにして

#define if if_ 
#define then then_ 
#define else else_ 

プリプロセッサのような何かをすることです。

+1

これをnaiveにすると、安全ではありません。それを正しく行うには、HaskellパーサをリファクタリングしてHaskellのコードに書くことが必要になるでしょう... –

+0

一般的には絶対に安全ではありません。 – augustss

関連する問題