stdOut standard Output
ist ein offenes OutputFile auf das mit Rexx (call out 'blabla'
) oder wsh ($$ blabla
). Kann dynamisch geändert werden.
stdIn standard Input
ist ein offenes OutputFile auf dem mit Rexx (while in(var) ...
) oder mit wsh ($for var ...
) gelesen werden. Kann dynamisch geändert werden.
pipe Implementierung von Pipes, stdIn und stdOut implementiert über J
stdIn/stdOut werden auf einem Stack ( pipeStack m.pipe.) abgelegt. Das Rexx Interface verwaltet dies mit der Funktion
- pipe opts, fOut? (, fIn)*
opts ist ein String mit folgendem Inhalt - ohne Spaces in dieser Reiheenfolge, alles ist optional
- + oder -: push oder pop pipeStack
- Type des Outputfile
- Typen der Inputfiles (falls mehrere Files werden sie konkatiniert, letzter InputTyp wird wiederholt, falls mehr fIn vorhanden sind)
- f Inputfile auch hier mit o2file(fIn)
- p Parent stdIn (pipeStack[top-1])
- ! vorheriges stdOut (im selben pipe muss auch stdOut geändert werden, damit es geschlossen wird und input geöffnet werden kann
- s Input String
- o Input Object
Eine pipe die den output von codeA als input von codeB verwendet, codiert man also
call pipe 'N'; codeA; call pipe 'P!'; codeB; call pipe 'p'
oder mit Verwendung des Stacks, um vorher und nachher bei demselben stdIn/stdOut zu bleiben
call pipe '+N'; codeA; call pipe 'P!'; codeB; call pipe 'p'; call pipe '-'
wsh push't und pop't pipeStack selbständig, da genügt
... $<> call pipe '+N' $! codeB $<> ...
wobei die $<> nur nötig sind, wenn wsh sonst nicht merkt, dass da eine neue Pipe anfangen soll
Rexx und Wsh haben unterschiedliche Verarbeitungsreihen folgen:
- In Rexx werden die Pipe Statements natürlich da ausgeführt, wo sie hingeschrieben werden
- In Wsh dagegen, werden innerhalb einer Pipe, die $< und $> umgeordnert
- die $< an den Anfang (als Input der GesamtPipe)
- die $> zum letzt $! (als Output der GesamtPipe)
Die Wsh Methode entspricht der in Unix Shells und hat den Vorteil, dass man zur besseren Lesbarkeit ein langen Input hinter einen kurzen Command schreiben kann. Der Nachteil ist, dass man die $<> um Pipes zu unterteilen sorgfältig hinschreiben muss.