Hi Christopher, Christopher Lam <christopher....@gmail.com> writes:
> Hi All > In experiments converting legacy code to use srfi-9 records, I'm finding > the latter doesn't travel well across modules. > > See simple code below -- m1.scm runs fine however m2.scm borks when > creating srfi-9 record object > > Any clue why srfi-9 can't be exported? > > For various reasons I must keep (load "module.scm") mechanism > ----m1.scm follows---- > (use-modules (srfi srfi-9)) > > (define-record-type <person> > (make-person name age) > person? > (name person-name set-person-name!) > (age person-age set-person-age!)) > > (define <pet> (make-record-type "pet" '(name age))) > (define make-pet (record-constructor <pet>)) > (define pet? (record-predicate <pet>)) > (define pet-name (record-accessor <pet> 'name)) > (define pet-age (record-accessor <pet> 'age)) > (define set-pet-name! (record-modifier <pet> 'name)) > (define set-pet-age! (record-modifier <pet> 'age)) > (export make-person) > (export make-pet) > > (display "pet ") > (let ((pet2 (make-pet "milou" 7))) > (display (pet-name pet2))) > (display ", person ") > (let ((person2 (make-person "james" 54))) > (display (person-name person2))) > (newline) > ----m2.scm follows---- > (load "m1.scm") > (display "in m2:") > (newline) > (display "pet ") > (let ((pet2 (make-pet "milou" 7))) > (display (pet-name pet2))) > (display ", person ") > (let ((person2 (make-person "james" 54))) > (display (person-name person2))) > (newline) > -------------------------------- > $guile m1.scm runs successfully > > pet milou, person james > > $guile m2.scm first runs m1.scm but fails to recognise the srfi-9 > make-person exists: > pet milou, person james > in m2: > pet milou, person Backtrace: > 6 (apply-smob/1 #<catch-closure 5599248723e0>) > In ice-9/boot-9.scm: > 705:2 5 (call-with-prompt _ _ #<procedure default-prompt-handle…>) > In ice-9/eval.scm: > 619:8 4 (_ #(#(#<directory (guile-user) 559924904140>))) > In ice-9/boot-9.scm: > 2312:4 3 (save-module-excursion _) > 3831:12 2 (_) > In /home/chris/sources/caca/m2.scm: > 8:15 1 (_) > In unknown file: > 0 (_ "james" 54) > > ERROR: Wrong type to apply: #<syntax-transformer make-person> The problem here is that 'make-person' is a macro. Macros are expanded at compile time, and must therefore be available at compile time. When you compile 'm2.scm', those macros are not available, because 'load' only has effects at run-time, by design. Since there is no macro definition for 'make-person' at compile-time, Guile's compiler generates code that assumes it will be a procedure. In summary, you cannot use 'load' to import macros from another module. > For various reasons I must keep (load "module.scm") mechanism If you can share those reasons, perhaps I can help you find another solution. Regards, Mark