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

[REBOL] Re: Business Object Versioning

From: g:santilli:tiscalinet:it at: 5-Apr-2002 21:18

Hi Robert, On Friday, April 05, 2002, 10:42:53 AM, you wrote: RMM> I really would like to have object manipulation functions for 1, 2 and 3. Where RMM> 1 can be solved by short function;-). Well, I think you already know we can only workaround currently. :-) I see Romano has provided some, but they're using THIRD which has big problems:
>> obj: context [a: 'word b: func [x] [print x]] >> obj2: context third obj
** Script Error: word has no value ** Where: context ** Near: a: word b: func [x][print x]
>> obj/a: 1
== 1
>> obj2: context third obj
** Script Error: none is missing its x argument ** Where: context ** Near: b: func [x][print x] etc. so I'll try with a different approach. :) add-word: func [ "Create a new object like the old one but with a word added" object [object!] word [word!] ] [ make object reduce [to-set-word word none] ] rename-word: func [ "Create a new object like the old one but with a word renamed" object [object!] old-word [word!] new-word [word!] /local template ] [ template: clear [] ; not recursive, use copy if you need it to recurse ; I cannot think of a simpler way, anyone? ; (if you don't mind creating two objs you could remove then add...) foreach word next first object [ insert tail template to-set-word either word = old-word [new-word] [word] ] insert tail template none template: context template foreach word next first template [ set/any in template word get/any in object either word = new-word [old-word] [word] ] template ] remove-word: func [ "Create a new object like the old one but with a word removed" object [object!] word [word!] /local template ] [ template: clear [] ; see above foreach old-word next first object [ if old-word <> word [insert tail template to-set-word old-word] ] insert tail template none template: context template foreach word next first template [ set/any in template word get/any in object word ] template ] They work as follows:
>> obj: context [a: 1 b: 2 c: 'word d: func [x] [print x]] >> probe add-word obj 'e
make object! [ a: 1 b: 2 c: 'word d: func [x][print x] e: none ]
>> probe rename-word obj 'd 'e
make object! [ a: 1 b: 2 c: 'word e: func [x][print x] ]
>> probe remove-word obj 'c
make object! [ a: 1 b: 2 d: func [x][print x] ] HTH, Gabriele. -- Gabriele Santilli <[g--santilli--tiscalinet--it]> -- REBOL Programmer Amigan -- AGI L'Aquila -- REB: http://web.tiscali.it/rebol/index.r