Commit | Line | Data |
---|---|---|
28c31342 TTN |
1 | ;;; punify --- Display Scheme code w/o unnecessary comments / whitespace |
2 | ||
6e7d5622 | 3 | ;; Copyright (C) 2001, 2006 Free Software Foundation, Inc. |
28c31342 TTN |
4 | ;; |
5 | ;; This program is free software; you can redistribute it and/or | |
83ba2d37 NJ |
6 | ;; modify it under the terms of the GNU Lesser General Public License |
7 | ;; as published by the Free Software Foundation; either version 3, or | |
28c31342 TTN |
8 | ;; (at your option) any later version. |
9 | ;; | |
10 | ;; This program is distributed in the hope that it will be useful, | |
11 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
83ba2d37 | 13 | ;; Lesser General Public License for more details. |
28c31342 | 14 | ;; |
83ba2d37 NJ |
15 | ;; You should have received a copy of the GNU Lesser General Public |
16 | ;; License along with this software; see the file COPYING.LESSER. If | |
17 | ;; not, write to the Free Software Foundation, Inc., 51 Franklin | |
18 | ;; Street, Fifth Floor, Boston, MA 02110-1301 USA | |
28c31342 | 19 | |
61897afe TTN |
20 | ;;; Author: Thien-Thi Nguyen |
21 | ||
28c31342 TTN |
22 | ;;; Commentary: |
23 | ||
24 | ;; Usage: punify FILE1 FILE2 ... | |
25 | ;; | |
26 | ;; Each file's forms are read and written to stdout. | |
27 | ;; The effect is to remove comments and much non-essential whitespace. | |
28 | ;; This is useful when installing Scheme source to space-limited media. | |
29 | ;; | |
30 | ;; Example: | |
31 | ;; $ wc ./punify ; ./punify ./punify | wc | |
b0147aec TTN |
32 | ;; 89 384 3031 ./punify |
33 | ;; 0 42 920 | |
28c31342 TTN |
34 | ;; |
35 | ;; TODO: Read from stdin. | |
36 | ;; Handle vectors. | |
37 | ;; Identifier punification. | |
28c31342 TTN |
38 | |
39 | ;;; Code: | |
40 | ||
41 | (define-module (scripts punify) | |
42 | :export (punify)) | |
43 | ||
a1a2ed53 AW |
44 | (define %include-in-guild-list #f) |
45 | (define %summary "Strip comments and whitespace from a Scheme file.") | |
46 | ||
28c31342 | 47 | (define (write-punily form) |
b0147aec TTN |
48 | (cond ((and (list? form) (not (null? form))) |
49 | (let ((first (car form))) | |
50 | (display "(") | |
51 | (write-punily first) | |
52 | (let loop ((ls (cdr form)) (last-was-list? (list? first))) | |
53 | (if (null? ls) | |
54 | (display ")") | |
55 | (let* ((new-first (car ls)) | |
56 | (this-is-list? (list? new-first))) | |
57 | (and (not last-was-list?) | |
58 | (not this-is-list?) | |
59 | (display " ")) | |
60 | (write-punily new-first) | |
61 | (loop (cdr ls) this-is-list?)))))) | |
62 | ((and (symbol? form) | |
63 | (let ((ls (string->list (symbol->string form)))) | |
64 | (and (char=? (car ls) #\:) | |
65 | (not (memq #\space ls)) | |
66 | (list->string (cdr ls))))) | |
67 | => (lambda (symbol-name-after-colon) | |
68 | (display #\:) | |
69 | (display symbol-name-after-colon))) | |
70 | (else (write form)))) | |
28c31342 TTN |
71 | |
72 | (define (punify-one file) | |
73 | (with-input-from-file file | |
74 | (lambda () | |
75 | (let ((toke (lambda () (read (current-input-port))))) | |
76 | (let loop ((form (toke))) | |
77 | (or (eof-object? form) | |
78 | (begin | |
79 | (write-punily form) | |
80 | (loop (toke))))))))) | |
81 | ||
82 | (define (punify . args) | |
83 | (for-each punify-one args)) | |
84 | ||
85 | (define main punify) | |
86 | ||
87 | ;;; punify ends here |