2011-10-25 13 views
15

Como se menciona varias veces en otros lugares (por ejemplo, 1, 2, ...) el scripting en haskell puede ser bastante poderoso.
Una forma rápida también puede ser ghc expression evaluation mode. esto es lo que realmente me encuentro usando más y más (realmente me gusta esta característica en ruby).
Una pequeña tarea ejemplo:
"encuentra todas las carpetas que contenían diffs git entre la cabeza y una revisión específica"Modo de evaluación de expresiones en haskell para scripting

git diff --stat 9e2b68 | ghc -e \ 
    "getContents >>= return.(Data.List.nub).map(fst.break('/'==).head.words).lines" 

Esto parece un poco torpe, probablemente porque no se sabe muy bien los detalles de usar ghc -e.
Dado que toda la parte interesante es solo la nub.map(fst.break('/'==).head.words).lines, la expresión real parece un poco prolija.

  • ¿Cómo le digo a ghc sobre los módulos que necesito usar para no tener que calificarlos usando el nombre completo?
  • ¿Puedo hacer que ghc recoja algún tipo de archivo de configuración que contenga módulos que utilizo con frecuencia?

¡Realmente apreciaría ver algunos ejemplos de otros usos que me ayudarán a mejorar la forma en que uso haskell para ese tipo de pequeños guiones!

Nota: Los asistentes de Commandline-foo probablemente se reirán de esto, pero me siento mucho más cómodo utilizando haskell y bash scripting, así que esto es lo que quiero usar.

+0

Para cadenas → Funciones de cadenas Encuentro 'interact' para ser un poco menos torpe:' ghc -e "interactuar $ String func>" '. Con frecuencia, esto termina como 'ghc -e" interact $ unlines. Map ( String func>). Lines "'. – Nefrubyr

+1

Como fan de ambos git y Haskell, que no es mucho un "asistente de línea de comandos", ¡una publicación de blog en la que enumeraría un montón de sus guiones de Haskell relacionados con git definitivamente me interesaría! – MatrixFrog

+1

@MatrixFrog No se limita a git, pero tal vez aún te resulte interesante: [Creación de scripts con el modo de evaluación de GHC] (http://blog.coldflake.com/post/12412650749/scripting-with-ghcs-evaluation-mode) – oliver

Respuesta

8

En cuanto a los módulos: ghc -e utiliza el archivo de ~/.ghci, por lo que en este caso, deberá añadir :m +Data.List a ella (import Data.List(nub) también es soportado desde GHC 7 o algo así).

En relación con los paquetes: Puede usar ghc-pkg hide somepackage y ghc-pkg expose somepackage para definir el conjunto predeterminado de paquetes visibles (aunque los paquetes están expuestos de manera predeterminada, puede que malinterprete su pregunta).

Puede que encuentre eddie útil.

+0

buena llamada con el archivo .ghci! No sabía que 'ghc -e' usa el mismo archivo. – oliver

+0

con respecto a los paquetes: No, ocultar y exponer no era lo que quise decir. – oliver

+1

sobre eddie: se ve muy bien ... incluso tiene una opción de instalación cabal. ¡Todavía no me he dado cuenta de cómo pasarle texto, pero lo investigaré! por cierto ... FunctorSalad ... nombre muy creativo :) – oliver

5

Como FunctorSalad dijo, ghc -e carga el ~/.ghci para que pueda usarlo para agregar cualquier repetitivo que pueda usar en su secuencia de comandos. En su caso se podría añadir

let script f = getContents >>= return f 
import Data.List 

a que ~/.ghci archivo y vuelva a ejecutar:

git diff ... | ghc -e "script.nub.map(fst.break(=='/').head.words).lines" 
+0

+1: Me preguntaba qué se suponía que '((==) /)' significaba en la pregunta. – rampion

+0

¡agradable! ¡eso es realmente útil! ¡gracias por el consejo! permite una integración mucho más suave ... – oliver

+0

'((==) '/')' es lo mismo que '('/' ==)'. – augustss

5

Además de la configuración estándar por el archivo .ghci (aparte de su ~/.ghci global, puede tener archivos .ghci especializados en algunos directorios, que luego se leerán antes), también puede pasar un archivo fuente Haskell como argumento de línea de comando, ghc -e "expression" path/to/Source.hs. expression se evaluará en el contexto de module Source.

+0

genial ... no sabía acerca de la opción de tener un archivo .ghci especial en su directorio actual. – oliver

Cuestiones relacionadas