Re: On indexes
- Posted by christian.cuvier at education.gouv.fr Aug 23, 2002
- 400 views
Thank you very much. So we are probably in the case where a major feature of the language is stated in an end note buried in the docs. Deserves better IMO. Regards. Chris ----- Original Message ----- From: "Matthew Lewis" <matthewwalkerlewis at YAHOO.COM> To: "EUforum" <EUforum at topica.com> Subject: RE: On indexes > > > -----Original Message----- > From: christian.cuvier at education.gouv.fr > [mailto:christian.cuvier at education.gouv.fr] > > > But there may be a problem with variable depth indexing. Assume we want to > manipulate > > arbitrary trees in Euphoria. Trees are two-terms sequences: one object as > root node > > content and a sequence of 0 or more trees (the subtrees originating from > root). > > > Accessing an individual statement using ordinary indexes requires to know, > before run > > time, its depth. Since generally we don't, the indexing scheme should be > dynamic, so > > it must be a sequence. How to get or set an arbitrary tree subtree or > element (a 0-depth > > node), given a tree, an index sequence and a value? > > > What about setting an element? > > The way I found is to duplicate the tree with the modified element and > return it. It seems > > a terrible waste of machine cycles and memory. If somebody knows better, > I'd appreciate. > > If the interpreter is so smart that it does not really duplicate the > structure, this rare > > feature needs be more thoroughly documented. > > This came up a while back. After some help from Jiri, I came up with the > following iterative fetch and recursive store functions. It should only > copy the most deeply nested sequence within b. Mostly, only pointers are > copied (internally). Pass c = 0 to simply assign b = a. c = {1,0} = {1}. > I use this in my database code to fetch and store nested fields. > > -- return a[b...] > function seq_fetch(object a, sequence b) > > for i = 1 to length(b) do > > a = a[b[i]] > > end for > > return a > end function > > -- store a in b at subcript c > function seq_store(object a, object b, object c) > integer len > > if atom(c) then > c = {c} > end if > > len = length(c) > > -- now it will insert a new element! > if c[1] = -1 or length(b) + 1 = c[1] then > return b & { a } > elsif len > 1 then > -- recursively go into the sequence > > b[c[1]] = seq_store(a, b[c[1]], c[2..len] ) > return b > end if > > -- get the index > c = c[1] > > if c then > b[c] = a > else > b = a > end if > > return b > end function > > > Matt Lewis > > > >