2015-07-10 37 views
10

我的意思是这样的:是否可以通过标准输入将源代码管理到GHC?

echo 'main = print 1' | ghc > executable 

为了这GHC回复:ghc: no input files

我缺少的东西?这可能以某种方式吗?

+2

这适用于runghc,但不会创建可执行文件。 – melpomene

+0

你究竟在做什么?运行一段Haskell代码,或者实际将其编译为独立的二进制文件?取决于你之后的情况,可能比手动调用GHC二进制文件更简单。 – MathematicalOrchid

回答

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结尾。

总的来说,这本质上是一个手动创建和删除临时文件的捷径。

我不确定是否有其他的shell支持这种事情。至少,我不认为bash的确如此。

+0

我将此标记为现在的解决方案,因为这是实现我所需要的最简洁的方法。如果有人发布了一个在zsh之外工作的类似简洁版本(例如,我已经尝试过'ghc -o可执行文件$(echo“main = print 1”| mktemp --suffix = .hs)'但没有成功)或者GHC实现支持在内部,那么我会相应地改变我的答案。 – Wizek

2

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

你可以,但是,当然,使用

filename=$(mktemp --suffix=.hs) 
echo "main = print 1" >> $filename 
ghc -o executable $filename 
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)

的问题:光耀使用后缀如.hs,.lhs.o决定如何处理文件(这是#3失败的原因)。即使你绕过那个(#4),ghc真的想要stat()文件来获得它的大小,这在管道上失败了。

+0

简单#4:'echo'main = print 1'| ghc -x hs/dev/stdin' – rampion

相关问题