Continuations



next up previous
Next: Monadisches I/O Up: Ein- und Ausgabe Previous: Dialogues

Continuations

Eine zweite Möglichkeit I/O in refentiell transparenter Weise in Gofer zu realisieren, ist über Continuations. Hier steht der sequentialisierte Charakter von I/O-Funktionen im Vordergrund. Eine I/O-Funktion hat dabei immer eine Reihe von Argumenten nach folgenden Muster: zuerst folgen die Argumente, die für die I/O-Operation notwendig sind. Dieses kann z.B. der Dateiname einer zu lesenden Datei sein. Dann folgt als ein weiteres Argument eine I/O-Funktion, die ausgeführt werden soll, wenn die I/O-Operation vom Betriebssystem nicht erfolgreich abgeschlossen werden kann, und als ein letztes Argument folgt die I/O-Funktion, die ausgeführt werden soll, wenn die I/O-Operation vom Betriebssystem erfolgreich abgeschlossen werden konnte. In der Gofer-Prelude sind solche Continuation-I/O-Funktionen definiert. Mit ihnen läßt sich recht bequem I/O in Gofer realisieren.

Beispiele:

helloWord = appendChan stdout "hello worls\n" abort done

showFile name 
 = readFile
     name 
     (\_ -> appendChan stdout  ("Can't open " ++ name) abort done) 
     (\result -> appendChan stdout result abort done)

moin = appendChan stdout "Geben Sie ein Zahl ein: " abort readzahl

readzahl = readChan stdin abort writequadrat


writequadrat zahl  =  appendChan stdout 
                             ("\n Das Quadrat von 
                            ++ (head (lines zahl))
                            ++ " ist: "++ ausgabe ++ "!\n" ) 
                      abort done
            where
             ausgabe = int2string ((str2int (head (lines zahl)))^2)

str2int x = str2intaux x 0
str2intaux "" a = a
str2intaux (n:ns) a = str2intaux ns ((10*a)+(ord n) - 48)
gif



Sven Eric Panitz
Mi., 01. Nov. 1995, 12:17:13