2011-08-09 16 views
15

Me gustaría eliminar las palabras clave if ... then ... else ..., porque estoy incrustando un lenguaje/DSL en Haskell. if, then y else transmiten mucho significado en muchos dominios, y sería genial si pudiera redefinirlos (o dejarlos sin definir) para reflejar la naturaleza del idioma/dominio.¿Cómo podría eliminar las palabras clave "if ... then ... else ..." en Haskell (GHC)?

He buscado en Google y stackoverflow, pero no he encontrado nada. (Lo que encontrar un viejo hilo sobre por qué if ... then ... else ... se incluyó como palabras clave en Haskell.)

Mi IDE está en Leksah, y, si las palabras clave se pueden quitar, también sería bueno tener un ajuste para cambiar el if ... then ... else ... las palabras clave vuelven a su fuente/color/desenfoque normal.


Ya he probado una convención de nomenclatura de if' para if y así sucesivamente. No siente tan bueno, especialmente cuando quiero definir if y if', y tienen que definir if' y if'' su lugar, o if1 y if2. La presencia de if' y if también puede ser confusa. (La confusión no es un problema tan grave en mi situación ya que los usuarios de DSL son programadores de Haskell, pero supongo que puede ayudar en otras situaciones).


Resumiendo las respuestas hasta la fecha:

  • utilizar la extensión RebindableSyntax a GHC. No es tan general como eliminar las palabras clave: se conserva la sintaxis de if-then-else de Haskell. (Frerich Raabe)
  • Solución: use palabras/nombres muy similares, usando data Conditional b a = If b (Then a) (Else a) (solo aplicable en algunos contextos). (C. A. McCann)

Si RebindableSyntax es una característica relativamente nueva, entonces es poco probable que encontrar una manera más general, al menos no hasta la próxima versión de GHC.

+0

¿Desea _remove_ palabras clave de un idioma para que el compilador pueda tratarlas como variables? – eternalmatt

+3

Si su DSL es lo suficientemente distinta del Haskell circundante y funciona construyendo algún tipo de estructura de datos que represente expresiones en el DSL, también podría usar un tipo de datos. por ejemplo, algo como 'datos Condicional b a = Si b (Entonces a) (Else a)'. –

+0

Debe recordar que no debe diseñar sus DSL para que el código parezca inglés, debe diseñarlos para que sea más fácil ver si el código no funciona. – Anonymous

Respuesta

29

La extensión RebindableSyntax de GHC le permite sobrecargar las expresiones if ... then ... else con su propia versión. En particular, la función ifThenElse se usa para definir significados alternativos. if e1 then e2 else e3" significa ifThenElse e1 e2 e3.

Consulte el artículo de blog Rebindable if..then..else expressions para obtener una buena explicación de esta característica, incluidos algunos ejemplos.

0

¿Qué tal:

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

Esto no tiene sentido, de verdad. Por supuesto, podemos implementar el mismo comportamiento que "si ... entonces ... más ..." con un nombre diferente, pero lo que realmente queremos es un comportamiento diferente con el mismo nombre. –

+0

@Daniel Wagner: suficiente. – user2023370

11

No se puede quitar las palabras clave existentes. Como se señaló, puede usar RebindableSyntax, pero puede que no haga lo que desea.

La única cosa que acercarse a la eliminación de palabras clave es activar la opción de CPP y hacer algo como

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

El preprocesador se expanda si/entonces/persona para if_/then_/else_.

+1

Hacer eso ingenuamente sería inseguro. Hacerlo correctamente implicaría escribir un analizador Haskell para refactorizar el código de Haskell ... –

+0

Definitivamente inseguro en general. – augustss

Cuestiones relacionadas