Я имею в виду что-то вроде этого:
echo 'main = print 1' | ghc > executable
на который отвечает GHC: ghc: no input files
Я что-то упустил? Возможно ли это как-то?
Я имею в виду что-то вроде этого:
echo 'main = print 1' | ghc > executable
на который отвечает GHC: ghc: no input files
Я что-то упустил? Возможно ли это как-то?
Даже если это невозможно с нормальной замещением процесса, 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, по крайней мере.
Насколько я могу судить, ответ - нет. Мои попытки:
$ 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)
Проблемы: ghc использует суффиксы типа .hs
, .lhs
или .o
, чтобы решить, что делать с файлом (вот почему № 3 не работает). Даже если вы обманываете это (# 4), ghc действительно хочет stat()
файла получить его размер, который не работает на трубах.
Обычно ghc используется как компилятор, и вы запускаете его в файлах (на которых ghc может искать и выводить типы из окончаний и т.д.) и указывать выходные файлы как флаги.
Конечно, вы можете использовать
filename=$(mktemp --suffix=.hs)
echo "main = print 1" >> $filename
ghc -o executable $filename