[EMAIL PROTECTED] wrote:
> 
> ... Just wondering how performance will be. :)
>

That was the motivation for using paired blocks rather than interleaving
the keys and values in a single block.  Notice that all of the heavy
lifting is still done by  find ,  remove , and  change , which are all
primitives (and presumably heavily optimized... right RT? ;-)  The other
built-in,  append , is a VERY thin mezzanine wrapper onto  insert , which
IS primitive. so I think performance will be tolerable.  The main overhead
is function entry/exit (I suspect) which is unavoidable if we are to add
any functionality at all.

The main issue is to avoid loops in high-level code.  If I had used
interleaved keys and values,  get  would have to be written something
like the following:

;!!! WARNING: UNTESTED CODE FRAGMENT !!!

    assoc: make object! [
        _kvpairs: copy []
;
; etc...
;
        get: func [t [string!] / local k v] [
            foreach [k v] _kvpairs [
                if k = t [return v]
            ]
            none
        ]
;
; etc...
;
    ]

which puts real work (proportional to the size of the store) up into
interpreted code.  That's why I avoided it.

> 
> I still want something like this built into the language. Also, that way we
> could use built ins like 'length? on it.
> 
> Hmm... this brings up another question. There's no way to do any kind of
> operator overloading in Rebol, so that we *could* use 'length? on this data
> structure, is there?
> 

Your wish is my command!  (At least, this once! ;-)

================================================================
REBOL [
    Title: "Minimal Associative Data Store"
    File:  %assoc.r
    Date:  14-Sep-2000
    Author: "Joel Neely"
    Purpose: {
        Quick, minimal implementation of a data store that
        associates arbitrary values with (string!) keys.
    }
]

assoc: make object! [
    _keys: copy []
    _vals: copy []
    clear: func [] [_keys: copy []  _vals: copy []]
    empty?: func [] [system/words/empty? head _keys]
    length?: func [] [system/words/length? _keys]
    new: func [/local r] [r: make assoc []  r/clear  r]
    put: func [k [string!] v [any-type!] /local p] [
        either none? p: find _keys k [
            append _keys k
            append _vals v
        ][
            change at _vals index? p v
        ]
        v
    ]
    get: func [k [string!] /local p] [
        either none? p: find _keys k [
            none
        ][
            pick _vals index? p
        ]
    ]
    delete: func [k [string!] /local p v] [
        either none? p: find _keys k [
            none
        ][
            k: pick _vals p: index? p
            remove at _keys p
            remove at _vals p
            k
        ]
    ]
    keys: func [] [copy _keys]
]
================================================================

-jn-

-- 
; Joel Neely  [EMAIL PROTECTED]  901-263-4460  38017/HKA/9677
REBOL []  print to-string debase/64 decompress #{
    789C0BCE0BAB4A7176CA48CAB53448740FABF474F3720BCC
    B6F4F574CFC888342AC949CE74B50500E1710C0C24000000}

Reply via email to