[cffi-devel] Messing with foreign types some more
Luís Oliveira
luismbo at gmail.com
Sat Feb 17 19:00:27 UTC 2007
Hello,
I just had another go at simplifying the type system. Here's an
overview of what changed:
1 - (DEFCTYPE new-type base-type) becomes just a simple way of
defining an alias. The user cannot define translations for new-type
and there will be no translation overhead unless base-type already has
translations. This removes the need for the :TRANSLATE-P optimization
option.
2 - The new macro (DEFINE-FOREIGN-TYPE new-type supers slots &rest
options) becomes the canonical way of defining complex types with
translations. This is a thin wrapper around DEFCLASS.
2a - The new macro (DEFINE-PARSE-METHOD type-name lambda-list &body
body) will be used to parse the type specifications (e.g. '(:string
:encoding :utf-8)) and should return an instance of a subclass of
FOREIGN-TYPE.
2b - Translator/expander methods should now specialize on type instead
of using EQL specializers. So now the type specifications can easily
take options through the above parse-method, save them in some slot
(defined through DEFINE-FOREIGN-TYPE) and -- here's the big advantage
-- the translators can have a look at those options and take
appropriate action.
2c - For the simple case where the user wants to define a translation
but doesn't need to parse options, DEFINE-FOREIGN-TYPE takes a
(:SIMPLE-PARSER name) option that will automatically generate:
(define-parse-method name () (make-instance 'some-type))
3 - The translator generic functions no longer have that ad-hoc method
combination. If the user wants to chain the translations of her type's
superclasses then she should invoke CALL-NEXT-METHOD explicitly. I
believe this method combination of ours was crippling inheritance.
Compare the new :string+ptr type definition with the previous one for
an example of what I mean.
A side-effect of these changes is that we no longer need two separate
mechanisms for dealing with real types (instances of FOREIGN-TYPE) and
user types (plain symbols). That translates into ~100 less lines of
code.
Here's the patch:
<http://common-lisp.net/~loliveira/patches/more-foreign-types.diff>
This is heavily backwards incompatible wrt the type system interface
so I'll wait and see if there any objections before I commit it.
Comments and suggestions are welcome, as usual.
--
Luís Oliveira
http://student.dei.uc.pt/~lmoliv/
More information about the cffi-devel
mailing list