2011-10-25 11 views
15

Come indicato più volte altrove (ad esempio 1, 2, ...) lo scripting in haskell può essere piuttosto potente.
Un modo rapido può anche essere il ghc expression evaluation mode. questo è quello che in realtà mi ritrovo ad usare sempre di più (mi piace molto questa caratteristica in ruby).
Un piccolo compito esempio:
"Ottieni tutte le cartelle che contenevano diff git tra la testa e una revisione specifica"Modalità di valutazione dell'espressione in haskell per lo scripting

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

Questo sembra un po 'goffo, probabilmente perché non mi conosco i dettagli di usare ghc -e.
Dato che tutta la parte interessante è solo la nub.map(fst.break('/'==).head.words).lines l'espressione attuale sembra un po 'prolisso.

  • Come si comunica ai moduli i moduli da utilizzare, quindi non è necessario qualificarli utilizzando il nome completo?
  • Posso fare ghc prelevare una specie di file di configurazione che contiene moduli che uso frequentemente?

Mi piacerebbe molto vedere alcuni esempi di altri casi che mi aiuteranno a migliorare il modo in cui utilizzo haskell per questo tipo di script!

Sidenote: I wizard della commandline-foo probabilmente rideranno di questo, ma mi sento molto più a mio agio nell'usare haskell e quindi bash scripting, quindi questo è quello che voglio usare.

+0

Per String → Funzioni per le stringhe trovo che 'interact' sia un po 'meno goffo:' ghc -e "interagisce $ func func>" '. Questo spesso finisce con il fatto che 'ghc -e 'interagisce con $ Unlines. Map ( func func>). Lines" '. – Nefrubyr

+1

Essendo un fan sia di Git che di Haskell, che non è un gran "mago del comando", un post sul blog in cui si elencano un po 'di script Haskell relativi a git mi interesserebbe sicuramente! – MatrixFrog

+1

@ MatrixFrog Non limitato a git ma forse ancora interessante per te: [Scripting con modalità di valutazione dei GHC] (http://blog.coldflake.com/post/12412650749/scripting-with-ghcs-valutazione-modifica) – oliver

risposta

8

Per quanto riguarda i moduli: ghc -e utilizza il file ~/.ghci, quindi in questo caso, ci si aggiunge :m +Data.List ad esso (import Data.List(nub) è anche supportato dal GHC 7 o giù di lì).

Per quanto riguarda i pacchetti: è possibile utilizzare ghc-pkg hide somepackage e ghc-pkg expose somepackage per definire il set predefinito di pacchetti visibili (i pacchetti vengono tuttavia visualizzati in modo predefinito, forse non capisco la domanda).

È possibile trovare utile eddie.

+0

buona chiamata con il file .ghci! Non sapevo che 'ghc -e' utilizza lo stesso file. – oliver

+0

per quanto riguarda i pacchetti: No, nascondersi ed esporre non era quello che intendevo. – oliver

+1

su eddie: sembra davvero bello ... ha anche un'opzione di installazione di cabala. Non ho ancora capito come collegare il testo ad esso, ma indagherò! a proposito ... FunctorSalad ... nome molto creativo :) – oliver

5

Come ha detto FunctorSalad, ghc -e carica lo ~/.ghci in modo da poterlo utilizzare per aggiungere qualsiasi testo che si possa usare nello script. Nel tuo caso si potrebbe aggiungere

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

a voi ~/.ghci di file e quindi eseguire:

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

+1: Mi chiedevo cosa avrebbe dovuto significare '((==) /)' nella domanda. – rampion

+0

bello! è davvero utile! grazie per il consiglio! consente un'integrazione molto più fluida ... – oliver

+0

'((==) '/')' è uguale a '('/' ==)'. – augustss

5

Oltre alla configurazione standard per il file .ghci (a parte il tuo globale ~/.ghci, è può avere file .ghci specializzati in alcune directory, che verranno letti prima), è anche possibile passare un file sorgente Haskell come argomento della riga di comando, ghc -e "expression" path/to/Source.hs. expression verrà quindi valutato nel contesto di module Source.

+0

cool ... non sapeva dell'opzione per avere un file .ghci speciale nella directory corrente. – oliver

Problemi correlati