Eu Improvements consolidation
- Posted by Jason Gade <jaygade at yahoo.com> Jan 05, 2007
- 666 views
Because of your rant, I'm going to try to respond to all of these together (even though I've discussed in each one). Karl Bochert wrote: > > One of my biggest problems with Eu comes when I look at someone's code and > see something like > }}} <eucode> > if atom( base[2][4]) then > ... > </eucode> {{{ > > What is the significance of the 4th item of the kind of sequence put into > the 'base' sequence? Does base contain different kinds of sequences, or > a single kind? Does the nature of its contents change with time? > > Therefore: > }}} <eucode> > sequence point is -- define a fixed sequence > sequence name > atom x, y > end sequence > ... > point.x = 0 -- set point's x value > if point.x > 0 then > point.name = 3 -- illegal > point = concat(point, 0) -- illegal > mylist[1].name = "!!" -- can be in a seq. > > -- the above opaque example might now be: > if atom(base[2].location) -- The location of base's second element > -- or perhaps > if atom(base.values[4]) -- The fourth vale of base > </eucode> {{{ > > The 'fixed sequence': > 1) has named elements > 2) cannot have its structure modified > 3) contains only data (like any other sequence) > 4) may be put in another sequence without losing its > identity (like any other data) > > KtB One thing I've been trying to point out is the Matt's ooeu does this but the syntax is a little different. Matt would have to answer if it fits all four of your criteria but I believe that it at least follows the first three. Karl Bochert wrote: > > > }}} <eucode> > sequence point is > atom x, y > end sequence > </eucode> {{{ > > The fixed sequence declaration creates a real sequence in memory, but > it also describes a datatype. > Therefore it should be able to be used to define data just like > any other datatype. Also like any other datatype, it should be > usable as a function. > > }}} <eucode> > point x, y -- create 2 points > point(foo) -- is foo a point? > </eucode> {{{ > > This creates a user defined type by restricting the types in a sequence, > much as Eu's 'type' creates a user defined type by restricting the > values of an existing type. > > The sequences 'x' and 'y' are simply created as exact duplicates of the > sequence 'point', values and all. > > We can now create complex sequences whose elements are named(documented) > and enforced(fewer bugs). > > KtB ooeu handles the first part, I'm not sure about runtime type checking. I can't find it in the ooeu docs. Again, it's a question for Matt. Karl Bochert wrote: > > Allow the programmer to defined one fixed sequence in terms of another. > > }}} <eucode> > sequence Point is > integer x, y > end sequence > > sequence Point_3D extends Point > integer z > end sequence > </eucode> {{{ > > If at some later time we decide that a Point should have a name, we > can change the definition of Point to > }}} <eucode> > sequence Point is > sequence name > integer x, y > end sequence > </eucode> {{{ > and a Point_3D gets a name field automatically (it is a Point, after all) > > Some notes: > 'Point' provides 5 things: > 1) an actual sequence > 2) Access to elements by name (with dot notation) > 3) A separate namespace for the element names > 4) A user defined type that provides type checking just like Eu's > current type() mechanism > 5) Extension from parents (Inheritance) > > > The data typing aspect can be understood by realizing that Eu > can already create the Point datatype (so 'without typecheck' acts just > as it does for any other user-defined type) > }}} <eucode> > type Point (sequence s) > if length(s) != 2 then return 0 end if > if not integer[1] then return 0 end if > if not integer[2] then return 0 end if > return 1 > end type > </eucode> {{{ > > One fine point is to realize that the Point datatype serves as a > prototype for the definition of new sequences -- it creates them complete > with data: > }}} <eucode> > sequence Point is > integer x, y > end sequence > Point.x = 5 > > Point my_point -- create my_point as a copy of Point > ? my_point -- => '5' > </eucode> {{{ > The newly created sequence is initialized. > > KtB This is basic inheritance, and again ooeu does this. I'm not trying to kick a horse that is down on the ground or anything, but... I'm not going to quote part four. I didn't really understand the post (even though I understand PBR) so I'll need to read it a few times. Just as a note: ooeu has var_id() which works like routine_id(). You can grab the id of a variable and modify it directly so you can do PBR. But it's more like pointers than automatic. Didn't you write the Bach interpreter? I know Kat always used to gush over it even though I've never used it. Are some of these features from Bach? Oh, and here's a link to ooeu: http://ooeu.sourceforge.net/