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

Re: Why would anyone want opacity?

Matthias Blume wrote:

> From: "Michael R. Blair" <ziggy@martigny.ai.mit.edu>
> Subject: Re: Why would anyone want opacity?
> Date: Fri, 10 May 96 16:34:30 EDT
> > [1] Will Clinger wants to use the exception system to extend generic
> > arithmetic.  For example, + is not defined on vectors. Will might choose a
> > vector representation of `surreal numbers' or he might want to implement
> > complex or rational numbers in a Scheme that currently does not have them,
> > again using vectors as a data type representation.
> > 
> > He might use the exception system to accomplish this.  So he would now
> > accept expressions like:
> > 
> >   (+ '#(1 2) '#(23 42))
> > 
> > ...which your static type checking would presumably reject.  In fact, the
> > whole point of using the exception system to extend generic arithmetic is
> > that the _run-time_type_error_ signalling mechanism can be run-time
> > extended.
> This can all be done with sum types.  Or with overloading.  But then:
> why generic arithmetic?  I know, it's kinda cute.  But is it worth it?
> Don't we know most of the time in advance that a given variable will
> always hold a small integer?  Or a real?  Is the trouble of
> automatically injecting into and projecting from a universal number
> type (with the associated run-time checks) really worth it?
> If you want to write a piece of code in ML where you want to leave the
> number type and the primitive operations over those numbers open, then
> you write it as a functor.  That's what the ML module system is all
> about.  And then you can even drop in your favorite generic arithmetic
> package when you so desire.
> > [2] Andy Berlin's master's thesis provided a partial evaluator for
> > arithmetic Scheme code by `advise'-ing the standard arithmetic primitives
> > to generate and propagate `symbolic values'--- that is, he effectively
> > used SET! to reassign things like `+' to accept symbolic values (pairs).
> > 
> > In a static type checking system like ML, this would presumably be verboten
> > since, in such a system, one cannot SET! a variable (like +) to anything
> > that is not type-equal to its default type (number x number -> number).
> First, aren't we somehow confusing the notions of rebinding and
> assignment here?  In ML assignment to (op +) is indeed verboten,
> because (op +) is not a ref cell.  It should be that way in Scheme as
> well, which is something I am also arguing in favor of for a while
> now.
> Furthermore, what you want to do here can easily be done by, again,
> using a functor.  The argument of the functor is a structure defining
> `int' and its operations.  For ordinary integers you apply this
> functor to the `Int' structure from ML's initial basis.  For symbolic
> calculations you apply it to your custom SymbolicInt structure.
> > Would you forbid these programs being written this way?  Then you would
> > take away an ability Will and Andy currently have.
> Well, yes.  The program cannot be written in exactly the same style,
> unless you transliterate all your Scheme code to ML code with explicit
> injections and projections.  But ML gives you a much cleaner way of
> doing what you want, with the added benefit of compile-time type
> checking.
> So I wouldn't consider this taking anything away.  But new rules are
> new rules, and sometimes one has to change an old habit or two in
> order to comply.
> -Matthias