2011-10-25 130 views
15

正如別處指出多次(如:12,...)在Haskell腳本可以說是相當強大的。
快捷方式也可以是ghc expression evaluation mode。這是我真正發現自己越來越多地使用(我真的很喜歡這個功能的紅寶石)。
一個小例子任務:
「找出所有包含頭部和某個特定的版本之間的git diff文件的文件夾」表達評估模式的腳本

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

這看起來有點笨重,可能是因爲我真的不知道細節使用ghc -e
鑑於所有有趣的部分只是nub.map(fst.break('/'==).head.words).lines實際表達似乎有點羅嗦。

  • 如何告訴ghc我需要使用的模塊,因此我不需要使用全名來限定它們?
  • 我可以GHC拿起某種包含模塊,我經常使用的配置文件?

我真的很感激看到其他用例的一些例子,這將有助於我改進使用haskell這種小腳本的方式!

旁註:Commandline-foo嚮導可能會嘲笑這個,但我覺得使用haskell和bash腳本更舒服,所以這就是我想要使用的。

+0

字符串→字符串函數我找到'interact'要少有點麻煩:'GHC -e 「互動$ 字符串FUNC>」'。這通常以'ghc -e'交互$ unlines結束。map( String func>)。lines「'。 – Nefrubyr

+1

由於兩個混帳和Haskell的粉絲,誰是沒有太大的「命令行 - 富嚮導」中,一篇博客文章中,你列出一大堆你的git相關哈斯克爾腳本的肯定是我感興趣的! – MatrixFrog

+1

@MatrixFrog不限於Git的,但也許仍然吸引您:[腳本與GHCs評估模式(http://blog.coldflake.com/post/12412650749/scripting-with-ghcs-evaluation-mode) – oliver

回答

8

關於模塊:ghc -e使用您~/.ghci文件,所以在這種情況下,你要補充:m +Data.List它(import Data.List(nub)因爲GHC 7左右也支持)。

關於軟件包:您可以使用ghc-pkg hide somepackageghc-pkg expose somepackage來定義可見軟件包的默認設置(軟件包默認情況下會公開;也許我誤解了您的問題)。

您可能會發現eddie有用。

+0

良好的通話與.ghci文件!不知道'ghc -e'使用同一個文件。關於包裝: – oliver

+0

:不,隱藏和曝光不是我的意思。 – oliver

+1

關於eddie:看起來真的很好...甚至有一個cabal安裝選項。還沒有弄清楚如何將文本傳遞給它,但我會調查!順便說一句... FunctorSalad ...非常有創意的名字:) – oliver

5

與FunctorSalad一樣,ghc -e加載~/.ghci,因此您可以使用它來添加您可能在腳本中使用的任何樣板。從全局〜/ .ghci

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

+1:我想知道在這個問題中「((==)/)」應該是什麼意思。 – rampion

+0

不錯!這真的很有用!謝謝你的提示!允許更平滑的集成...... – oliver

+0

'((==)'/')'與'('/'==)'相同。 – augustss

5

除了每.ghci文件中的標準配置(除了你:你的情況,你可以添加

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

~/.ghci文件,然後運行可以在某些目錄中擁有專門的.ghci文件,然後在之前讀取它們),還可以將Haskell源文件作爲命令行參數ghc -e "expression" path/to/Source.hs傳遞。 expression將在module Source的背景下進行評估。

+0

很酷......不知道在當前目錄中有一個特殊的.ghci文件的選項。 – oliver