如何在批处理文件中嵌入Haskell(适用于Windows的Haskell)?
在安装了GHC的类UNIX系统上,我可以创建一个包含以下内容的文件如何在批处理文件中嵌入Haskell(适用于Windows的Haskell)?,windows,batch-file,haskell,cmd,shebang,Windows,Batch File,Haskell,Cmd,Shebang,在安装了GHC的类UNIX系统上,我可以创建一个包含以下内容的文件 #!/usr/bin/env runhaskell main = putStrLn "Hello, I am a UNIX script file." 使文件可执行,然后执行给定的Haskell代码 如何在Windows.bat文件中执行等效操作 最好不要创建额外的文件,不要设置环境变量,如果使用UNC路径或包含空格的路径访问批处理文件,Haskell名称空间不会受到污染,并且如果Haskell代码包含错误,则会产生合理的行为
#!/usr/bin/env runhaskell
main = putStrLn "Hello, I am a UNIX script file."
使文件可执行,然后执行给定的Haskell代码
如何在Windows.bat文件中执行等效操作
最好不要创建额外的文件,不要设置环境变量,如果使用UNC路径或包含空格的路径访问批处理文件,Haskell名称空间不会受到污染,并且如果Haskell代码包含错误,则会产生合理的行为。经过多次尝试和错误,这是可能的。我设计了以下内容:
@(set /p =-- < nul & type "%~f0") | runhaskell & exit /b
main = putStrLn "Hello, I am a Windows batch file."
@(set/p=--
此机制的唯一缺点是错误消息包含由(被称为)runhaskell创建的临时文件的名称
以下是对其工作原理的完整解释:
输出set/p=--
(和两个不相关的空格),后面没有换行符。其工作原理如下:-->
打印set/p ANSWER=请输入答案:
不换行,等待用户输入,并将其放入环境变量请输入答案:
中ANSWER
的行为就像用户没有输入任何内容一样- 作为(未记录的?)特例,可以省略环境变量名称,然后不设置环境变量
是当前批处理文件的名称“%~f0”
- 因此,
输出当前批处理文件,但第一行被注释掉(当解释为Haskell代码时)set/p=--
- 我们将其导入
,后者(非文档化?)将其stdin解释为非文本(!)Haskell代码。runhaskell
- 与问题中的UNIX版本一样,这假设
位于当前的runhaskell
路径上
- 与问题中的UNIX版本一样,这假设
- 最后,
确保Windows批处理文件解释器看不到第一行之后的所有内容,exit
确保我们只退出此脚本,而不退出任何周围的exit/b
shellcmd.exe
- 在运行这个脚本时,前面的
确保所有这些胡言乱语都不会被@
edecho
(我还没有找到一种方法可以对识字的Haskell代码执行同样的操作;但我目前不需要这样做。)只需在您的路径下创建即可
C:\my-tools-path>copy con --.bat
runhaskell %1
^Z
要创建自动可执行的haskell程序,请编写如下代码
-- "%~f0"
main = putStrLn "Merry Christmas!"
没有错误,没有临时文件
)()
(您可以添加您的程序参数。)
runhaskell %1 %2 ...
及
)+1非常好的主意,但是我会接受我自己的答案,因为我想要一个单一的文件解决方案,所以没有额外的
--.bat
文件。
-- "%~f0" %1 %2 ...