Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Code formatter for Scheme using Guile's pretty-print method. This reads from stdin and writes to stdout.
(use-modules (ice-9 pretty-print))
;; Helper methods for maintaining comments and whitespace.
(define (copy-line-comment)
(let ((char (read-char)))
(if (not (eof-object? char))
(if (eq? char #\newline)
(begin (write-char char) (copy-line-comment))))))
(define (maintain-empty-lines)
(let ((char1 (read-char)) (char2 (peek-char)))
(if (and (eq? char1 #\newline) (eq? char2 #\newline))
(write-char (read-char)))))
;; The main method. This reads from and writes to stdin/stdout.
(define (scmfmt)
(let ((char (peek-char)))
(if (not (eof-object? char))
(cond ((eq? char #\;) (copy-line-comment))
((eq? char #\newline) (maintain-empty-lines))
((char-whitespace? char) (read-char))
(#t (pretty-print (read))))

ojarjur commented Oct 10, 2013

Note that this throws away both block comments and non-top-level comments.

This code was formatted by itself, so it should provide a good idea of what sample output looks like.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment