[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Pika-style from first principles



> Marc> To avoid the tedium of writing by hand the associated Scheme-to-C and
> Marc> C-to-Scheme conversion functions (i.e. "FILENAME_FROM_SCHEME" and
> Marc> "FILENAME_TO_SCHEME", "STREAM_FROM_SCHEME", ...), a way to define type
> Marc> aliases on the C side of the FFI is useful so that one can write in a
> Marc> C header file something like:
> 
> Marc> /* file: "my_types.h" */
> Marc> #include "basic_types.h"
> Marc> #ifdef UNICODE
> Marc> #define FILENAME NONNULL_UCS2STAR
> Marc> #define FILENAME_FROM_SCHEME NONNULL_UCS2STAR_FROM_SCHEME
> Marc> #define FILENAME_TO_SCHEME NONNULL_UCS2STAR_TO_SCHEME
> Marc> #else
> Marc> #define FILENAME NONNULL_CHARSTAR
> Marc> #define FILENAME_FROM_SCHEME NONNULL_CHARSTAR_FROM_SCHEME
> Marc> #define FILENAME_TO_SCHEME NONNULL_CHARSTAR_TO_SCHEME
> Marc> #endif
> 
> I think I'm missing a crucial bit here: Where do
> NONNULL_UCS2STAR_FROM_SCHEME, NONNULL_UCS2STAR_TO_SCHEME and
> associates come from?  What's "a way to define type aliases on the C
> side of the FFI"?

These are conversion functions (in C) defined by the FFI (they take a
bunch of parameters that are irrelevant to this discussion).  The C
code generated by the Gambit compiler contains calls to these
conversion functions at the appropriate places.  What I am saying is
that the C code generated to interface to the function defined by

   (define-c-function (open-path FILENAME) STREAM "open_path")

contains a call to FILENAME_FROM_SCHEME (and STREAM_TO_SCHEME).  By
defining FILENAME_FROM_SCHEME to be synonymous to
NONNULL_CHARSTAR_FROM_SCHEME we get a conversion to a "char*" string.
By defining FILENAME_FROM_SCHEME to be synonymous to
NONNULL_UCS2STAR_FROM_SCHEME we get a conversion to a "wchar_t*"
string.

Does that make it clearer?

[Note: this is not exactly the syntax or names that Gambit uses... I
have simplified things to ease comprehension of the general approach.]

Marc