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

_______________________________________________
bitc-dev mailing list
[email protected]
http://www.coyotos.org/mailman/listinfo/bitc-dev

Reply via email to