[bitc-dev] Facet pointers (aka interfaces)

Jonathan S. Shapiro shap at eros-os.org
Fri Jan 28 21:42:57 EST 2005


Oh boy do I owe Constantine an apology! Just goes to prove that too much
coffee and too little sleep can make you really really stupid! Also
obnoxious. :-)

So first, Constantine is right. We need something like what he is
calling "facets." As I thought about I/O today, I realized (a) why we
need them and (b) that we already have them (sort-of).

For all externally observable purposes, a facet is simply a structure
all of whose member fields are procedures. For example:

(defstruct trivstream
   get : (fn () char)
   put : (fn (char) ()))

We can instantiate this using something like the following:

(local ((define repr-state (make-stream-state))
  (trivstream (lambda () body-returning char)
              (lambda (char) body-consuming-char)))

If this corresponds behaviorally to what Constantine means by facets
(does it?) then I see two remaining issues:

1. Should there be a convenience syntax for this? [I am coming to
dislike LOCAL, but that is a side issue].

2. Should facets differ from structures by creating a vtable-like data
structure, on the theory that the method table might grow large and can
be shared? That is, where the actual object was a struct of the form

(defstruct (facet-rep 'a)
  state : 'a  
  methods : (struct-containing-methods 'a))

the only difference between this and the structure form would be
implicitly performing the insertion of the arguments.

For the moment, I think that the right thing to do is do this using
structures until we have a better sense of what we need.


shap



More information about the bitc-dev mailing list