2015-07-10 11 views
10

mam na myśli coś takiego:Czy możliwe jest podłączenie kodu źródłowego do GHC za pomocą standardowego wejścia?

echo 'main = print 1' | ghc > executable 

Do którego GHC odpowiada: ghc: no input files

jestem brakuje czegoś? Czy to w jakiś sposób jest możliwe?

+2

Działa z runghc, ale to nie utworzy pliku wykonywalnego. – melpomene

+0

Co właściwie próbujesz osiągnąć? Aby uruchomić jakiś fragment kodu Haskella lub faktycznie skompilować go w samodzielny plik binarny? W zależności od tego, czego szukasz, mogą istnieć prostsze sposoby niż ręczne wywoływanie pliku binarnego GHC. – MathematicalOrchid

Odpowiedz

4

Nawet jeśli nie jest to możliwe z normalnego process substitution, zsh zapewnia special kind of process substitution-like behavior, który pozwala na „plik”, aby działać jak bardziej rzeczywistego niż tradycyjne pliku substytucji procesowej robi (poprzez stworzenie rzeczywistej plik tymczasowy):

% ghc -o Main -x hs =(echo 'main = print 1') 
[1 of 1] Compiling Main    (/tmp/zshjlS99o, /tmp/zshjlS99o.o) 
Linking Main ... 
% ./Main 
1 
% 

Opcja -x hs informuje, że ghc zachowuje się tak, jakby nazwa pliku podana na końcu w .hs.

Ogólnie jest to skrót do ręcznego tworzenia i usuwania pliku tymczasowego.

Nie jestem pewien, czy istnieją inne powłoki, które obsługują tego typu rzeczy. Nie sądzę, żeby przynajmniej tak było.

+0

Na razie zaznaczam to jako rozwiązanie, ponieważ jest to najbardziej zwięzły sposób na osiągnięcie tego, czego szukałem. Jeśli ktoś publikuje podobnie zwięzłą wersję, która działa poza Zsh (np. Próbowałem 'ghc -o wykonywalny $ (echo" main = print 1 "| mktemp --suffix = .hs)' bez powodzenia) lub GHC implementuje obsługę wewnętrznie, wtedy odpowiednio zmienię swoją odpowiedź. – Wizek

2

Zazwyczaj ghc jest używany jako kompilator i uruchamiasz go na plikach (na których ghc może wyszukiwać typy z końcówek itp.) I określać pliki wyjściowe jako flagi.

Można jednak oczywiście używać

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

O ile mogę powiedzieć, odpowiedź brzmi: nie. Moje próby:

  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)

Problemy: ghc używa przyrostków jak .hs, .lhs lub .o, aby zdecydować, co zrobić z plikiem (to właśnie dlatego # 3 kończy się niepowodzeniem). Nawet jeśli się z tym zetkniesz (# 4), ghc naprawdę chce uzyskać plik o wielkości stat(), który zawodzi w przypadku potoków.

+0

prościej # 4: 'echo 'main = print 1' | ghc -x hs/dev/stdin' – rampion

Powiązane problemy