#!/usr/bin/env -S guile --no-auto-compile !# (use-modules (ice-9 match) (ice-9 popen) (ice-9 pretty-print)) (define (main input-port) (define highlighter (open-output-pipe "source-highlight -s scheme -f esc | $PAGER")) (define (exn-handler exn) (close-pipe highlighter) ; make sure $PAGER doesn't mess up the terminal (raise-exception exn)) ; re-raise exception (define (pretty-printer) (match (read input-port) ((? eof-object? _) (close-pipe highlighter)) (thing (pretty-print thing highlighter) (newline highlighter) ; add empty line between top-level forms (pretty-printer)))) (with-exception-handler exn-handler pretty-printer)) (define (help-message program-name) (string-append "\ usage: " (basename program-name) " [-h] FILENAME This utility reads a Guile scheme file and pretty-prints it, throwing away any original formatting and comments. arguments: -h, --help show this message and exit FILENAME the scheme file name to pretty-print; required ")) (match (program-arguments) ((program-name . (? (lambda (args) (or (member "-h" args) (member "--help" args))) _)) (display (help-message program-name))) ((_ input-file) (call-with-input-file input-file main)) ((program-name . _) (display "error: invalid number of arguments\n\n" (current-error-port)) (display (help-message program-name) (current-error-port)) (exit 1)))