123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #!/bin/sh
- # aside from this initial boilerplate, this is actually -*- scheme -*- code
- main='(module-ref (resolve-module '\''(scripts punify)) '\'main')'
- exec ${GUILE-guile} -l $0 -c "(apply $main (cdr (command-line)))" "$@"
- !#
- ;;; punify --- Display Scheme code w/o unnecessary comments / whitespace
- ;; Copyright (C) 2001, 2006 Free Software Foundation, Inc.
- ;;
- ;; This program is free software; you can redistribute it and/or
- ;; modify it under the terms of the GNU General Public License as
- ;; published by the Free Software Foundation; either version 2, or
- ;; (at your option) any later version.
- ;;
- ;; This program is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- ;; General Public License for more details.
- ;;
- ;; You should have received a copy of the GNU General Public License
- ;; along with this software; see the file COPYING. If not, write to
- ;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- ;; Boston, MA 02110-1301 USA
- ;;; Author: Thien-Thi Nguyen
- ;;; Commentary:
- ;; Usage: punify FILE1 FILE2 ...
- ;;
- ;; Each file's forms are read and written to stdout.
- ;; The effect is to remove comments and much non-essential whitespace.
- ;; This is useful when installing Scheme source to space-limited media.
- ;;
- ;; Example:
- ;; $ wc ./punify ; ./punify ./punify | wc
- ;; 89 384 3031 ./punify
- ;; 0 42 920
- ;;
- ;; TODO: Read from stdin.
- ;; Handle vectors.
- ;; Identifier punification.
- ;;; Code:
- (define-module (scripts punify)
- :export (punify))
- (define (write-punily form)
- (cond ((and (list? form) (not (null? form)))
- (let ((first (car form)))
- (display "(")
- (write-punily first)
- (let loop ((ls (cdr form)) (last-was-list? (list? first)))
- (if (null? ls)
- (display ")")
- (let* ((new-first (car ls))
- (this-is-list? (list? new-first)))
- (and (not last-was-list?)
- (not this-is-list?)
- (display " "))
- (write-punily new-first)
- (loop (cdr ls) this-is-list?))))))
- ((and (symbol? form)
- (let ((ls (string->list (symbol->string form))))
- (and (char=? (car ls) #\:)
- (not (memq #\space ls))
- (list->string (cdr ls)))))
- => (lambda (symbol-name-after-colon)
- (display #\:)
- (display symbol-name-after-colon)))
- (else (write form))))
- (define (punify-one file)
- (with-input-from-file file
- (lambda ()
- (let ((toke (lambda () (read (current-input-port)))))
- (let loop ((form (toke)))
- (or (eof-object? form)
- (begin
- (write-punily form)
- (loop (toke)))))))))
- (define (punify . args)
- (for-each punify-one args))
- (define main punify)
- ;;; punify ends here
|