[SCRIPT] select/deep
[1/4] from: coussement:c:itc:mil:be at: 2-Feb-2001 9:07
Hi REBOLians:
Because the dat I use are stored into deep-nested blocks, I had to use
multiple select statement to acces it:
>> b: [label1 [label2 [label3 [data1 label4 [data2]]]]]
>> select select select b 'label1 'label2 'label3
== [data1 label4 [data2]]
It works fine, but it does not help readability and takes a lot of place !
SO, I thought of:
select-deep: func [
data [block!]
arg1 [any-word!]
arg2 [any-word! unset!]
arg3 [any-word! unset!]
arg4 [any-word! unset!]
arg5 [any-word! unset!]
][
either value? 'arg2 [
either value? 'arg3 [
either value? 'arg4 [
either value? 'arg5 [
return select select select select select data arg1 arg2
arg3 arg4 arg5
][
return select select select select data arg1 arg2 arg3
arg4
]
][
return select select select data arg1 arg2 arg3
]
][
return select select data arg1 arg2
]
][
return select data arg1
]
]
which could be used:
>> select-deep b 'label1
== [label2 [label3 [data1 label4 [data2]]]]
>> select-deep b 'label1 'label2
== [label3 [data1 label4 [data2]]]
>> select-deep b 'label1 'label2 'label3
== [data1 label4 [data2]]
>> first select-deep b 'label1 'label2 'label3
== data1
>> select-deep b 'label1 'label2 'label3 'label4
== [data2]
>> first select-deep b 'label1 'label2 'label3 'label4
== data2
which seems a little bit more practical to me.
I like this approach, but there's for sure a more elegant solution to it...
Any idea ?
Regards,
chr==
[2/4] from: al:bri:xtra at: 2-Feb-2001 21:58
> ...but there's for sure a more elegant solution to it...
>> b: [label1 [label2 [label3 [data1 label4 [data2]]]]]
== [label1 [label2 [label3 [data1 label4 [data2]]]]]
>> B/label1/label2/label3/label4
== [data2]
Andrew Martin
ICQ: 26227169 http://members.nbci.com/AndrewMartin/
[3/4] from: coussement:c:itc:mil:be at: 2-Feb-2001 10:06
Hi Andrew,
Thanks for suggesting, but IMHO I think the approach I proposed should be
more robust for multi-type nested structures:
Let's say:
>> c: ["anybody" [test1 [1 [1 2] 2 [1 5]]]]
>> c/"anybody"/test1
** Syntax Error: Invalid path -- c/.
** Where: (line 1) c/"anybody"/test1
>> select-deep c "anybody" 'test1
== [1 [1 2] 2 [1 5]]
But in order to allow this, you have to modify my function's header in :
select-deep: func [
data [block!]
arg1 [any-type!]
arg2 [any-type! unset!]
arg3 [any-type! unset!]
arg4 [any-type! unset!]
arg5 [any-type! unset!]
][...]
Your idea ?
chr==
[4/4] from: arolls::bigpond::net::au at: 3-Feb-2001 0:23
How about this quick one?
block: ["anybody" [test1 [1 [1 2] 2 [1 5]]]]
selection-block: ["anybody" 'test1 2]
select-deep: func [
blk [block!] sel-blk [block!] /local v
][
v: select block first sel-blk
foreach item next sel-blk [
probe v
v: select v item
]
return v
]
select-deep block selection-block