(use-modules (ice-9 pretty-print)) (use-modules (ice-9 binary-ports)) (use-modules (ice-9 match)) (define filename (match (command-line) ((self file) file))) (define* (package-list port #:optional (init '())) (let ((start (ftell port)) (sexp (read port)) (end (ftell port))) (if (eof-object? sexp) init (package-list port (cons (list start end sexp) init))))) (define out-port (current-output-port)) (define port (open-file filename "r")) (define packages (package-list port)) (define sorted-packages (sort-list packages (match-lambda* (((_ _ ('define-public names _)) ...) (apply stringstring names))) (_ #t)))) (define (write-packages packages in-port out-port) (for-each (match-lambda ((start end _) (let* ((len (- end start))) (seek in-port start SEEK_SET) (put-bytevector out-port (get-bytevector-n port len))))) packages)) (write-packages sorted-packages port out-port)