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@iro.umontreal.ca Date: February 26, 2009 2:24:52 PM EST (CA) To: Guillaume Cartier gcartier@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