我的意思是这样的:是否可以通过标准输入将源代码管理到GHC?
echo 'main = print 1' | ghc > executable
为了这GHC回复:ghc: no input files
我缺少的东西?这可能以某种方式吗?
我的意思是这样的:是否可以通过标准输入将源代码管理到GHC?
echo 'main = print 1' | ghc > executable
为了这GHC回复:ghc: no input files
我缺少的东西?这可能以某种方式吗?
即使这是不可能的正常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的确如此。
我将此标记为现在的解决方案,因为这是实现我所需要的最简洁的方法。如果有人发布了一个在zsh之外工作的类似简洁版本(例如,我已经尝试过'ghc -o可执行文件$(echo“main = print 1”| mktemp --suffix = .hs)'但没有成功)或者GHC实现支持在内部,那么我会相应地改变我的答案。 – Wizek
ghc通常用作编译器,并在文件上运行(ghc可以从结尾搜索和推断类型等)并将输出文件指定为标志。
你可以,但是,当然,使用
filename=$(mktemp --suffix=.hs)
echo "main = print 1" >> $filename
ghc -o executable $filename
至于我可以告诉大家,答案是否定的。我尝试:
$ echo 'main = print 1' | ghc ghc: no input files
$ echo 'main = print 1' | ghc - ghc: unrecognised flag: -
$ echo 'main = print 1' | ghc /dev/stdin target ‘/dev/stdin’ is not a module name or a source file
$ 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()
文件来获得它的大小,这在管道上失败了。
简单#4:'echo'main = print 1'| ghc -x hs/dev/stdin' – rampion
这适用于runghc,但不会创建可执行文件。 – melpomene
你究竟在做什么?运行一段Haskell代码,或者实际将其编译为独立的二进制文件?取决于你之后的情况,可能比手动调用GHC二进制文件更简单。 – MathematicalOrchid