* What replaces scm_register_module_xxx (Doc update?) @ 2002-08-08 13:48 rm 2002-08-08 14:21 ` Dale P. Smith 0 siblings, 1 reply; 26+ messages in thread From: rm @ 2002-08-08 13:48 UTC (permalink / raw) Hello, according to the docs one can put functions defined in C into a module by writing a custom initialisation function and registering it with 'scm_register_module_xxx'. Since this function seems to have been removed from guile, how am i supposed to put my functions into modules? tia Ralf Mattes _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-08 13:48 What replaces scm_register_module_xxx (Doc update?) rm @ 2002-08-08 14:21 ` Dale P. Smith 2002-08-08 14:23 ` Dale P. Smith 2002-08-08 14:31 ` Rob Browning 0 siblings, 2 replies; 26+ messages in thread From: Dale P. Smith @ 2002-08-08 14:21 UTC (permalink / raw) On Thu, 8 Aug 2002 15:48:24 +0200 rm@fabula.de wrote: > Hello, > > according to the docs one can put functions defined > in C into a module by writing a custom initialisation > function and registering it with 'scm_register_module_xxx'. > Since this function seems to have been removed from guile, > how am i supposed to put my functions into modules? The new method is to use a .scm file that defines the module, dynamically loads the compiled code, and then exports whatever you need. Do do this from C you need to use scm_c_define_module and scm_c_export. -Dale -- Dale P. Smith Senior Systems Consultant, | Treasurer, Altus Technologies Corporation | Cleveland Linux Users Group dsmith@altustech.com | http://cleveland.lug.net 440-746-9000 x339 | _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-08 14:21 ` Dale P. Smith @ 2002-08-08 14:23 ` Dale P. Smith 2002-08-08 14:31 ` Rob Browning 1 sibling, 0 replies; 26+ messages in thread From: Dale P. Smith @ 2002-08-08 14:23 UTC (permalink / raw) On Thu, 8 Aug 2002 10:21:03 -0400 "Dale P. Smith" <dsmith@altustech.com> wrote: > To do this from C you need to use scm_c_define_module and scm_c_export. See examples/box-module/box.c for an example. -Dale -- Dale P. Smith Senior Systems Consultant, | Treasurer, Altus Technologies Corporation | Cleveland Linux Users Group dsmith@altustech.com | http://cleveland.lug.net 440-746-9000 x339 | _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-08 14:21 ` Dale P. Smith 2002-08-08 14:23 ` Dale P. Smith @ 2002-08-08 14:31 ` Rob Browning 2002-08-08 16:19 ` rm 1 sibling, 1 reply; 26+ messages in thread From: Rob Browning @ 2002-08-08 14:31 UTC (permalink / raw) Cc: guile-devel "Dale P. Smith" <dsmith@altustech.com> writes: > The new method is to use a .scm file that defines the module, > dynamically loads the compiled code, and then exports whatever you > need. Right. (define-module (foo bar)) (load-extension "libguile-foo-bar-v-1" "init_guile_foo_bar-v-1") (export foo-1) (export foo-2) (export bar-1) ... Putting the library major version number into the shared lib name isn't required by the code, but it's highly recommended for now. This will keep you from having .la name conflicts and from not being able to know which version of your lib will get loaded if/when you need to release libguile-foo-bar-v-2. i.e. libguile-foo-bar-v-2.so.2.0.0. This may just be a temporary practice. It depends on what we figure out during the 1.7 series regarding dynamic linking. Hope this helps. -- Rob Browning rlb @defaultvalue.org, @linuxdevel.com, and @debian.org Previously @cs.utexas.edu GPG=1C58 8B2C FB5E 3F64 EA5C 64AE 78FE E5FE F0CB A0AD _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-08 14:31 ` Rob Browning @ 2002-08-08 16:19 ` rm 2002-08-08 17:59 ` Dale P. Smith ` (3 more replies) 0 siblings, 4 replies; 26+ messages in thread From: rm @ 2002-08-08 16:19 UTC (permalink / raw) Cc: Dale P. Smith, guile-devel On Thu, Aug 08, 2002 at 09:31:51AM -0500, Rob Browning wrote: > "Dale P. Smith" <dsmith@altustech.com> writes: > > > The new method is to use a .scm file that defines the module, > > dynamically loads the compiled code, and then exports whatever you > > need. > > Right. > > (define-module (foo bar)) > (load-extension "libguile-foo-bar-v-1" "init_guile_foo_bar-v-1") > (export foo-1) > (export foo-2) > (export bar-1) > ... I think there's a misunderstanding/misconception here (or, better: in guile's current C api). The 'load-c-functions-through-scheme' aproach might be fine and all that's needed as long as we only want to extend _guile_ (the application) with external libs. But guile is inteded to be an embedded srcipting language as well (at least that's what the documentation says). If i want my users to be able to script some of my applications functionality there's no library i can load with 'load-extension' -- of course i could put the tiny scm_* wrapper functions into a dll and have _that_ loaded, but i wouldn't call this good design practise (oh, i could 'load-extension' my own application instead, but that's not really portable ...). Having to provide (and deploy!) scm file(s) just to be able to put my functions into different modules feels clumsy. BTW, another problem i see (and face in mod_guile): with the above mentioned approach it seems to be impossible for one dll to provide functions that go into different modules. ;; file: foo/strings (define-module (foo strings)) (load-extension "libguile-foo-bar-v-1" "init_guile_foo_bar-v-1") (export foo-1) (export foo-2) (export bar-1) ;; file: foo/utils (define-module (foo utils)) (load-extension "libguile-foo-bar-v-1" "init_guile_foo_bar-v-1") (export foo-4) (export foo-5) Probably doesn't work as expected, or? Ralf Mattes _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-08 16:19 ` rm @ 2002-08-08 17:59 ` Dale P. Smith 2002-08-08 18:24 ` rm 2002-08-08 20:26 ` Marius Vollmer ` (2 subsequent siblings) 3 siblings, 1 reply; 26+ messages in thread From: Dale P. Smith @ 2002-08-08 17:59 UTC (permalink / raw) On Thu, 8 Aug 2002 18:19:58 +0200 rm@fabula.de wrote: > I think there's a misunderstanding/misconception here (or, better: > in guile's current C api). The 'load-c-functions-through-scheme' > aproach might be fine and all that's needed as long as we only want > to extend _guile_ (the application) with external libs. But guile > is inteded to be an embedded srcipting language as well (at least that's > what the documentation says). If i want my users to be able to script > some of my applications functionality there's no library i can load > with 'load-extension' -- of course i could put the tiny scm_* wrapper > functions into a dll and have _that_ loaded, but i wouldn't call this > good design practise (oh, i could 'load-extension' my own application > instead, but that's not really portable ...). Having to provide (and > deploy!) scm file(s) just to be able to put my functions into different > modules feels clumsy. I think it's possible with the (undocumented) scm_c_* functions in libguile/modules.c. It looks like this is the first stab at providing a C interface to the module system. A problem that I see is that there is no way to tell the snarfing system which module to put things in. It's not that big of a problem if you split up different "modules" into different C files. In the init routine for the file, you first call scm_c_define_module, then #include the .x file, then call scm_c_exports with the names of the symbols you need to export. You might want to verify the scm_c_* fucniton names I used. -Dale -- Dale P. Smith Senior Systems Consultant, | Treasurer, Altus Technologies Corporation | Cleveland Linux Users Group dsmith@altustech.com | http://cleveland.lug.net 440-746-9000 x339 | _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-08 17:59 ` Dale P. Smith @ 2002-08-08 18:24 ` rm 0 siblings, 0 replies; 26+ messages in thread From: rm @ 2002-08-08 18:24 UTC (permalink / raw) Cc: guile-devel On Thu, Aug 08, 2002 at 01:59:30PM -0400, Dale P. Smith wrote: > > I think it's possible with the (undocumented) scm_c_* functions in > libguile/modules.c. It looks like this is the first stab at providing a > C interface to the module system. > > A problem that I see is that there is no way to tell the snarfing system > which module to put things in. That was the nice thing about scm_register_module_xxx - the semantic was clear: the init function given to it was supposed to set up all the fuctions/ bindings for the module given in the name parameter. As a bonus one got delayed loading since the init function got only called when the module was 'use'd. > It's not that big of a problem if you > split up different "modules" into different C files. ... one of the reasons i started doing this in mod_guile ;-) > In the init > routine for the file, you first call scm_c_define_module, then #include > the .x file, then call scm_c_exports with the names of the symbols you > need to export. I just wanted to veryfy that this appoach is "blessed" -- and maybe point out a weak spot in the documentation and API. Ralf > You might want to verify the scm_c_* fucniton names I used. > > -Dale > > -- > Dale P. Smith > Senior Systems Consultant, | Treasurer, > Altus Technologies Corporation | Cleveland Linux Users Group > dsmith@altustech.com | http://cleveland.lug.net > 440-746-9000 x339 | > > _______________________________________________ > Guile-devel mailing list > Guile-devel@gnu.org > http://mail.gnu.org/mailman/listinfo/guile-devel _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-08 16:19 ` rm 2002-08-08 17:59 ` Dale P. Smith @ 2002-08-08 20:26 ` Marius Vollmer 2002-08-08 21:28 ` Neil Jerram 2002-08-09 8:47 ` Matthias Koeppe 3 siblings, 0 replies; 26+ messages in thread From: Marius Vollmer @ 2002-08-08 20:26 UTC (permalink / raw) Cc: Rob Browning, Dale P. Smith, guile-devel rm@fabula.de writes: > If i want my users to be able to script some of my applications > functionality there's no library i can load with 'load-extension' You can call C functions by other means than by 'load-extension' ;) If you want to make several modules available to your users with functions in them that are implemented in C, you can write the thin Scheme wrapper for each module, but instead of calling load-extension you directly call a previously registered C function. Like so void foo_init_inits () { scm_c_define_gsubr ("foo-init-strings-bindings", ...); scm_c_define_gsubr ("foo-init-utils-bindings", ...); } ;; file: foo/strings (define-module (foo strings)) (foo-init-strings-bindings) (export foo-1) (export foo-2) (export bar-1) ;; file: foo/utils (define-module (foo utils)) (foo-init-utils-bindings) (export foo-4) (export foo-5) There is the fine point of in what module foo-init-strings-bindings is defined. I'm not sure about that, right now... _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-08 16:19 ` rm 2002-08-08 17:59 ` Dale P. Smith 2002-08-08 20:26 ` Marius Vollmer @ 2002-08-08 21:28 ` Neil Jerram 2002-08-09 15:36 ` rm 2002-08-09 8:47 ` Matthias Koeppe 3 siblings, 1 reply; 26+ messages in thread From: Neil Jerram @ 2002-08-08 21:28 UTC (permalink / raw) Cc: Rob Browning, Dale P. Smith, guile-devel >>>>> "rm" == rm <rm@fabula.de> writes: rm> I think there's a misunderstanding/misconception here (or, rm> better: in guile's current C api). The rm> 'load-c-functions-through-scheme' aproach might be fine and rm> all that's needed as long as we only want to extend _guile_ rm> (the application) with external libs. But guile is inteded to rm> be an embedded srcipting language as well (at least that's rm> what the documentation says). If i want my users to be able to rm> script some of my applications functionality there's no rm> library i can load with 'load-extension' -- of course i could rm> put the tiny scm_* wrapper functions into a dll and have rm> _that_ loaded, but i wouldn't call this good design practise rm> (oh, i could 'load-extension' my own application instead, but rm> that's not really portable ...). Having to provide (and rm> deploy!) scm file(s) just to be able to put my functions into rm> different modules feels clumsy. Right now I'm afraid I don't follow the structure of your extension(s), but it certainly sounds to me like you ought to be able to achieve what you are trying to. Could you describe the structure in more detail, in terms of code modules (C and Scheme), libraries, how things get loaded and configured, etc.? Neil _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-08 21:28 ` Neil Jerram @ 2002-08-09 15:36 ` rm 2002-08-17 11:59 ` Neil Jerram 0 siblings, 1 reply; 26+ messages in thread From: rm @ 2002-08-09 15:36 UTC (permalink / raw) Cc: rm, Rob Browning, Dale P. Smith, guile-devel On Thu, Aug 08, 2002 at 10:28:08PM +0100, Neil Jerram wrote: > > Right now I'm afraid I don't follow the structure of your > extension(s), but it certainly sounds to me like you ought to be able > to achieve what you are trying to. Well, my extension isn't -- it's an application (Apache in this special case, but i think the problem is a general one). > Could you describe the structure in more detail, in terms of code > modules (C and Scheme), libraries, how things get loaded and > configured, etc.? Apache (the application) loads mod_guile (an apache module). mod_guile registers some callback functions with apache. Apache then calls theses functions whenever it thinks that a certain part of a request (authrntication, authorization, URL-rewrite, content delivery etc.) should be handled by guile (as can be customized in apaches configuration file). mod_guile then calls the function that is supposed to handle this part of a request (again, the module and name of the function can be specified in the server configuration files). To ba able to do something usefull, these functions need to be able to access the data structures of the server/request. Each hander function is passed a request-record structure (a SMOB arround apaches 'real' datastructure) as a parameter - this structure has fields that point to the server and connection record structures as well. Since all of these structures have quite a lot of fields we end up with a lot of functions (getters/setters). All of these functions are defined in mod_guile but of course should go into separate guile modules. Right now (as you can see, i got it working ;-) the following modules are defined: (apache request), (apache server), (apache connection), (apache tables), (mod-guile utils). Ralf Mattes _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-09 15:36 ` rm @ 2002-08-17 11:59 ` Neil Jerram 2002-08-19 19:05 ` rm 0 siblings, 1 reply; 26+ messages in thread From: Neil Jerram @ 2002-08-17 11:59 UTC (permalink / raw) Cc: Rob Browning, Dale P. Smith, guile-devel >>>>> "rm" == rm <rm@fabula.de> writes: rm> Apache (the application) loads mod_guile (an apache module). mod_guile rm> registers some callback functions with apache. Apache then calls theses rm> functions whenever it thinks that a certain part of a request (authrntication, rm> authorization, URL-rewrite, content delivery etc.) should be handled by rm> guile (as can be customized in apaches configuration file). mod_guile then rm> calls the function that is supposed to handle this part of a request rm> (again, the module and name of the function can be specified in the server rm> configuration files). To ba able to do something usefull, these functions rm> need to be able to access the data structures of the server/request. rm> Each hander function is passed a request-record structure (a SMOB arround rm> apaches 'real' datastructure) as a parameter - this structure has fields rm> that point to the server and connection record structures as well. rm> Since all of these structures have quite a lot of fields we end up with rm> a lot of functions (getters/setters). All of these functions are defined rm> in mod_guile but of course should go into separate guile modules. Right rm> now (as you can see, i got it working ;-) the following modules are rm> defined: (apache request), (apache server), (apache connection), rm> (apache tables), (mod-guile utils). OK, so the idea is: HTTP request for some URL ---> mapped by Apache config file to generic mod_guile handler, with parameters indicating the module in which the appropriate handler proc lives, and perhaps the proc name as well (?) mod_guile handler uses the module and calls the handler proc from that module (how do you handle handler procs with the same name in different modules? perhaps by not actually importing them) Now we're into Scheme code, that has a SMOB in its hand and wants to use the utility functions defined in (apache request) etc. to play with it, which it does using use-module in the usual way. And the problem was: how do you export the C definitions for (apache request) etc. into their respective modules? I presume that Marius's docs for the C module API have given you one answer, using scm_c_define, scm_c_with_module etc. Another possibility would be to write a C function per module to register its definitions as Guile primitives: void mg_register_apache_request_primitives () { scm_c_define_gsubr (...); ... } Then at the top of apache/request.scm, you can call this using either load-extension or the dynamic-* functions: (define-module (apache request) ...) (load-extension "libmg" "mg_register_apache_request_primitives") Does this cover everything, and would you mind if I reworked this into another example for the manual? Regards, Neil _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-17 11:59 ` Neil Jerram @ 2002-08-19 19:05 ` rm 0 siblings, 0 replies; 26+ messages in thread From: rm @ 2002-08-19 19:05 UTC (permalink / raw) Cc: rm, Rob Browning, Dale P. Smith, guile-devel On Sat, Aug 17, 2002 at 12:59:47PM +0100, Neil Jerram wrote: > OK, so the idea is: > > HTTP request for some URL ---> > mapped by Apache config file to generic mod_guile handler, > with parameters indicating the module in which the appropriate > handler proc lives, and perhaps the proc name as well (?) Yes, indeed. On can 'map' a request URL to an module/handler: | <Location /blub> | ... | GuileSetHandler (foo bar) | </Location> or with an optional handler name: | GuileSetHanlder ((foo bar) . my-handler) > mod_guile handler uses the module and calls the handler proc from that > module (how do you handle handler procs with the same name in > different modules? perhaps by not actually importing them) Correct, i don't import the modules, i just use them as namespace compartments. > Now we're into Scheme code, that has a SMOB in its hand and wants to > use the utility functions defined in (apache request) etc. to play > with it, which it does using use-module in the usual way. > > And the problem was: how do you export the C definitions for (apache > request) etc. into their respective modules? > > I presume that Marius's docs for the C module API have given you one > answer, using scm_c_define, scm_c_with_module etc. Another > possibility would be to write a C function per module to register its > definitions as Guile primitives: > > void mg_register_apache_request_primitives () > { > scm_c_define_gsubr (...); > ... > } This is how i do it currently. An init function per functional unit/module. > > Then at the top of apache/request.scm, you can call this using either > load-extension or the dynamic-* functions: > > (define-module (apache request) > ...) > > (load-extension "libmg" "mg_register_apache_request_primitives") Currently i pass these init functions to 'scm_c_define_module', but that's probably equivalent to your solution. > Does this cover everything, and would you mind if I reworked this into > another example for the manual? Sounds fine to me. As soon as i get space on a server i'll put the code online (together with some samples ;-) Ralf > Regards, > Neil > _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-08 16:19 ` rm ` (2 preceding siblings ...) 2002-08-08 21:28 ` Neil Jerram @ 2002-08-09 8:47 ` Matthias Koeppe 2002-08-09 10:00 ` rm 3 siblings, 1 reply; 26+ messages in thread From: Matthias Koeppe @ 2002-08-09 8:47 UTC (permalink / raw) Cc: Rob Browning, Dale P. Smith, guile-devel rm@fabula.de writes: > On Thu, Aug 08, 2002 at 09:31:51AM -0500, Rob Browning wrote: >> "Dale P. Smith" <dsmith@altustech.com> writes: >> >> > The new method is to use a .scm file that defines the module, >> > dynamically loads the compiled code, and then exports whatever you >> > need. >> >> Right. >> >> (define-module (foo bar)) >> (load-extension "libguile-foo-bar-v-1" "init_guile_foo_bar-v-1") >> (export foo-1) >> (export foo-2) >> (export bar-1) >> ... > > I think there's a misunderstanding/misconception here (or, better: > in guile's current C api). The 'load-c-functions-through-scheme' > aproach might be fine and all that's needed as long as we only want > to extend _guile_ (the application) with external libs. But guile > is inteded to be an embedded srcipting language as well (at least that's > what the documentation says). If i want my users to be able to script > some of my applications functionality there's no library i can load > with 'load-extension' -- of course i could put the tiny scm_* wrapper > functions into a dll and have _that_ loaded, but i wouldn't call this > good design practise (oh, i could 'load-extension' my own application > instead, but that's not really portable ...). Having to provide (and > deploy!) scm file(s) just to be able to put my functions into different > modules feels clumsy. Indeed. I just want to point out that there was a similar discussion back in May 2001 ("On the deprecated auto-loading of compiled-code modules"). See http://mail.gnu.org/pipermail/guile-devel/2001-May/thread.html#1922 Back then, I had complained that I could no longer do module business from C after scm_register_module_xxx became deprecated. After some discussion, Marius wrote (http://mail.gnu.org/pipermail/guile-devel/2001-May/002171.html): # Ok. It's "Drastic Measures Time". [Thinking as I type...] People # should be able to handle modules from C, in a way mostly similar to # how they do it from Scheme. We don't want to guarantee the lower # level module operations to be stable, but the higher level ones should # be OK for quite some time (even when we get a totally new module # system, I hope that we can find a way to integrate the higher level # features in a backward compatible way). He proposed and implemented a C API for defining modules and exporting symbols, see http://mail.gnu.org/pipermail/guile-devel/2001-May/002171.html I use this API in the Guile back-end of SWIG (http://www.swig.org). The functions are also mentioned in the NEWS file of Guile (changes after release 1.4). The API is also used in examples/box-module/box.c. I believe it's only an accident that the functions are not documented (except for the NEWS blurb). I think documentation should be added; the changes should also go into the 1.6 release. Preliminary documentation can be found in the above message by Marius. Regards, -- Matthias Köppe -- http://www.math.uni-magdeburg.de/~mkoeppe _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-09 8:47 ` Matthias Koeppe @ 2002-08-09 10:00 ` rm 2002-08-09 11:29 ` Matthias Koeppe 2002-08-10 14:44 ` Marius Vollmer 0 siblings, 2 replies; 26+ messages in thread From: rm @ 2002-08-09 10:00 UTC (permalink / raw) Cc: rm, Rob Browning, Dale P. Smith, guile-devel On Fri, Aug 09, 2002 at 10:47:50AM +0200, Matthias Koeppe wrote: > [...] > > He proposed and implemented a C API for defining modules and exporting > symbols, see > > http://mail.gnu.org/pipermail/guile-devel/2001-May/002171.html > > I use this API in the Guile back-end of SWIG (http://www.swig.org). > The functions are also mentioned in the NEWS file of Guile (changes > after release 1.4). The API is also used in > examples/box-module/box.c. Ah, thank's a lot, the "missing files". I remembered the discussion but forgot that Marius _did_ post a description of the new interface. Marius, just one more question: it looks like the signature of scm_c_define_module changed slightly since your mail back last may: scm_c_define_module (const char *name, void (*init)(void *), void *data) - what is the purpose of 'void *data' ? - what is passed to the init function in the void pointer and what is the function supposed to return? > > I believe it's only an accident that the functions are not documented > (except for the NEWS blurb). I think documentation should be added; > the changes should also go into the 1.6 release. Preliminary > documentation can be found in the above message by Marius. Should this be documented soon? Ralf _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-09 10:00 ` rm @ 2002-08-09 11:29 ` Matthias Koeppe 2002-08-09 13:23 ` rm 2002-08-10 14:44 ` Marius Vollmer 1 sibling, 1 reply; 26+ messages in thread From: Matthias Koeppe @ 2002-08-09 11:29 UTC (permalink / raw) Cc: Rob Browning, Dale P. Smith, guile-devel rm@fabula.de writes: > On Fri, Aug 09, 2002 at 10:47:50AM +0200, Matthias Koeppe wrote: >> [...] >> >> He proposed and implemented a C API for defining modules and exporting >> symbols, see >> >> http://mail.gnu.org/pipermail/guile-devel/2001-May/002171.html >> >> I use this API in the Guile back-end of SWIG (http://www.swig.org). >> The functions are also mentioned in the NEWS file of Guile (changes >> after release 1.4). The API is also used in >> examples/box-module/box.c. > > Ah, thank's a lot, the "missing files". I remembered the discussion > but forgot that Marius _did_ post a description of the new interface. > Marius, just one more question: it looks like the signature of > scm_c_define_module changed slightly since your mail back last may: > > scm_c_define_module (const char *name, > void (*init)(void *), void *data) > > - what is the purpose of 'void *data' ? It is an opaque argument... > - what is passed to the init function in the void pointer and > what is the function supposed to return? ... that is simply passed to the init function when it is invoked. (This makes the init function a "C closure".) The init function returns nothing (it has "void" return type). >> I believe it's only an accident that the functions are not documented >> (except for the NEWS blurb). I think documentation should be added; >> the changes should also go into the 1.6 release. Preliminary >> documentation can be found in the above message by Marius. > > Should this be documented soon? Ralf, maybe you want to prepare a patch that adds the documentation to Guile. Regards, -- Matthias Köppe -- http://www.math.uni-magdeburg.de/~mkoeppe _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-09 11:29 ` Matthias Koeppe @ 2002-08-09 13:23 ` rm 0 siblings, 0 replies; 26+ messages in thread From: rm @ 2002-08-09 13:23 UTC (permalink / raw) Cc: rm, Rob Browning, Dale P. Smith, guile-devel On Fri, Aug 09, 2002 at 01:29:09PM +0200, Matthias Koeppe wrote: > > It is an opaque argument... > > > - what is passed to the init function in the void pointer and > > what is the function supposed to return? > > ... that is simply passed to the init function when it is invoked. So this is "userdata", i see. > (This makes the init function a "C closure".) The init function > returns nothing (it has "void" return type). <blush>Grumpf! I _hate_ C's function pointer syntax ... </blush> > >> I believe it's only an accident that the functions are not documented > >> (except for the NEWS blurb). I think documentation should be added; > >> the changes should also go into the 1.6 release. Preliminary > >> documentation can be found in the above message by Marius. > > > > Should this be documented soon? > > Ralf, maybe you want to prepare a patch that adds the documentation to > Guile. This was partly implied by my question. But i first need to finish up the docs on "guardians from C" i promised earlier this week (got dis- tracted by all that module stuff which i need to get working asap). Ralf _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-09 10:00 ` rm 2002-08-09 11:29 ` Matthias Koeppe @ 2002-08-10 14:44 ` Marius Vollmer 2002-08-11 23:20 ` Marius Vollmer 2002-08-13 0:40 ` Marius Vollmer 1 sibling, 2 replies; 26+ messages in thread From: Marius Vollmer @ 2002-08-10 14:44 UTC (permalink / raw) Cc: Matthias Koeppe, Rob Browning, Dale P. Smith, guile-devel rm@fabula.de writes: > Should this be documented soon? Will do. -- GPG: D5D4E405 - 2F9B BCCC 8527 692A 04E3 331E FAF8 226A D5D4 E405 _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-10 14:44 ` Marius Vollmer @ 2002-08-11 23:20 ` Marius Vollmer 2002-08-17 8:09 ` Dirk Herrmann 2002-08-13 0:40 ` Marius Vollmer 1 sibling, 1 reply; 26+ messages in thread From: Marius Vollmer @ 2002-08-11 23:20 UTC (permalink / raw) Marius Vollmer <mvo@zagadka.ping.de> writes: > rm@fabula.de writes: > > > Should this be documented soon? > > Will do. Ok, I started but I got distracted into writing don yet another module system proposal. Please have a look. It is not finished, but I think one can already see where it is heading. It is based on scheme-modules.texi. @node The Guile module system @section The Guile module system The Guile module system extends the concept of environments, discussed in the previous section, with mechanisms to define, use and customise sets of bindings. In 1996 Tom Lord implemented a full-featured module system for Guile which allows loading Scheme source files into a private name space. This system has been in available since at least Guile version 1.1. For Guile version 1.6.0 and later, the system has been improved to have better integration from C code, more fine-grained user control over interfaces, and documentation. Although it is anticipated that the module system implementation will change in the future, the Scheme programming interface described in this manual should be considered stable. The C programming interface is considered relatively stable, although at the time of this writing, there is still some flux. The following sections will explain the Guile module system in detail, from an interactive point of view. That is, the behavior of the module system is defined in terms of run-time data structures and the operations on them. The operations include the high-level ones like @code{define-module} that are used more like declarative statements as well as lower level operations like @code{module-lookup}. @c fixme: Review: Need better C code interface commentary. @menu * Finding Modules:: How modules are found. * General Information about Modules:: Guile module basics. * Using Guile Modules:: How to use existing modules. * Creating Guile Modules:: How to package your code into modules. * More Module Procedures:: Low-level module code. * Module System Quirks:: Strange things to be aware of. * Included Guile Modules:: Which modules come with Guile? @end menu @node Finding Modules @subsection Finding Modules A Guile module is a data structure with the features described in the following sections. You can work directly with the data structure in your programs, but normally you refer to them indirectly via the familiar hierachical names like @code{(ice-9 popen)}. There is a global mapping from names to module objects. You can manipulate this mapping with the settable function @code{find-module}. You can find the name of a module with the function @code{module-name}. Normally, modules are created as a side-effect of loading and executing a file. The file might contain a @code{define-module} that will install a new module, or it might not. Thus, files and modules are only loosely coupled. However, there is a convention that maps module names to file names and this convention allows Guile to automatically load and execute a file when a certain module is requested but has not been registered yet. The function @code{load-module} implements this mapping and @code{resolve-module} is an extended version of @code{find-module} that uses @code{load-module} for missing modules. Thus, @code{resolve-module} is the most common function to use when looking for a module. @deffn Procedure find-module name @deffnx Setter (set! (find-module name) module) The procedure @code{find-module} returns the module that has most recently been registered with the name @var{NAME}. When no module has been registered under @var{NAME}, return @code{#f}. Note that @code{find-module} will not automatically load modules. Use @code{resolve-module} or @code{load-module} for that. Setting this procedure will register @var{module} under the name @var{name}. When @var{module} is @code{#f}, any registration for @var{name} is removed. A @var{name} must be a list of symbols like @code{(ice-9 popen)}. When a module is registered, the name is remembered in it so that @code{module-name} can return it. When a module is removed from the global mapping (because it is replaced by another module or by @code{#f}), its remembered name is not changed. @end deffn @deffn Procedure module-name module @deffnx Setter (set! (module-name module) name) Return the remembered name of @var{module}. This is not necessarily the name that can be used to find this module with @code{find-module}. See @code{find-module} for details. The initial name of a module is @code{#f}. Setting this procedure will change the remembered name. It will not change the global mapping that is consulted by @code{find-module}. The remembered name of a module is mostly intended for debugging purposes. @end deffn @deffn Procedure load-module name Load the file that is supposed to define the module named by @var{name}, a list of symbols. The name of the file to load is constructed by concatenating the name elements with slashes between the elements and appending a number of file name extensions from the list @code{%load-extensions} (@pxref{Loading}). The resulting file name is then searched in all directories in the variable @code{%load-path} (@pxref{Install Config}). For example, the @code{(ice-9 popen)} module would result in the filename @code{ice-9/popen.scm} and searched in the installation directories of Guile and in all other directories in the load path. The first file that is found by the above procedure is loaded. When no file is found, signal an error. After the the file is loaded, the result of @code{(find-module @var{name})} is returned when it is non-@code{#f}. Else signal an error. @end deffn @deffn Procedure resolve-module name Find the module named @var{name}, loading it via @code{load-module} when it is not yet registered. When the module can not be found, signal an error. @end deffn @node General Information about Modules @subsection General Information about Modules A Guile module can be thought of as a collection of named variables and macros. More precisely, it is a mapping of symbols (names) to Scheme objects. Such an association of a symbol with an object is also called a @dfn{binding}, and one says that the symbol is @dfn{bound} to the object in a specific module. Symbols can only be bound to two kinds of objects: variables or macro transformers. This is a crucial point; when you evaluate @code{(define foo 12)} in a module, then the symbol @code{foo} is not bound directly to @code{12}. Rather, @code{foo} is bound to a variable (@pxref{Variables}) and the value of that variable is set to the value @code{12}. Likewise, when you define a macro, the symbol is bound to a macro transformer object instead of to a variable. (Actually, Guile wont do the latter currently, but will do so in the next release.) @c I think the following paragraph is confusing here, especially @c given that there are objects called ``envrionments'' in Guile @c that are really modules. - mvo @c @c An environment is a mapping from identifiers (or symbols) to @c locations, i.e., a set of bindings. There are top-level environments @c and lexical environments. Environment in which a lambda is excuted is @c remembered as part of its definition. You can only add to the set of bindings of a module, you can not remove bindings. Also, you can only have a single binding for each symbol in the set. As a consequence, once you have added a local or imported binding to a module, it can not be changed. Attempting to bind a symbol to the same object that it is already bound to is silently ignored. These rules ensure that a module can only evolve in a simple manner. Once you have looked up a binding in a module, you can be sure that it remains valid and that all lookups with the same symbol in a module will return the same binding. When you need to make changes to a module that are not allowed by these rules, you must abandon the old module and create a new one. Modules that use the old module in some way need to be reconstructed as well, and so on. See @pref{FIXME} for more information about this. When Guile executes or compiles some code, it does this always in the context of a module. That module is called the @dfn{current module}. Set settable procedure @code{current-module} can be used to access the current module. The global identifiers of the executed or compiled code are looked up by finding the object that is bound to the identifier symbol in the current module. In certain contexts, the object must be a variable so that it can be referenced or set, in others, it is also allowed to be a macro transformer which is then used to expand the evaluated form. Execution of a @code{define} form can add a new variable binding to the current module. When the symbol in the @code{define} form is already bound to a variable, the binding itself is not changed, only the value of the variable. When the symbol is bound but not to a variable, an error is signalled. Execution of @code{define-macro} works similar, but for macro transformers instead of variables. To access bindings from another module, the desired bindings are simply copied into the accessing module. There are several ways to select which bindings to copy exactly and how to transform the symbols on the way. Ultimately, however, imported bindings are added just like local bindings. You can access all bindings in a module; there are no strictly private bindings that you are prohibited from accessing. However, each module has a list of @dfn{exported symbols} that it offers as its public interface. Usually, one just imports the bindings belonging to the exported symbols. You can add to the list of exported symbols with an @code{export} statement. Symbols can be removed with @code{unexport}. Changes to the list of exported symbols have no immediate consequences in other modules, however. The list is only consulted at the time of importing, if at all. @node Using Guile Modules @subsection Using Guile Modules Accessing bindings from another module is called @dfn{using} that module. On a low level, it consists of determining which bindings to access by building a list of symbols that name these bindings in the accessed module, and building another list of symbols that determine for each binding under which name it should be recorded in the accessing module. The procedure @code{module-import} can then be used to add the new bindings to the accessing module. After the bindings have been added to the module, all memory is lost about where they came from. A common way of using a module is to just import all exported bindings with their original names. This, and also more sophisticated arrangements, can be conveniently expressed with a @code{use-modules} statement. Executing a @code{use-modules} statement may include locating and loading code for a given module if that code has not yet been loaded. An @dfn{interface specification} in a @code{use-modules} statement has one of two forms. The first variation is simply to name the module, in which case its exported bindings are imported with their original names. For example: @smalllisp (use-modules (ice-9 popen)) @end smalllisp Here, the interface specification is @code{(ice-9 popen)}, and the result is that the current module now has access to @code{open-pipe}, @code{close-pipe}, @code{open-input-pipe}, and so on (@pxref{Included Guile Modules}). Note in the previous example that if the current module had already defined @code{open-pipe}, adding the binding from @code{(ice-9 popen)} would have resulted in an error. For this reason (and others), there is a second variation of interface specification that not only names a module to be accessed, but also selects bindings from it and renames them to suit the current module's needs. For example: @smalllisp (use-modules ((ice-9 popen) :select ((open-pipe . pipe-open) close-pipe) :renamer (symbol-prefix-proc 'unixy:))) @end smalllisp Here, the interface specification is more complex than before, and the result is that a custom interface with only two bindings is created and subsequently accessed by the current module. The mapping of old to new names is as follows: @c Use `smallexample' since `table' is ugly. --ttn @smallexample (ice-9 popen) sees: current module sees: open-pipe unixy:pipe-open close-pipe unixy:close-pipe @end smallexample This example also shows how to use the convenience procedure @code{symbol-prefix-proc}. @c begin (scm-doc-string "boot-9.scm" "symbol-prefix-proc") @deffn {Scheme Procedure} symbol-prefix-proc prefix-sym Return a procedure that prefixes its arg (a symbol) with @var{prefix-sym}. @c Insert gratuitous C++ slam here. --ttn @end deffn @c begin (scm-doc-string "boot-9.scm" "use-modules") @deffn syntax use-modules spec @dots{} Resolve each interface specification @var{spec} into a set of bindings and add them to the current module. The return value is unspecified. The first variant of @var{spec} is just @smalllisp MODULE-NAME @end smalllisp where @var{module-name} is a list of symbols that names a module whose exported bindings are added to the current module with their original names. The module named by @var{module-name} is loaded as with @code{resolve-module} when it has not been registered already. The second variant of @var{spec} is @smalllisp (MODULE-NAME [:select SELECTION] [:renamer RENAMER]) @end smalllisp As before, @var{module-name} is a list of symbols that is used to find the module that is to be accessed. The optional @var{selection} parameter is a list of selection-specs and the optional @var{renamer} is a procedure that takes a symbol and returns a new one that should be used in its place as the name of a binding. A selection-spec is either a symbol or a pair of symbols @code{(ORIG . SEEN)}, where @var{orig} is the name in the accessed module and @var{seen} is the name in the accessing module. The symbol @var{seen} is also passed through @var{renamer}. When @code{selection} is omitted, it defaults to the list of exported symbols of @var{module-name}. When @code{rename} is omitted, it defaults to the identity function (i.e., the bindings are not renamed). Thus, when both are omitted, the effect is the same as with the first var{spec} form. A error is signalled when @var{module name} is not resolvable. @end deffn -- GPG: D5D4E405 - 2F9B BCCC 8527 692A 04E3 331E FAF8 226A D5D4 E405 _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-11 23:20 ` Marius Vollmer @ 2002-08-17 8:09 ` Dirk Herrmann 2002-08-17 11:05 ` Neil Jerram 2002-08-21 19:35 ` Marius Vollmer 0 siblings, 2 replies; 26+ messages in thread From: Dirk Herrmann @ 2002-08-17 8:09 UTC (permalink / raw) Cc: guile-devel Hi, I have some comments and questions regarding the text. On 12 Aug 2002, Marius Vollmer wrote: > A Guile module is a data structure with the features described in the > following sections. You can work directly with the data structure in > your programs, but normally you refer to them indirectly via the > familiar hierachical names like @code{(ice-9 popen)}. I think it would be helpfull to explain that there is no relationship between modules named (a b) and (a b c). People might assume that there is some subset/superset relationship. Especially since I remember that once there was such a concept in guile. > @deffn Procedure find-module name > @deffnx Setter (set! (find-module name) module) > The procedure @code{find-module} returns the module that has most > recently been registered with the name @var{NAME}. When no module has > been registered under @var{NAME}, return @code{#f}. I'd find it clearer when registering a module would be done using a function 'register-module' instead of using a setter. And, the possibility to register a module implies that people can create modules dynamically. But, there are no functions described to create modules dynamically. > @c I think the following paragraph is confusing here, especially > @c given that there are objects called ``envrionments'' in Guile > @c that are really modules. - mvo Yes, we should attempt to be cleaner with our names. Environments should be used for lexical environments. I also don't like the name 'variable' since it rather names a location than a variable. 'Location', on the other hand, is also not quite accurate, since local variables are also stored in locations, but for these there are no variables. At least we should not use names used in R5RS to name concepts which are not exactly the same. > @c An environment is a mapping from identifiers (or symbols) to > @c locations, i.e., a set of bindings. There are top-level environments > @c and lexical environments. Environment in which a lambda is excuted is > @c remembered as part of its definition. What is the relationship between modules and top-level environments then? > You can only add to the set of bindings of a module, you can not > remove bindings. Also, you can only have a single binding for each > symbol in the set. As a consequence, once you have added a local or > imported binding to a module, it can not be changed. Attempting to > bind a symbol to the same object that it is already bound to is > silently ignored. With respect to modules this means that there is no undelete. Good. And, if this also applies to top-level environments, then memoization of variable locations can be used. > These rules ensure that a module can only evolve in a simple manner. > Once you have looked up a binding in a module, you can be sure that it > remains valid and that all lookups with the same symbol in a module > will return the same binding. When you need to make changes to a > module that are not allowed by these rules, you must abandon the old > module and create a new one. Modules that use the old module in some > way need to be reconstructed as well, and so on. See @pref{FIXME} for > more information about this. Hmmm. This needs to be clarified, especially with respect to memoized code. > When Guile executes or compiles some code, it does this always in the > context of a module. That module is called the @dfn{current module}. > Set settable procedure @code{current-module} can be used to access the > current module. The global identifiers of the executed or compiled > code are looked up by finding the object that is bound to the > identifier symbol in the current module. In certain contexts, the > object must be a variable so that it can be referenced or set, in > others, it is also allowed to be a macro transformer which is then used > to expand the evaluated form. I think this paragraph is incorrect: Only when guile executes some top-level expressions the lookups are done in the current module. In other words, while executing a top-level expression, the current-module corresponds to the top-level environment of that expression. When a closure is created, is closes over the current top-level environment. As soon as a closure is executed, it is executed in the context of the module that corresponded to the top-level environment at the creation of the closure. > Execution of a @code{define} form can add a new variable binding to > the current module. When the symbol in the @code{define} form is > already bound to a variable, the binding itself is not changed, only > the value of the variable. When the symbol is bound but not to a > variable, an error is signalled. Maybe some clarification would be helpfull: There are also internal defines, which are not meant here. > To access bindings from another module, the desired bindings are > simply copied into the accessing module. There are several ways to > select which bindings to copy exactly and how to transform the symbols > on the way. Ultimately, however, imported bindings are added just > like local bindings. That means, modifying a value at the location of a binding will also modify the value for the source module. > Note in the previous example that if the current module had already > defined @code{open-pipe}, adding the binding from @code{(ice-9 popen)} > would have resulted in an error. For this reason (and others), there > is a second variation of interface specification that not only names a > module to be accessed, but also selects bindings from it and renames > them to suit the current module's needs. For example: Ahh. Conflicting imports will result in errors. But: What happens if an imported binding is overwritten by 'define' in the current module? According to R5RS, in such a case 'define' becomes 'set!'. And this would influence the source module of the definition. Hmmm. > The second variant of @var{spec} is > > @smalllisp > (MODULE-NAME [:select SELECTION] [:renamer RENAMER]) > @end smalllisp Can one use the same module several times, every time specifying some different SELECTION and RENAMER? Can the same variable be imported several times under different names? Best regards, Dirk _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-17 8:09 ` Dirk Herrmann @ 2002-08-17 11:05 ` Neil Jerram 2002-08-24 8:08 ` Dirk Herrmann 2002-08-21 19:35 ` Marius Vollmer 1 sibling, 1 reply; 26+ messages in thread From: Neil Jerram @ 2002-08-17 11:05 UTC (permalink / raw) Cc: Marius Vollmer, guile-devel >>>>> "Dirk" == Dirk Herrmann <dirk@sallust.ida.ing.tu-bs.de> writes: Dirk> On 12 Aug 2002, Marius Vollmer wrote: >> A Guile module is a data structure with the features described in the >> following sections. You can work directly with the data structure in >> your programs, but normally you refer to them indirectly via the >> familiar hierachical names like @code{(ice-9 popen)}. Dirk> I think it would be helpfull to explain that there is no relationship Dirk> between modules named (a b) and (a b c). People might assume that there Dirk> is some subset/superset relationship. Especially since I remember that Dirk> once there was such a concept in guile. There still is. In this case, and assuming that both modules have been loaded, there is a variable named `c' in (a b) whose value is the module (a b c). Neil _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-17 11:05 ` Neil Jerram @ 2002-08-24 8:08 ` Dirk Herrmann 2002-08-26 21:45 ` Neil Jerram 2002-08-26 22:04 ` Marius Vollmer 0 siblings, 2 replies; 26+ messages in thread From: Dirk Herrmann @ 2002-08-24 8:08 UTC (permalink / raw) Cc: Marius Vollmer, guile-devel On 17 Aug 2002, Neil Jerram wrote: > >>>>> "Dirk" == Dirk Herrmann <dirk@sallust.ida.ing.tu-bs.de> writes: > > Dirk> On 12 Aug 2002, Marius Vollmer wrote: > > >> A Guile module is a data structure with the features described in the > >> following sections. You can work directly with the data structure in > >> your programs, but normally you refer to them indirectly via the > >> familiar hierachical names like @code{(ice-9 popen)}. > > Dirk> I think it would be helpfull to explain that there is no relationship > Dirk> between modules named (a b) and (a b c). People might assume that there > Dirk> is some subset/superset relationship. Especially since I remember that > Dirk> once there was such a concept in guile. > > There still is. In this case, and assuming that both modules have > been loaded, there is a variable named `c' in (a b) whose value is the > module (a b c). Is this just historical cruft? Best regards, Dirk _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-24 8:08 ` Dirk Herrmann @ 2002-08-26 21:45 ` Neil Jerram 2002-08-26 22:04 ` Marius Vollmer 1 sibling, 0 replies; 26+ messages in thread From: Neil Jerram @ 2002-08-26 21:45 UTC (permalink / raw) Cc: Marius Vollmer, guile-devel >>>>> "Dirk" == Dirk Herrmann <dirk@sallust.ida.ing.tu-bs.de> writes: >> There still is. In this case, and assuming that both modules have >> been loaded, there is a variable named `c' in (a b) whose value is the >> module (a b c). Dirk> Is this just historical cruft? AFAIK, it's a corollary of the current module implementation that would be ugly to try to hide. But I don't believe it's documented as a feature anywhere, and I think it should be possible for a new implementation of Guile's module system to avoid this property. Marius can probably be a lot more precise ... Neil _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-24 8:08 ` Dirk Herrmann 2002-08-26 21:45 ` Neil Jerram @ 2002-08-26 22:04 ` Marius Vollmer 1 sibling, 0 replies; 26+ messages in thread From: Marius Vollmer @ 2002-08-26 22:04 UTC (permalink / raw) Cc: Neil Jerram, guile-devel Dirk Herrmann <dirk@sallust.ida.ing.tu-bs.de> writes: > > There still is. In this case, and assuming that both modules have > > been loaded, there is a variable named `c' in (a b) whose value is the > > module (a b c). > > Is this just historical cruft? I would say so. -- GPG: D5D4E405 - 2F9B BCCC 8527 692A 04E3 331E FAF8 226A D5D4 E405 _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-17 8:09 ` Dirk Herrmann 2002-08-17 11:05 ` Neil Jerram @ 2002-08-21 19:35 ` Marius Vollmer 1 sibling, 0 replies; 26+ messages in thread From: Marius Vollmer @ 2002-08-21 19:35 UTC (permalink / raw) Cc: guile-devel Dirk Herrmann <dirk@sallust.ida.ing.tu-bs.de> writes: > I think it would be helpfull to explain that there is no relationship > between modules named (a b) and (a b c). Yes. > > @deffn Procedure find-module name > > @deffnx Setter (set! (find-module name) module) > > The procedure @code{find-module} returns the module that has most > > recently been registered with the name @var{NAME}. When no module has > > been registered under @var{NAME}, return @code{#f}. > > I'd find it clearer when registering a module would be done using a > function 'register-module' instead of using a setter. Hmm, I was experimenting with the way Common Lisp does it. They have 'find-class' that is also a setter for registering classes. I don't know yet whether I like it or not. The text that I posted is not a serious proposal, only some loose ideas. > > @c An environment is a mapping from identifiers (or symbols) to > > @c locations, i.e., a set of bindings. There are top-level environments > > @c and lexical environments. Environment in which a lambda is excuted is > > @c remembered as part of its definition. > > What is the relationship between modules and top-level environments then? They are identical. (Are they?) > > You can only add to the set of bindings of a module, you can not > > remove bindings. Also, you can only have a single binding for > > each symbol in the set. As a consequence, once you have added a > > local or imported binding to a module, it can not be changed. > > Attempting to bind a symbol to the same object that it is already > > bound to is silently ignored. > > With respect to modules this means that there is no undelete. Good. And, > if this also applies to top-level environments, then memoization of > variable locations can be used. > > > These rules ensure that a module can only evolve in a simple manner. > > Once you have looked up a binding in a module, you can be sure that it > > remains valid and that all lookups with the same symbol in a module > > will return the same binding. When you need to make changes to a > > module that are not allowed by these rules, you must abandon the old > > module and create a new one. Modules that use the old module in some > > way need to be reconstructed as well, and so on. See @pref{FIXME} for > > more information about this. > > Hmmm. This needs to be clarified, especially with respect to memoized > code. Yes, this is actually the big point. > > When Guile executes or compiles some code, it does this always in the > > context of a module. That module is called the @dfn{current module}. > > Set settable procedure @code{current-module} can be used to access the > > current module. The global identifiers of the executed or compiled > > code are looked up by finding the object that is bound to the > > identifier symbol in the current module. In certain contexts, the > > object must be a variable so that it can be referenced or set, in > > others, it is also allowed to be a macro transformer which is then used > > to expand the evaluated form. > > I think this paragraph is incorrect: Only when guile executes some > top-level expressions the lookups are done in the current module. Yes, exactly. I was only thinking about top-level forms, but haven't said so explicitely. > > To access bindings from another module, the desired bindings are > > simply copied into the accessing module. There are several ways to > > select which bindings to copy exactly and how to transform the symbols > > on the way. Ultimately, however, imported bindings are added just > > like local bindings. > > That means, modifying a value at the location of a binding will also > modify the value for the source module. Ahh, good point. I don't think we want to allow this. That is, 'define' will only reuse local bindings and will complain about existing imported bindings. I had hoped that the distinction between local and imported bindings doesn't need to be made... > Ahh. Conflicting imports will result in errors. But: What happens if an > imported binding is overwritten by 'define' in the current module? > According to R5RS, in such a case 'define' becomes 'set!'. And this would > influence the source module of the definition. Hmmm. Yes, no good. > Can one use the same module several times, every time specifying > some different SELECTION and RENAMER? Can the same variable be > imported several times under different names? Yes, that is the intention, but I haven't thought about the consequences. Thanks for your comments! -- GPG: D5D4E405 - 2F9B BCCC 8527 692A 04E3 331E FAF8 226A D5D4 E405 _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-10 14:44 ` Marius Vollmer 2002-08-11 23:20 ` Marius Vollmer @ 2002-08-13 0:40 ` Marius Vollmer 2002-08-17 22:37 ` Dale P. Smith 1 sibling, 1 reply; 26+ messages in thread From: Marius Vollmer @ 2002-08-13 0:40 UTC (permalink / raw) Cc: Matthias Koeppe, Rob Browning, Dale P. Smith, guile-devel Marius Vollmer <mvo@zagadka.ping.de> writes: > rm@fabula.de writes: > > > Should this be documented soon? > > Will do. Done. Please have a look. (In CVS HEAD.) -- GPG: D5D4E405 - 2F9B BCCC 8527 692A 04E3 331E FAF8 226A D5D4 E405 _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: What replaces scm_register_module_xxx (Doc update?) 2002-08-13 0:40 ` Marius Vollmer @ 2002-08-17 22:37 ` Dale P. Smith 0 siblings, 0 replies; 26+ messages in thread From: Dale P. Smith @ 2002-08-17 22:37 UTC (permalink / raw) Cc: rm, mkoeppe, rlb, guile-devel On 13 Aug 2002 02:40:28 +0200 Marius Vollmer <mvo@zagadka.ping.de> wrote: > Marius Vollmer <mvo@zagadka.ping.de> writes: > > > rm@fabula.de writes: > > > > > Should this be documented soon? > > > > Will do. > > Done. Please have a look. (In CVS HEAD.) Looks good, but there should be @var{} around the actual names of the arguments, for example: @deftypefn {C Procedure} SCM scm_c_define_module (const char *name, void (*init) (void *), void *data) Should be: @deftypefn {C Procedure} SCM scm_c_define_module (const char *@var{name}, void (*@var{init}) (void *), void *@var{data}) I've found that you can force texinfo to do line breaks between arguments for long winded functions if you surround them with {}. @deftypefn {C Procedure} SCM scm_c_define_module ({const char *@var{name},} {void (*@var{init}) (void *),} {void *@var{data}}) -Dale -- Dale P. Smith Senior Systems Consultant, | Treasurer, Altus Technologies Corporation | Cleveland Linux Users Group dsmith@altustech.com | http://cleveland.lug.net 440-746-9000 x339 | _______________________________________________ Guile-devel mailing list Guile-devel@gnu.org http://mail.gnu.org/mailman/listinfo/guile-devel ^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2002-08-26 22:04 UTC | newest] Thread overview: 26+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2002-08-08 13:48 What replaces scm_register_module_xxx (Doc update?) rm 2002-08-08 14:21 ` Dale P. Smith 2002-08-08 14:23 ` Dale P. Smith 2002-08-08 14:31 ` Rob Browning 2002-08-08 16:19 ` rm 2002-08-08 17:59 ` Dale P. Smith 2002-08-08 18:24 ` rm 2002-08-08 20:26 ` Marius Vollmer 2002-08-08 21:28 ` Neil Jerram 2002-08-09 15:36 ` rm 2002-08-17 11:59 ` Neil Jerram 2002-08-19 19:05 ` rm 2002-08-09 8:47 ` Matthias Koeppe 2002-08-09 10:00 ` rm 2002-08-09 11:29 ` Matthias Koeppe 2002-08-09 13:23 ` rm 2002-08-10 14:44 ` Marius Vollmer 2002-08-11 23:20 ` Marius Vollmer 2002-08-17 8:09 ` Dirk Herrmann 2002-08-17 11:05 ` Neil Jerram 2002-08-24 8:08 ` Dirk Herrmann 2002-08-26 21:45 ` Neil Jerram 2002-08-26 22:04 ` Marius Vollmer 2002-08-21 19:35 ` Marius Vollmer 2002-08-13 0:40 ` Marius Vollmer 2002-08-17 22:37 ` Dale P. Smith
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).