2011-10-25 18 views
15

Başka yerlerde görüldüğü gibi (örn. 1, 2, ...) komut dosyası yazma işlemi oldukça güçlü olabilir.
Hızlı bir şekilde ghc expression evaluation mode da olabilir. aslında kendimi daha çok kullanarak buluyorum (Ruby'de bu özelliği çok beğeniyorum).
Küçük bir örnek görevi: Gerçekten ayrıntıları bilmiyorum muhtemelen çünkü
Bu biraz aksak görünüyorScripting için haskell'de ifade değerlendirme modu

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

"HEAD ve belirli revizyon arasındaki git diffs bulunan tüm klasörleri bulun" ghc -e'un kullanımı.
Tüm ilginç bölümün sadece nub.map(fst.break('/'==).head.words).lines olduğu göz önüne alındığında, gerçek ifade biraz endişeli görünüyor.

  • Kullandığım modüller hakkında ghc'ye nasıl söylerim, bu nedenle tam adı kullanarak bunları nitelendirmem gerekmez.
  • Ghc'yi sık kullandığım modülleri içeren bir yapılandırma dosyasını alabilir miyim?

Bu tür küçük komut dosyaları için haskell kullanma şeklimizi geliştirmemde yardımcı olacak diğer kullanım kılavuzlarından bazı örnekleri görmekten memnuniyet duyuyoruz!

Sidenote: Commandline-foo sihirbazları muhtemelen bu konuya gülecek ama ben haskell'i kullanarak daha rahat hissediyorum, sonra bash komut dosyasını kullanıyorum. modüllerin İlişkin

+0

Dize için → String işlevleri “interact” öğesini biraz daha az rahatsız edici olarak buluyorum: ghc -e ”$ Dize func>" '. Bu sık sık "ghc -e" etkileşimi $ unlines olarak haritalanır ( String func>). – Nefrubyr

+1

"Komut satırı-foo sihirbazının" pek çoğunun olmadığı git ve Haskell'in hayranı olarak, git ile ilgili Haskell betiklerinin bir demetini listelediğiniz bir blog yazısı kesinlikle bana ilgi gösterecekti! – MatrixFrog

+1

@MatrixFrog Git ile sınırlı değil ama belki sizin için hala ilginç: [GHCs Değerlendirme Modu ile Komut Dosyası] (http://blog.coldflake.com/post/12412650749/scripting-with-ghcs-evaluation-mode) – oliver

cevap

8

: ghc -e sizin ~/.ghci dosyası kullanır, böylece bu durumda, buna :m +Data.List eklersiniz (import Data.List(nub) da böylece ghc 7 veya beri desteklenir).

Paketlerle ilgili olarak: Varsayılan görünür paket kümesini tanımlamak için ghc-pkg hide somepackage ve ghc-pkg expose somepackage'u kullanabilirsiniz (paketler varsayılan olarak görünür; ancak sorunuzu yanlış anlayabilirim).

eddie yararlı bulabilirsin.

+0

iyi çağrı ile .ghci dosyası! 'Ghc -e' aynı dosyayı kullandığını bilmiyordu. – oliver

+0

paketleri ile ilgili: Hayır, saklamak ve göstermek demek istediğim şey değildi. Eddie hakkında – oliver

+1

: gerçekten güzel görünüyor ... hatta bir cabal yükleme seçeneği var. Metni nasıl borulayacağımı anlayamadım ama araştıracağım! Bu arada ... FunctorSalad ... çok yaratıcı bir isim :) – oliver

5

FunctorSalad gibi, ghc -e, ~/.ghci yükler, böylece komut dosyanızda kullanabileceğiniz herhangi bir ek bilgi eklemek için kullanabilirsiniz. Durumda da size

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

~/.ghci dosyayı ekleyin ve sonra çalıştırabilir:

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

+1: Ben ((==) /) 'nin soruda ne anlama geldiğini merak ediyordum. – rampion

+0

güzel! Bu gerçekten yararlı! Bahşiş için teşekkürler! Daha düzgün bir entegrasyon sağlar ... – oliver

+0

((==) '/') ', '('/'==)' ile aynıdır. – augustss

5

Ayrıca .ghci dosya başına standart yapılandırmaya (ayrı global ~/.ghci gelen sen Bazı dizinlerde, daha sonra okunacak olan özel .ghci dosyaları olabilir), ayrıca bir Haskell kaynak dosyasını komut satırı argümanı olarak, ghc -e "expression" path/to/Source.hs da geçirebilirsiniz. expression daha sonra module Source kapsamında değerlendirilecektir.

+0

cool ... geçerli dizininizde özel bir .ghci dosyası bulunma seçeneğini bilmiyordu. – oliver