ich so etwas wie dies bedeuten:Ist es möglich, Quellcode über Standardeingabe an GHC zu leiten?
echo 'main = print 1' | ghc > executable
Um die GHC antwortet: ghc: no input files
Bin ich etwas fehlt? Ist das irgendwie möglich?
ich so etwas wie dies bedeuten:Ist es möglich, Quellcode über Standardeingabe an GHC zu leiten?
echo 'main = print 1' | ghc > executable
Um die GHC antwortet: ghc: no input files
Bin ich etwas fehlt? Ist das irgendwie möglich?
Auch wenn dies mit normalen process substitution nicht möglich ist, bietet zsh ein special kind of process substitution-like behavior, die wie mehr eine realen Datei als herkömmliches Verfahren Substitution „Datei“ zu handeln erlaubt hat (durch eine tatsächliche temporäre Datei erstellen):
% ghc -o Main -x hs =(echo 'main = print 1')
[1 of 1] Compiling Main (/tmp/zshjlS99o, /tmp/zshjlS99o.o)
Linking Main ...
% ./Main
1
%
Die Option -x hs
teilt ghc
mit, dass der angegebene Dateiname in .hs
endet.
Insgesamt ist dies im Wesentlichen eine Verknüpfung zum manuellen Erstellen und Löschen einer temporären Datei.
Ich bin nicht sicher, ob es andere Shells gibt, die diese Art von Sache unterstützen. Ich denke nicht, Bash zumindest.
Ich markiere dies als eine Lösung für jetzt, weil dies der kürzeste Weg ist, um das zu erreichen, was ich suchte. Wenn jemand eine ähnlich prägnante Version postet, die außerhalb von zsh funktioniert (zB habe ich 'ghc -o executable $ (echo" main = print 1 "| mktemp --suffix = .hs)' noch ohne Erfolg) oder GHC implementiert Unterstützung intern, dann werde ich meine Antwort entsprechend ändern. – Wizek
Normalerweise wird ghc als Compiler verwendet und Sie führen es auf Dateien aus (auf denen ghc Typen von Endungen usw. suchen und ableiten kann) und Ausgabedateien als Flags angeben.
Sie können aber natürlich verwenden
filename=$(mktemp --suffix=.hs)
echo "main = print 1" >> $filename
ghc -o executable $filename
Soweit ich das beurteilen kann, ist die Antwort nein. Meine Versuche:
$ 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)
Die Probleme: ghc verwendet Suffixe wie .hs
, .lhs
, oder .o
zu entscheiden, was mit einer Datei zu tun ist (deshalb # 3 fehlschlägt). Selbst wenn du das hackst (# 4), will ghc wirklich die Datei bekommen, um seine Größe zu bekommen, was bei Pipes fehlschlägt.
einfacher # 4: 'echo 'main = print 1' | ghc -x hs/dev/stdin' – rampion
Dies funktioniert mit runghc, aber das wird keine ausführbare Datei erstellen. – melpomene
Was versuchen Sie eigentlich zu erreichen? Um einen Teil des Haskell-Codes auszuführen oder ihn in eine eigenständige Binärdatei zu kompilieren? Je nachdem, was Sie suchen, gibt es möglicherweise einfachere Möglichkeiten, als die GHC-Binärdatei manuell aufzurufen. – MathematicalOrchid