4

GHCがインストールされているUNIXライクなシステムでは、次の内容のファイルを作成できます。

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

ファイルを実行可能にすると、指定されたHaskellコードが実行されます。

Windowsの.batファイルで同等の処理を行うにはどうすればよいですか?

できれば、余分なファイルは作成されず、環境変数は設定されません。バッチファイルがUNCパスまたはスペースを含むパスを使用してアクセスされ、Haskell名前空間が汚染されていない場合にも機能し、Haskellコードに次のものが含まれている場合は適切な動作が得られます。エラー。

4

2 に答える 2

10

多くの試行錯誤の結果、これは可能であることが判明しました。私は以下を設計しました:

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

このメカニズムの唯一の欠点は、エラーメッセージに(によって呼び出された)によって作成された一時ファイルの名前が含まれていることですrunhaskell

これがどのように機能するかの完全な説明は次のとおりです。

  • set /p =-- < nul--改行が続かない出力(および2つの無関係なスペース)。これは次のように機能します。
    • set /p ANSWER=Please enter answer:改行なしで出力Please enter answer:し、ユーザー入力を待ち、それを環境変数に入れますANSWER
    • < nulユーザーが何も入力しなかったかのように動作します。
    • (文書化されていない?)特殊なケースとして、環境変数名を省略して、環境変数を設定することはできません。
  • "%~f0"現在のバッチファイルの名前です。
  • したがってset /p =-- < nul & type "%~f0"、現在のバッチファイルを出力しますが、最初の行はコメントアウトされています(Haskellコードとして解釈される場合)。
  • これをrunhaskellにパイプします。これは(文書化されていない?)そのstdinを非文字(!)Haskellコードとして解釈します。
    • runhaskell問題のUNIXバージョンと同様に、これはが現在のにあることを前提としていPATHます。
  • 最後にexit、最初の行以降のすべてがWindowsバッチファイルインタープリターに表示されないようにし、周囲のシェルexit /bではなく、このスクリプトのみを終了するようにします。cmd.exe
  • そして、リーディングは、このスクリプトを実行するときに、@このすべてのジブリッシュが編集されていないことを確認します。echo

(私は読み書きのできるHaskellコードに対して同じことをする方法を見つけていません;しかし私は現在それを必要としません。)

于 2012-12-24T07:14:13.640 に答える
4

パスの下に作成するだけです

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

自動実行可能なhaskellプログラムを作成するには、次のように記述します。

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

エラーなし、一時ファイルなし、..。

;)

(プログラム引数を変更して追加できます

runhaskell %1 %2 ...

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

)。

于 2012-12-24T09:05:18.047 に答える