wsh2 Concepts

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
    • A oder F Append oder überschreiben Outputfile. Es wird o2file(fOut) benutzt, also ein StrV oder StrW wirkt als fileSpec
    • N Neuer leerer Buffer (class Cat)
    • P Parent stdOut (pipeStack[top-1])
    • Y Root stdOut (pipeStack[1]), normalerweise Say
  • 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.