[REBOL] Associative data store Re:(3)
From: joel:neely:fedex at: 14-Sep-2000 19:32
[rebol--keithdevens--com] 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 [joel--neely--fedex--com] 901-263-4460 38017/HKA/9677
REBOL [] print to-string debase/64 decompress #{
789C0BCE0BAB4A7176CA48CAB53448740FABF474F3720BCC
B6F4F574CFC888342AC949CE74B50500E1710C0C24000000}