Можно ли подключить исходный код к GHC через стандартный ввод?

Я имею в виду что-то вроде этого:

echo 'main = print 1' | ghc > executable

на который отвечает GHC: ghc: no input files

Я что-то упустил? Возможно ли это как-то?

Ответ 1

Даже если это невозможно с нормальной замещением процесса, 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, по крайней мере.

Ответ 2

Насколько я могу судить, ответ - нет. Мои попытки:

  • $ 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() файла получить его размер, который не работает на трубах.

Ответ 3

Обычно ghc используется как компилятор, и вы запускаете его в файлах (на которых ghc может искать и выводить типы из окончаний и т.д.) и указывать выходные файлы как флаги.

Конечно, вы можете использовать

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