2015-07-10 35 views
10

我的意思是這樣的:是否可以通過標準輸入將源代碼管理到GHC?

echo 'main = print 1' | ghc > executable 

爲了這GHC回覆:ghc: no input files

我缺少的東西?這可能以某種方式嗎?

+2

這適用於runghc,但不會創建可執行文件。 – melpomene

+0

你究竟在做什麼?運行一段Haskell代碼,或者實際將其編譯爲獨立的二進制文件?取決於你之後的情況,可能比手動調用GHC二進制文件更簡單。 – MathematicalOrchid

回答

4

即使這是不可能的正常process substitution,zsh中提供了一個special kind of process substitution-like behavior,允許「文件」表現得像超過傳統工藝替代真正的文件確實(通過創建一個實際的臨時文件):

% ghc -o Main -x hs =(echo 'main = print 1') 
[1 of 1] Compiling Main    (/tmp/zshjlS99o, /tmp/zshjlS99o.o) 
Linking Main ... 
% ./Main 
1 
% 

-x hs選項告訴ghc的行爲就好像給出的文件名以.hs結尾。

總的來說,這本質上是一個手動創建和刪除臨時文件的捷徑。

我不確定是否有其他的shell支持這種事情。至少,我不認爲bash的確如此。

+0

我將此標記爲現在的解決方案,因爲這是實現我所需要的最簡潔的方法。如果有人發佈了一個在zsh之外工作的類似簡潔版本(例如,我已經嘗試過'ghc -o可執行文件$(echo「main = print 1」| mktemp --suffix = .hs)'但沒有成功)或者GHC實現支持在內部,那麼我會相應地改變我的答案。 – Wizek

2

ghc通常用作編譯器,並在文件上運行(ghc可以從結尾搜索和推斷類型等)並將輸出文件指定爲標誌。

你可以,但是,當然,使用

filename=$(mktemp --suffix=.hs) 
echo "main = print 1" >> $filename 
ghc -o executable $filename 
6

至於我可以告訴大家,答案是否定的。我嘗試:

  1. $ echo 'main = print 1' | ghc ghc: no input files

  2. $ echo 'main = print 1' | ghc - ghc: unrecognised flag: -

  3. $ echo 'main = print 1' | ghc /dev/stdin target ‘/dev/stdin’ is not a module name or a source file

  4. $ ln -s /dev/stdin stdin.hs; echo 'main = print 1' | ghc stdin.hs stdin.hs: hFileSize: inappropriate type (not a regular file)

的問題:光耀使用後綴如.hs,.lhs.o決定如何處理文件(這是#3失敗的原因)。即使你繞過那個(#4),ghc真的想要stat()文件來獲得它的大小,這在管道上失敗了。

+0

簡單#4:'echo'main = print 1'| ghc -x hs/dev/stdin' – rampion

相關問題