2012-12-24 44 views
3

在安裝了GHC UNIX類系統,我可以用下面的內容如何將Haskell嵌入到批處理文件中(Windows的hash-bang runhaskell)?

#!/usr/bin/env runhaskell 
main = putStrLn "Hello, I am a UNIX script file." 

使文件的可執行創建一個文件,而這個執行給定的Haskell代碼。

如何在Windows .bat文件中執行相同操作?

最好沒有創建額外的文件,沒有設置環境變量,如果使用UNC路徑或包含空格的路徑訪問批處理文件,Haskell命名空間不會被污染,並且合理的行爲會導致Haskell代碼包含錯誤。

回答

10

經過多次試驗和錯誤,結果證明這是可能的。我設計了以下內容:

@(set /p =-- < nul & type "%~f0") | runhaskell & exit /b 
main = putStrLn "Hello, I am a Windows batch file." 

這個機制的唯一缺點是錯誤消息包含通過創建一個臨時文件(用的東西叫)runhaskell的名稱。

這裏是如何工作的完整說明:

  • set /p =-- < nul輸出--(和兩個不相干的空格)不能跟着一個換行符。這是這樣工作的:
    • set /p ANSWER=Please enter answer:打印Please enter answer:沒有換行符,等待用戶輸入,並將其放入環境變量ANSWER
    • < nul就好像用戶沒有輸入任何東西一樣。
    • 作爲一個(未公開的?)特殊情況,可以省略環境變量名稱,然後不設置環境變量。
  • "%~f0"是當前批處理文件的名稱。
  • 因此set /p =-- < nul & type "%~f0"輸出當前批處理文件,但第一行註釋掉(解釋爲Haskell代碼時)。
  • 我們將其編碼爲runhaskell,它(無法解釋?)將其stdin解釋爲非文字(!)Haskell代碼。
    • 就像問題中的UNIX版本一樣,這裏假設runhaskell位於當前的PATH
  • 最後,exit可以確保第一線後一切都沒有由Windows批處理文件解釋看出,和exit /b可以確保我們只退出這個腳本,沒有任何周邊cmd.exe殼。
  • 而領先的@確保在運行此腳本時所有這些亂碼不是echo

(我還沒有找到一種方法來爲文字Haskell代碼做同樣的事情;但是我目前沒有這種需要。)

4

你的路徑下只需創建

C:\my-tools-path>copy con --.bat 
runhaskell %1 
^Z 

要創建自動可執行程序的Haskell寫一些像

-- "%~f0" 
main = putStrLn "Merry Christmas!" 

沒有錯誤,沒有臨時文件,......

; )

(您可以添加您的程序參數

runhaskell %1 %2 ... 

-- "%~f0" %1 %2 ... 

+0

+1了很不錯的想法,但我會接受我自己的答案,因爲我希望有一個單一的文件解決方案,因此沒有額外的' - 。bat'文件。 –

相關問題