我的意思是這樣的:是否可以通過標準輸入將源代碼管理到GHC?
echo 'main = print 1' | ghc > executable
爲了這GHC回覆:ghc: no input files
我缺少的東西?這可能以某種方式嗎?
我的意思是這樣的:是否可以通過標準輸入將源代碼管理到GHC?
echo 'main = print 1' | ghc > executable
爲了這GHC回覆:ghc: no input files
我缺少的東西?這可能以某種方式嗎?
即使這是不可能的正常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的確如此。
我將此標記爲現在的解決方案,因爲這是實現我所需要的最簡潔的方法。如果有人發佈了一個在zsh之外工作的類似簡潔版本(例如,我已經嘗試過'ghc -o可執行文件$(echo「main = print 1」| mktemp --suffix = .hs)'但沒有成功)或者GHC實現支持在內部,那麼我會相應地改變我的答案。 – Wizek
ghc通常用作編譯器,並在文件上運行(ghc可以從結尾搜索和推斷類型等)並將輸出文件指定爲標誌。
你可以,但是,當然,使用
filename=$(mktemp --suffix=.hs)
echo "main = print 1" >> $filename
ghc -o executable $filename
至於我可以告訴大家,答案是否定的。我嘗試:
$ echo 'main = print 1' | ghc ghc: no input files
$ echo 'main = print 1' | ghc - ghc: unrecognised flag: -
$ echo 'main = print 1' | ghc /dev/stdin target ‘/dev/stdin’ is not a module name or a source file
$ 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()
文件來獲得它的大小,這在管道上失敗了。
簡單#4:'echo'main = print 1'| ghc -x hs/dev/stdin' – rampion
這適用於runghc,但不會創建可執行文件。 – melpomene
你究竟在做什麼?運行一段Haskell代碼,或者實際將其編譯爲獨立的二進制文件?取決於你之後的情況,可能比手動調用GHC二進制文件更簡單。 – MathematicalOrchid