Haskell 是否可以通过标准输入将源代码传输到GHC?
我的意思是这样的:Haskell 是否可以通过标准输入将源代码传输到GHC?,haskell,ghc,Haskell,Ghc,我的意思是这样的: echo 'main = print 1' | ghc > executable GHC回复的内容:GHC:无输入文件 我错过什么了吗?这有可能吗?通常ghc用作编译器,您可以在文件上运行它(ghc可以在文件上查找并从结尾等推断类型),并将输出文件指定为标志 当然,您可以使用 filename=$(mktemp --suffix=.hs) echo "main = print 1" >> $filename ghc -o executable $filen
echo 'main = print 1' | ghc > executable
GHC回复的内容:GHC:无输入文件
我错过什么了吗?这有可能吗?通常ghc用作编译器,您可以在文件上运行它(ghc可以在文件上查找并从结尾等推断类型),并将输出文件指定为标志 当然,您可以使用
filename=$(mktemp --suffix=.hs)
echo "main = print 1" >> $filename
ghc -o executable $filename
据我所知,答案是否定的。我的尝试:
$echo'main=print 1'| ghc
ghc:无输入文件
$echo'main=print 1'| ghc-
ghc:无法识别的标志:-
$echo'main=print 1'| ghc/dev/stdin
目标'/dev/stdin'不是模块名或源文件
$ln-s/dev/stdin stdin.hs;echo‘main=print 1’| ghc stdin.hs
stdin.hs:hFileSize:类型不正确(不是常规文件)
问题:ghc使用
.hs
、.lhs
或.o
等后缀来决定如何处理文件(这就是#3失败的原因)。即使你破解了这个(#4),ghc也确实希望stat()
文件以获得其大小,这在管道上是失败的。尽管这在普通情况下是不可能的,但zsh提供了一种新的方法,允许“文件”比传统的进程替换更像真实的文件(通过创建一个实际的临时文件):
%ghc-o Main-x hs=(echo'Main=print 1')
[1/1]编译Main(/tmp/zshjlS99o,/tmp/zshjlS99o.o)
链接主。。。
%/主要
1.
%
-x hs
选项告诉ghc
就像给定的文件名以.hs
结尾一样
总的来说,这本质上是手动创建和删除临时文件的快捷方式
我不确定是否还有其他外壳支持这种东西。至少我不认为bash会这样做。这对runghc有效,但不会创建可执行文件。您实际上想要实现什么?运行一些Haskell代码,或者将其编译成独立的二进制代码?根据您的目标,可能有比手动调用GHC二进制文件更简单的方法。更简单的4:
echo'main=print 1'| GHC-x hs/dev/stdin
我现在将此标记为一个解决方案,因为这是实现我所寻找的最简洁的方法。如果有人发布了一个在zsh之外工作的类似简洁版本(例如,我尝试了ghc-o executable$(echo“main=print 1”| mktemp--suffix=.hs)
,但没有成功),或者ghc在内部实现了支持,那么我将相应地更改我的答案。