Oh, ich glaube der Bengel hat Ahnung .....
Nee. Ich tu nur so. Alles Fassade. :-)
Generell ist es aber ne oft gute Möglichkeit quasi mit Ausgaben auf stdout zu debuggen. Das mache ich auch gern in anderen Sprachen, weils halt unkompliziert ist.
Übrigens. Auch solche Sachen kann man wieder schön in ein Makro verpacken:
Code:
(define-syntax-rule (debug msg expression)
(when DEBUG
(begin
(display (format "~a: " msg))
(println expression)
)))
Dann kann man nämlich einfach schreiben:
(debug "Key-Code" (send event get-key-code))
Und in Abhängigkeit davon, ob die Variable
DEBUG #t oder
#f ist die Debug-Ausgabe aktiv oder nicht.
Wenn man also Debug-Ausgaben haben will macht man am Anfang des Programms irgendwo ein:
(define DEBUG #t)
Jetzt können wir das Makro noch etwas verfeinern. Wir möchten z.B. auch darauf reagieren, wenn die Variable
DEBUG gar nicht existiert.
Das können wir prüfen mit
(identifier-binding #'DEBUG)
Tricky wird es jetzt, wenn wir auch noch angeben wollen, welcher Ausdruck überhaupt ausgewertet wird. Oder auch in welche Zeilennummer die debug-Ausgabe steht.
Fürs erste können wir
syntax->datum nehmen. Dann ergibt sich
Code:
(define-syntax-rule (debug msg expression)
(when (and (identifier-binding #'DEBUG) DEBUG)
(begin
(display (format "~a - ~a:"
msg
(syntax->datum #'expression)))
(println expression))))
Wenn wir das dann in
CrimsonKings einbauen sieht die Debug-Ausgabe durch:
(debug "Key-Code" (send event get-key-code))
z.B. so aus:
Key-Code - (send event get-key-code): #\f
Man kann auch andere Scherze machen. Das
debug beispielsweise direkt den Ausdruck zurück gibt, den es anzeigt.
Dann braucht man keine extra Zeile mehr dafür:
Code:
(define DEBUG #t)
(define-syntax-rule (debug msg expression)
(begin
(when (and (identifier-binding #'DEBUG) DEBUG)
(begin
(display (format "~a - ~a: "
msg
(syntax->datum #'expression)))
(println expression)))
expression))
Und das kann man dann direkt einbauen und es funktioniert immer, egal ob
DEBUG #t ist oder
#f. Aber nur bei
#t gibts eben zusätzlich Debug-Ausgaben:
Code:
(new (class text-field% (super-new)
(define/override (on-subwindow-char receiver event)
(case (debug "Key-Code" (send event get-key-code))
((#\return)
(displayln "ENTER"))
((#\+ #\-)
(displayln "+"))
(else
(displayln "ELSE-Zweig")
(super on-subwindow-char receiver event)))
#f))
Soviel erst mal für jetzt.