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