2016-10-13 1 views
1

Mein Programm schreibt derzeit Bytes mit write-byte im gesamten Programm.
Wenn ein Fehler im Programm ist, stoppt das Programm dort, aber ich habe festgestellt, dass dies noch die zuvor geschriebenen Bytes (vor dem Auftreten des Fehlers) bleibt.Racket: Speichern von Bytes und dann alle am Ende des Programms ausgeben

Ich frage mich, ob es möglich ist, alle Bytes zu behalten, die ich bis zum erfolgreichen Beenden des Programms ausgeben möchte, so dass, wenn das Programm vor dem Ende des Programms einen Fehler findet, nichts ausgibt, und Wenn kein Fehler auftritt, kann ich alle Bytes ausgeben, die ich schreiben wollte.

Antwort

2

Sie können Ihr Programm in with-output-to-bytes wickeln einen bytestring Wert anstelle des Schreibens direkt auf die Standardausgabe zu produzieren:

(with-output-to-bytes 
    (λ() 
    (write-bytes #"a") 
    (write-bytes #"b"))) 

Intern ist dies nur ein super einfache Wrapper um open-output-bytes und eine Parametrisierung von current-output-port, Wenn Sie also eine feinere Steuerung wünschen, können Sie diese direkt verwenden. Zum Beispiel, wenn Sie ein einfaches Skript haben und wollen nicht das ganze Programm wickeln, können Sie die current-output-port Parameter global mutieren:

(define stdout (current-output-port)) 
(define output (open-output-bytes)) 
(current-output-port output) 

(void 
(begin 
    (write-bytes #"a") 
    (write-bytes #"b"))) 

(write-bytes (get-output-bytes output) stdout) 

Seien Sie jedoch vorsichtig: current-output-port wie das Mutieren alles beeinflussen dass druckt, einschließlich der Ausgabe von Ausdrücken, die auf einer Modulebene ausgewertet werden, weshalb es notwendig ist, die write-bytes-Aufrufe mit void oben zu umbrechen.

-1

Man kann Bytes zu einer Liste hinzufügen und sie später zusammen drucken:

(define lst '()) 

(set! lst (cons #"a" lst)) 
(set! lst (cons #"b" lst)) 

(println lst) 

(for ((item (reverse lst))) 
    (write-bytes item)) 

Ausgang:

'(#"b" #"a") 
ab 

Liste hat da ‚cons‘ umgekehrt werden addiert Element an der Spitze der Liste .

Verwandte Themen