Hello Joel. That's what I call a complete explanation. Thanks!
I decided to use the interleaved values option. The reason I need something like what I described is that I am creating a HTTP Proxy using Rebol (that will eventually evolve into an HTTP Tunnel application). The mapping is used to map the incoming port to the outgoing one as I have data arriving and leaving from both ports so I need a way to determine where I have to send the data I just received in a specific port. BTW, the reason I am doing this HTTP proxy is because I need NTLM authentication. I already have all the NTLM stuff working (including DES encryption by loading the OpenSSL library and using it) under Rebol and I am now doing the proxy itself. Joel Neely disse: > > Hi, Bruno, > > I know of no way to avoid some duplication. See below. > > Bruno G. Albuquerque wrote: >> >> I have 2 values that would be mapped to each other. What I need to do >> is to be able to find the first valeu by searching for the ceond and >> locate the second by searching for the first. I did come up with >> solutions to that but I am not satisfied with any of the solutions. Is >> there a standard Rebol-Way ofr doing that? The best option would be a >> way that would not result in data duplication. >> > > The answer somewhat depends on details of your problem; if "forward" and > "reverse" mappings are distinct (as in translating between host names > and IP addresses, or encoding and decoding with a non-symmetric > encryption scheme) then the simplest thing to do is keep both maps as > separate blocks (or hashes): > > >> roman2number: ["i" 1 "v" 5 "x" 10 "l" 50 "c" 100] > == ["i" 1 "v" 5 "x" 10 "l" 50 "c" 100] > >> number2roman: [1 "i" 5 "v" 10 "x" 50 "l" 100 "c"] > == [1 "i" 5 "v" 10 "x" 50 "l" 100 "c"] > >> select roman2number "x" > == 10 > >> select number2roman 10 > == "x" > > If you know which "way" you're mapping, you just select the appropriate > map. (Of course, it's easy to write a function that would take one of > the above and give the other, so you don't have to create both by hand.) > > NOTE!!! That last sentence is only true if the mapping is an invertable > function!!! If, instead, you have a many-to-one (e.g. letters to the > words "consonant" or "vowel") of course there's no way to invert. I > assume you know that, but want to include that warning for completeness. > > The other (perhaps slightly more "REBOLish") way to do this is to inter- > leave the forward and reverse mapping values as follows: > > >> roman-numerals: [ > "i" 1 "i" "v" 5 "v" "x" 10 "x" "l" 50 "l" "c" 100 "c" > ] > == ["i" 1 "i" "v" 5 "v" "x" 10 "x" "l" 50 "l" "c" 100 "c"] > >> select roman-numerals "x" > == 10 > >> select roman-numerals 10 > == "x" > > This works nicely for such things as ROT13, which is a self-inverse > mapping (and again, you can write a utility function that would take > e.g. ROMAN2NUMBER above and give you the interleaved ROMAN-NUMERALS). > However THIS DOES NOT WORK IN GENERAL if the domain and range of your > mapping overlap. As a simple example, consider the trivial example of > rotating among three elements: > > forward: ["a" "b" "c" "a"] > reverse: ["c" "b" "a" "c"] > > Since "a" maps to "b" going forward, but "b" maps to "c" going forward, > then both forward and reverse mappings can't be combined into a single > block/hash. To see why this is true, consider what would have to follow > "b" in the combined series! > > Unless you know you have a self-inverse mapping and you consider speed > soooooo important that you'll sacrifice readability for performance, I > recommend using distinct forward/reverse mappings (with a helper to > construct the inverted one). It'll be easier to read anyway! > > -jn- > > -- > ---------------------------------------------------------------------- > Joel Neely joelDOTneelyATfedexDOTcom 901-263-4446 > > Enron Accountingg in a Nutshell: 1c=$0.01=($0.10)**2=(10c)**2=100c=$1 > > > -- > To unsubscribe from this list, just send an email to > [EMAIL PROTECTED] with unsubscribe as the subject. -- To unsubscribe from this list, just send an email to [EMAIL PROTECTED] with unsubscribe as the subject.