繁体   English   中英

是否可以通过标准输入将源代码通过管道传输到 GHC?

[英]Is it possible to pipe source code to GHC through standard input?

我的意思是这样的:

echo 'main = print 1' | ghc > executable

GHC 回复的对象: ghc: no input files

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

据我所知,答案是否定的。 我的尝试:

  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)

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

尽管通过正常的进程替换是不可能的,但是zsh提供了一种特殊的类似进程替换的行为 ,它允许“文件”比传统的进程替换更像是一个真正的文件(通过创建一个实际的临时文件) :

% 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没有。

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

但是,您当然可以使用

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

这可能不是您想要的,但正如 melpomene 已经提到的,runghc 可以做到这一点。 我认为它应该得到自己的答案:

runghc <<< 'main = print 123'

网上试试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM