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] |
>>>>> "C" == Clifford Beshers <beshers@ohanlon.mcl.cs.columbia.edu> writes:
C> I've used g-wrap before and like it for it's simplicity, but it
C> needs some beefing up. I find the features of ffi attractive
C> as well, though they aren't what I need at the moment.
C> So, I've decided to stick with g-wrap for the moment, modifying
C> it myself if necessary. I'd prefer that the entire community
C> benefitted, thought, and to that end I offer a few minor
C> comments. I expect I will have more soon.
Hi Cliff (and the rest of the Guile folks out there),
Thanks for your comments. G-Wrap has indeed not been updated for a
long time, and I am (too slowly--sorry!) updating it and testing it
right now, actually. "Beefing it up" should be very easy due to its
simplicity, so anyone should contribute their modifications if they
have useful ones.
C> The formats of `new-function', `new-type', and
C> `define-constant' seem somewhat inconsistent. I believe they
C> could be slightly modified in form to make them more consistent
C> with each other, more Scheme-like, and easier to remember.
This has been pointed-out to me before. I have been changing it, but
in the opposite direction than you suggest -- please tell me if you
have a strong preference either way:
C> First, I don't think these functions should be passed Scheme
C> symbols. Rather, they should return Scheme objects which are
C> associated with a symbol using the standard ``define'' and
C> ``set!'' forms. For example, the following:
C> (define-constant "VNULL" "NULL" VEC)
C> would become:
C> (define VNULL (gwrap-c-constant "NULL" VEC ))
I have looked at this, but I don't see a good reason to return an
object representing such a constant: it has no meaning in the context
of running the glue-code generation because the interpreter does not
understand "VEC" at this point, and because it is not needed as a
parameter-type specifier, as are the objects defined by
(new-type....). In fact, 'VNULL' is needed as a parameter to tell the
system what name to use in exporting the constant to the interpreter.
Based on input from A. Jaffrey, however, I presently had planned to
change the interface to
(define-constant <symbol> <c-string> <type>)
as in:
(define-constant 'VNULL "NULL" 'VEC) ;; null-vector
Note that this means that the <type> is now represented as a symbol
rather than as an object, and so is the symbol being defined.
This implies a couple things:
1) Now, defining types is done slightly differently (see bellow)
2) The glue-code generation will need to be done by the interpreter
which the code is being generated for.
+ This is due to the fact that the reader for Guile is not case
sensitive (by default), so it can distinguish 'VNULL and
'vnull, while SCM does not.
+ Note that this will allow G-Wrap to be used as a Guile module,
as I will be assuming that Guile will be running the code for
generating wrappers for Guile interpreters. This should allow
similar approaches when glue-code builders for other
interpreters are built (I am interested in writing a version
for Rscheme because its interpreter is so cool--it has a
byte-code interpreter, well-thought-out module system ;),
interesting macro system, persistent objects, true real-time
non-conservative GC, etc...).
C> Specifically, the naming conventions should reflect that the
C> function is part of g-wrap. Also, all function names should
C> make it clear what language is being ``wrapped,'' i.e.,
C> imported into Scheme. Hence the prefix ``g-wrap-c'' on all the
C> functions.
I do like the idea of using a more consistent naming convention for my
functions. I would be willing to use 'gwrap-c-' as a prefix to all
the function names if anyone else supports this. It would be
consistent (but more verbose). For now, how about `new-constant'
rather than `define-constant' for the declaration? This would make
the names new-constant, new-function, and new-type, which is pretty
consistent and easy to remember.
C> Similarly:
C> (new-function c-name scheme-name ret-type type-list
C> description)
C> would become:
C> (define scheme-name (gwrap-c-function c-name ret-type
C> type-list description))
Similarly (but oppositely to this suggestions) I intend to change this
to
(new-function <scheme-sym> <ret-type-sym> <c-name> <param-list> <descrition>)
e.g.:
(new-function 'eig-dsyev
'void "eig_dsyev" '((MAT A) (MAT Z) (VEC w))
"Calculates eigenvalues Z and eigenvalues w of real
symmetric matrix A")
- Again, the scheme name is a scheme-symbol, and the types are referred
to as symbols.
- Note that the second line reads much more like the original C-function
declaration (and an emacs macro could do a lot of the formatting by
default for this).
- The parameter list will be used to form a consistently-formatted
header for the description string of the function, such as
"(eig-dsyev A Z w)
-- A is a MAT, Z is a MAT, w is a VEC
-- no return value
Calculates eigenvalues Z and eigenvalues w of real symmetric matrix A"
- The description string of the function will actually be used.
Because I don't currently know how to assign a description to a
C-function in Guile (although it seems easy for functions written in
Scheme), I build a assq list of (<name-of-fn> <description-string>)
pairs that are exported to the interpreter bound as
`*gw:descriptions*' so that a simple Scheme function can recall a
description for a function or search for descriptions containing
some keyword or regular-expression, etc....
C> (define scheme-name (new-type c-name c-print-name
C> c-die-name c-eq-name c-gc-name))
Again similarly (but opposed to this suggestions) I intend to change
this to
(new-type <scheme-sym> <c-name> <c-print-fn> <c-free-fn> <c-equal-fn>)
as in
(new-type 'VEC "VEC" "VEC_print" "v_free" "VEC_eq")
An assq list is used to map the symbols to the Scheme object
containing the code for building the wrapper-code for the type,
etc....
C> This new naming scheme is more consistent with the naming of
C> the auxiliary functions for dealing with C files, e.g.,
C> c-file-include-local-header. I believe these should be slightly
C> reworked as well.
Would something like 'gwrap-c-include-local', 'gwrap-c-include-global'
make sense? Any other suggestions?
C> Perhaps g-wrap should be a module, but I guess that you would
C> make it less portable.
This will probably happen for the next release (soon!).
Other things in the new release:
- A capability for automatically generating dynamically-linkable
Guile modules
+ Note: the Guile directory-structure for looking for these
dynamically-linked modules is a pain when they begin to rely upon
one another (ie. for smob information) --- all the paths to the
modules must be in your LD_LIBRARY_PATH, which seems wrong to me.
- Automatic support for exporting functions with more than 10 arguments.
- No longer relies on Slib (slib dependencies removed from output-file.scm)
- Made generated *.h files more C++ friendly
-Chris