是否可以通过标准输入将源代码传递给GHC?

时间:2015-07-10 21:54:19

标签: haskell ghc

我的意思是这样的:

echo 'main = print 1' | ghc > executable

GHC回复:ghc: no input files

我错过了什么吗?这有可能吗?

3 个答案:

答案 0 :(得分: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)

  5. 问题:ghc使用.hs.lhs.o等后缀来决定如何处理文件(这就是#3失败的原因)。即使你讨厌它(#4),ghc真的希望stat()文件得到它的大小,这在管道上失败。

答案 1 :(得分: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中结束。

总的来说,这实际上是手动创建和删除临时文件的捷径。

我不确定是否有其他炮弹支持此类事情。至少,我不认为bash会这么做。

答案 2 :(得分:2)

通常ghc用作编译器,您可以在文件上运行(ghc可以在其上查找和推断结尾类型等)并将输出文件指定为标志。

但是,您当然可以使用

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