pagina online oficial compiler actualizar haskell ghc

haskell - online - GHC: insertar fecha de compilación



haskell platform windows download (2)

El preprocesador define de __DATE__ __TIME__ macros __DATE__ y __TIME__ (como en C), así que esto funciona:

{-# LANGUAGE CPP #-} main = putStrLn (__DATE__ ++ " " ++ __TIME__)

Probablemente esto sea más simple que la sugerencia de Michal de Template Haskell, pero no le permite elegir el formato de la fecha.

Pensé que ya habría una pregunta sobre esto, pero no puedo encontrar una.

Quiero que mi programa imprima la fecha en que fue compilado. ¿Cuál es la forma más fácil de configurar eso?

Puedo pensar en varias posibilidades, pero ninguna de ellas es lo que podríamos llamar "fácil". Idealmente, me gustaría poder hacer ghc --make Foo y que Foo imprima la fecha de compilación cada vez que lo ejecuto.

Varias posibilidades no fáciles que vienen a la mente:

  • Aprende Plantilla Haskell. Averigua cómo usar Data.Time para obtener la fecha de hoy. Encuentra una forma de cómo transformar eso en una cadena. (Ahora mi programa requiere TH para funcionar. También debo convencerlo de que vuelva a compilar ese módulo cada vez; de lo contrario, obtengo la fecha de compilación de ese módulo [que nunca cambia] en lugar de todo el programa).

  • Escriba un script de shell que genere un pequeño módulo de Haskell que contenga la fecha del sistema. (Ahora tengo que usar ese script de shell en lugar de compilar mi programa directamente. Además, ¡el shell script en Windows deja mucho que desear!)

  • Siéntese y escriba algo de código Haskell que genere un pequeño módulo Haskell que contenga la fecha. (Más portátil que la idea anterior, pero aún requiere pasos de compilación adicionales o la fecha de impresión será incorrecta).

  • Puede haber alguna forma de hacer esto a través de Cabal, pero, ¿realmente quiero empaquetar este pequeño programa solo para obtener una instalación para citas?

¿Alguien tiene alguna sugerencia más simple?


Usar Template Haskell para esto es relativamente simple. Sólo necesitas:

  1. Ejecuta la acción IO dentro de la mónada Haskell de la plantilla:

    runIO :: IO a -> Exp a

  2. Luego crea una cadena literal con:

    stringE :: String -> ExpQ

  3. Pon una expresión completa dentro de una quasiquote.

    $( ... )

Este programa imprimirá el tiempo de su compilación:

{-# LANGUAGE TemplateHaskell #-} import Language.Haskell.TH import Data.Time main = print $(stringE =<< runIO (show `fmap` Data.Time.getCurrentTime))

Puede colocar el fragmento relevante en un módulo que importe todos los demás módulos para asegurarse de que esté recompilado.

O tome la información de revisión actual de su sistema de versiones. Ver: TemplateHaskell y IO.