This is the mail archive of the guile@cygnus.com mailing list for the guile project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

modules defined in boot-9.scm



There are a number of modules defined in boot-9.scm. This slows
loading notably, makes boot-9.scm harder to maintain, and serves no
useful purpose. I found that by moving these modules into separate
files, named so that they are correctly autoloaded by the module
system, I could cut the startup time of the guile interpreter, as
measured by 
  time guile -c "(quit)"
in tcsh was cut nearly in half.

Before:

[mstachow@starman-jones] ~ > time guile -c "(quit)"
1.290u 0.050s 0:02.86 46.8% 0+0k 0+0io 180pf+0w


After:

[mstachow@starman-jones] ~ > time guile -c "(quit)"
0.780u 0.020s 0:01.71 46.7% 0+0k 0+0io 180pf+0w


I wrote a short guile script to automatically make the change in a
somewhat intelligent manner when run in the ice-9 directory, so that
the maintainers can make the change at their leisure, even if
boot-9.scm changes before they get around to it.

I ran the script on my /usr/share/guile/1.3a/ice-9 directory, and it
worked perfectly. I checked if the (ice-9 {calling,common-list,
q,runq,ls,string-fun}) modules, which were previously in the
boot-9.scm file, still autoloaded correctly in response to the
appropriate use-modules command, and they did. Without further adieu,
here is the script (pardon the style, it was just a quick hack to get
the job done). If you don't trust it, make the changes by hand
instead.

 - Maciej Stachowiak

----------
#!/usr/bin/guile
!#

(use-modules (ice-9 string-fun))

(define boot-9-port (open-input-file "boot-9.scm"))

(define all-lines '(("boot-9.scm.new.1")))

(define last-page-break all-lines)

(while #t
       (let ((current-line (read-delimited "\n" boot-9-port)))
         (if (eof-object? current-line) 
             (break 'done))
         (append! all-lines (list current-line))
         (if (equal? "" current-line)
	     (set! last-page-break (last-pair all-lines)))
	 ; the modules need to go into separate files
	 (if (string-prefix=? "(define-module (ice-9 " current-line)
	     (set-car! last-page-break
		       (list
			(string-append (split-before-char 
					#\) 
					(make-shared-substring 
					 current-line 22 
					 (string-length current-line))
					(lambda (x y) x))
				       ".scm"))))
	 ; but everything after this line needs to go back into boot-9.scm
	 (if (string-prefix=? ";;; {Load debug" current-line)
	     (set-car! last-page-break
		       (list "boot-9.scm.new.2")))))

(define work-port boot-9-port)

(for-each (lambda (x)
            (cond 
             ((string? x) (display x work-port)
			  (newline work-port))
             ((list? x) (close-port work-port)
			(set! work-port
			      (open-output-file (car x))))))
          all-lines)

(close-port work-port)

(rename-file "boot-9.scm" "boot-9.scm.orig")
(system "cat boot-9.scm.new.1 boot-9.scm.new.2 > boot-9.scm")
(delete-file "boot-9.scm.new.1")
(delete-file "boot-9.scm.new.2")