Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

[REBOL] Newbie Learning Exercise

From: stasil213::yahoo::com at: 18-Dec-2003 23:38

Greetings, Thank you for the quick replies to my mailing list questions. Here is my attempt at a dictionary/hash table. It has already gone through one cleanup after looking at a similar hash table somewhere (??? maybe in one of the Rebol libraries) so some of the ideas are not mine. And I'm not a true newbie - I've been playing with Rebol off and on for several months. You may be able to tell that my background is Smalltalk. I would greatfully appreciate any suggestions for: Rebol coding style / commenting style Rebol coding idioms Other approaches/alternatives for hash tables Any other suggestions... Idioms so far: 1. Give objects a "new" function, that returns "make self". Initialize series data in the "new" function, so all instantiations do not get the same copy. Many thanks, and best regards, Stan Silver ; ===========; ; Dictionary ; ; ===========; dictionary: make object! [ hash: none new: func [] [make self [hash: to-hash []]] new-on: func [new-list] [make self [hash: to-hash copy new-list]] at: func [key] [select hash key] at-put: func [key value /local here] [ either here: find/tail hash key [ change/only here value ] [ append hash reduce [key value] ] return value ] keys: func [] [extract hash 2] has-key: func [key] [found? find hash key] remove-key: func [key] [remove/part find hash key 2 return self] at-or-put: func [key default-value /local value] [ if value: at key [return value] at-put key default-value ] at-or-do: func [key default-block /local value] [ if value: at key [return value] at-put key do default-block ] to-block: func [] [make block! hash] ] ; ======; ; Tests ; ; ======; ?: func [result 'word desired] [ if not (result = desired) [ print ["TEST FAILED" mold result word mold desired] ] ] d1: dictionary/new-on [one 1 two 2 three 3] ? d1/at 'one >> 1 ? d1/at-put 'four 4 >> 4 ? d1/at 'four >> 4 ? d1/to-block >> [one 1 two 2 three 3 four 4] ? d1/keys >> [one two three four] ? d1/has-key 'one >> true ? d1/has-key 'nine >> false ? d1/remove-key 'three >> d1 ? d1/to-block >> [one 1 two 2 four 4] d2: dictionary/new ? d2/at-put 'one 1 >> 1 ? d2/at 'one >> 1 ? 'Should >> 'Fail