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

[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