;; pretty-print.stk -- a generic visitor for printing with nice indentation. (require "visitor") (require "print") (define-visitor :extends :locals ((indent-level :initform 0)) :methods ( (inc-indent (inc ) (set! indent-level (+ indent-level inc))) (dec-indent (dec ) (set! indent-level (- indent-level dec))) (before (next-method) (inc-indent vis 1)) (after (dec-indent vis 1) (next-method)) (before (next-method) (inc-indent vis 1)) (after (dec-indent vis 1) (next-method)) )) (define-method before ((p ) (s ) (e ) t) (indent p) (next-method) (inc-indent p (+ (string-length (symbol->string [label e])) 3))) (define-method after ((p ) (s ) (e ) t) (dec-indent p (+ (string-length (symbol->string [label e])) 3)) (next-method)) (define-method before ((p ) (l ) (e ) (t )) (next-method) (unless (eq? (car l) t) ;; don't print a newline before the first member of the list (indent p))) (define-method before ((p ) (v ) (e ) (t )) (next-method) (unless (eq? (vector-ref v 0) t) ;; don't print a newline before the first member of the vector (indent p))) (define-method indent ((p )) (printf (string-append "~%" (make-string [indent-level p] #\space)))) (provide "pretty-print")