[EMAIL PROTECTED] wrote:
> 
> Thanks Jeff!! one question:
> 
> the "local" value "k", what is it piro�ose exactly , its not beineg
> breferenced at all
>

Hey, I did say I'd left something as an exercise!  ;-)

> 
>    >> buildxref: func [/local xref k v] [
>     [    xref: copy []
>     [    foreach [k v] foo [
>     [        append xref v/name
>     [        append/only xref v
>     [        ]
>     [    xref
>     [    ]
> 

If the second argument of  foreach  is a list of words, then they take
consecutive values from the block that is the second argument.

    >> foo: [1 "a" 2 "b" 3 "c" 4 "d"]
    == [1 "a" 2 "b" 3 "c" 4 "d"]
    >> foreach [n s] foo [print s]
    a
    b
    c
    d
    >> foreach [n s] foo [print n]
    1
    2
    3
    4
    >> foreach [n s] foo [print [n "->" s]]
    1 -> a
    2 -> b
    3 -> c
    4 -> d
    >>

So, all I was saying in  buildxref  was "Walk through  foo , treating
it as a collection of pairs.  Call the left-hand element  k  and the
right-hand element  v  while looking at each pair.  Now, here's what
to do with each pair..."  It just happens that the simplified version
if cross-referencing I showed in that example didn't use the left-hand
element.

There are other ways to skin this cat.  For example, using  forskip  as
illustrated by:

    >> skipfoo: next foo
    == ["a" 2 "b" 3 "c" 4 "d"]
    >> forskip skipfoo 2 [print first skipfoo]
    a
    b
    c
    d
    == false
    >> skipfoo: foo
    == [1 "a" 2 "b" 3 "c" 4 "d"]
    >> forskip skipfoo 2 [print first skipfoo]
    1
    2
    3
    4
    == false
    >> skipfoo: foo
    == [1 "a" 2 "b" 3 "c" 4 "d"]
    >> forskip skipfoo 2 [print [first skipfoo "->" second skipfoo]]
    1 -> a
    2 -> b
    3 -> c
    4 -> d
    == false
    >>

Both of these approaches can be used with groupings of more then two
elements at a time.  For instance, if I had a block containing ID#,
name, and phone number for a bunch of employees (I'll not bother to
make up sample data for this one), one could list all of the names
by saying either (*WARNING* *UNTESTED CODE FRAGMENT*)

    foreach [emp-id emp-name emp-phone] emp-data-block [
        print emp-name
    ]

or

    emp-temp-block: next emp-data-block
    forskip emp-temp-block 3 [print first emp-temp-block]

or (a TOTALLY UNSATISFACTORY solution, in my opinion)

    emp-data-block: next emp-data-block
    forskip emp-data-block 3 [print first emp-data-block]
    emp-data-block: head emp-data-block

The first of these three (at least to my eye) seems to do the best
job of making clear that I'm dealing with  emp-data-block  as a
collection of triples, and making clear exactly what I'm doing with
(what parts of) each triple.

-jn-


PS:  Since I've already blabbered on for this long, I might as well
     include one solution to the open issue I raised in the earlier
post in this thread -- creating an index/crossreference to your
original block that lets me start with a name and get at both the
key and value block from the original data structure:

    == false
    >> foo: [
    [             admin [
    [                                name "Sharriff Aina"
    [          password "gong"
    [                                email [EMAIL PROTECTED]
    [          dept "Administration"
    [          view "yes"
    [          ]
    [
    [  sharriff [
    [          name "Sharriff Aina"
    [          password "jungle"
    [          email [EMAIL PROTECTED]
    [          dept "Administration"
    [          view "yes"
    [            ]
    [    ]
    == [
        admin [
            name "Sharriff Aina"
            password "gong"
            email [EMAIL PROTECTED]
            dept "Admini...

    >> buildxref: func [orig [block!] /local xref k v] [
    [    xref: copy []
    [    foreach [k v] orig [
    [        append xref v/name
    [        append/only xref reduce [k v]
    [        ]
    [    xref
    [    ]

    >> fum: buildxref foo
    == ["Sharriff Aina" [
            admin [
                name "Sharriff Aina"
                password "gong"
                email sharriff.ain...

    >> first select fum "Sharriff Aina"
    == admin

This version uses both the key and value elements of each pair.

Of course, I can't let this drop without assigning more homework
(old teaching habits die hard  ;-), so let's notice that the
name "Sharriff Aina" occurs more than once in your original data.
Wouldn't it be nice to have a version of  buildxref  that made a
crossreference structure that paired each name with a block of
key/value pairs, for all entries in the original data where the
name appeared?

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

Reply via email to