Here's some information I sent Guillaume Cartier about the new ##load-
object-file procedure. It might be useful for the Gambit module
stuff. Sorry for the mix of French and English...
Marc
Begin forwarded message:
> From: Marc Feeley <feeley(a)iro.umontreal.ca>
> Date: February 26, 2009 2:24:52 PM EST (CA)
> To: Guillaume Cartier <gcartier(a)jazzscheme.org>
> Subject: ##load-object-file
>
> Finalement tout était en place pour faire ce que tu veux... j'ai
> simplement rendu la logique utilisable par la fonction ##load-object-
> file. Cette fonction (définie dans lib/_eval.scm) retourne un code
> d'erreur ou un vecteur de longueur 3 contenant: le "exec
> vector" (les fonctions d'initialisation des modules), la liste des
> variables non-définies, et la "script line".
>
> Voici un exemple d'utilisation. J'ai fait un push il y a un instant.
>
> Marc
>
> % cat h.scm
> #!/usr/bin/env gsi -:d5,m10000
>
> (declare (block))
>
> (pp 'start-of-init-of-h.scm)
>
> (define (h) (pp 'hello))
>
> (pp not-defined)
>
> (pp 'end-of-init-of-h.scm)
>
> (expt 2 100) ;; value returned by init function
> % cat w.scm
> (declare (block))
>
> (pp 'start-of-init-of-w.scm)
>
> (define (w) (pp 'world))
>
> (pp 'end-of-init-of-w.scm)
> % gsc
> Gambit v4.4.1
>
> > (compile-file-to-c "h")
> #t
> > (compile-file-to-c "w")
> #t
> > (link-flat '("h" "w") output: "hw.o1.c")
> *** WARNING -- "expt" is not defined,
> *** referenced in: ("h.c")
> *** WARNING -- "not-defined" is not defined,
> *** referenced in: ("h.c")
> *** WARNING -- "pp" is not defined,
> *** referenced in: ("w.c" "h.c")
> > ,q
> % gcc -I include -bundle -D___DYNAMIC h.c w.c hw.o1.c -o hw.o1
> % gsi
> Gambit v4.4.1
>
> > (define result (##load-object-file "hw.o1" #t))
> > (pp result)
> #(#(#<procedure #2 | h|> #<procedure #3 | w|>)
> (("not-defined" . "h"))
> "/usr/bin/env gsi -:d5,m10000")
> >
> ;; si le resultat est un vecteur de longueur 3 le ##load-object-file
> ;; a fonctionne...
> (if (and (vector? result)
> (= 3 (vector-length result)))
> (let* ((exec-vect (vector-ref result 0))
> (mod1 (vector-ref exec-vect 0))
> (mod2 (vector-ref exec-vect 1)))
>
> ;; a cause de la declaration (block) h et w sont definis avant
> ;; d'initialiser les modules (c'est pas une bonne idee de se fier
> ;; sur ce comportement en general):
> (pp h)
> (pp w)
>
> (pp '***initializing-mod2)
> (pp (mod2))
>
> (pp '***initializing-mod1)
> (pp (mod1))
>
> (pp 'done)))
>
> #<procedure #4 h>
> #<procedure #5 w>
> ***initializing-mod2
> start-of-init-of-w.scm
> end-of-init-of-w.scm
> #!void
> ***initializing-mod1
> start-of-init-of-h.scm
> #!unbound
> end-of-init-of-h.scm
> 1267650600228229401496703205376
> done
> > ,q