Как я могу удалить ключевые слова if ... then ... else ... в Haskell (GHC)? - PullRequest
16 голосов
/ 09 августа 2011

Я хотел бы удалить ключевые слова if ... then ... else ..., потому что я встраиваю язык / DSL в Haskell.if, then и else передают большое значение во многих областях, и было бы здорово, если бы я мог переопределить (или оставить их неопределенными) их, чтобы отразить природу языка / домена.

Я искал в Google и stackoverflow, но ничего не нашел.(Я нашел старую ветку о том, почему if ... then ... else ... был включен в качестве ключевых слов в Haskell.)

Моя IDE находится в Лекса, и, если ключевые слова можно удалить, было бы неплохо иметь настройкуизменить ключевые слова if ... then ... else ... на их обычный шрифт / цвет / полужирный.


Я уже попробовал соглашение об именах if' для if и так далее.Это не кажется хорошим, особенно когда я хочу определить if и if', и вместо этого приходится определять if' и if'' или if1 и if2.Наличие как if', так и if также может сбивать с толку.(Путаница не является серьезной проблемой в моей ситуации, поскольку пользователи DSL являются программистами на Haskell, но я полагаю, что это может помочь и в других ситуациях).


Подведение итогов ответов на сегодняшний день:

  • Используйте расширение RebindableSyntax для GHC.Не так широко, как удаление ключевых слов: синтаксис «если-то-еще» в Haskell сохраняется.(Frerich Raabe)
  • Обходной путь: Используйте очень похожие слова / имена, используя data Conditional b a = If b (Then a) (Else a) (применимо только в некоторых контекстах).(CA McCann)

Если RebindableSyntax является относительно новой функцией, то вряд ли найдется более общий путь, по крайней мере, до следующей версии GHC.

Ответы [ 3 ]

30 голосов
/ 09 августа 2011

Расширение RebindableSyntax для GHC позволяет вам перегружать if ... then ... else выражения своей версией.В частности, функция ifThenElse используется для определения альтернативных значений.if e1 then e2 else e3" означает ifThenElse e1 e2 e3.

См. Статью блога Повторно привязать if..then..ell выражения для хорошего обсуждения этой функции, включая некоторые примеры.

11 голосов
/ 09 августа 2011

Вы не можете удалить существующие ключевые слова.Как было указано, вы можете использовать RebindableSyntax, но это может не сработать так, как вы хотите.

Единственное, что близко подходит к удалению ключевых слов, - это включить опцию CPP и сделать что-то вроде

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

Затем препроцессор расширится, если / затем / еще, до if_ / then_ / else _.

0 голосов
/ 09 августа 2011

Как насчет:

cond True  t _ = t
cond False _ f = f
...