Как я могу удалить ключевые слова if ... then ... else ... в Haskell (GHC)?
Я хотел бы удалить if ... then ... else ...
ключевые слова, потому что я встраиваю язык /DSL в Haskell. if
, then
а также else
передать много значения во многих областях, и было бы здорово, если бы я мог переопределить (или оставить их неопределенными) их, чтобы отразить природу языка / домена.
Я искал в Google и stackru, но ничего не нашел. (Я нашел старую ветку о том, почему if ... then ... else ...
был включен в качестве ключевых слов в Haskell.)
Моя IDE находится в Лексе, и, если ключевые слова могут быть удалены, было бы также неплохо иметь параметр для изменения if ... then ... else ...
ключевые слова вернуться к своему обычному шрифту / цвету / полужирному.
Я уже попробовал соглашение об именах if'
за if
и так далее. Это не так хорошо, особенно когда я хочу определить if
а также if'
и должны определить if'
а также if''
вместо или if1
а также if2
, Наличие обоих if'
а также if
также может сбивать с толку. (Путаница не является серьезной проблемой в моей ситуации, так как пользователи DSL - программисты на Haskell, но я полагаю, что это может помочь в других ситуациях).
Подводя итоги ответов на сегодняшний день:
- Использовать
RebindableSyntax
расширение до GHC. Не так широко, как удаление ключевых слов: синтаксис "если-то-еще" в Haskell сохраняется. (Фрерих Раабе) - Обходной путь: Используйте очень похожие слова / имена, используя
data Conditional b a = If b (Then a) (Else a)
(применимо только в некоторых контекстах). (CA Макканн)
Если RebindableSyntax
это относительно новая функция, поэтому вряд ли найдется более общий путь, по крайней мере, до следующей версии GHC.
3 ответа
Расширение RebindableSyntax для GHC позволяет вам перегружать if ... then ... else
выражения с вашей собственной версией. В частности, ifThenElse
Функция используется для определения альтернативных значений. if e1 then e2 else e3"
средства ifThenElse e1 e2 e3
,
См. Статью блога Rebindable if..then..else выражений для хорошего обсуждения этой функции, включая некоторые примеры.
Вы не можете удалить существующие ключевые слова. Как было указано, вы можете использовать RebindableSyntax, но это может не сработать так, как вы хотите.
Единственное, что приближается к удалению ключевых слов, это включить опцию CPP и сделать что-то вроде
#define if if_
#define then then_
#define else else_
Препроцессор затем расширится, если / then / else до if_/then_/else_.