[REBOL] Re: REBOL Enhancement Proposals (REPs)
From: rotenca:telvia:it at: 26-Sep-2001 18:32
Hi, Ammon, Joel (and so on),
> The quick reason that I can see is this:
>
> z: [1 2]
> y: [a/b/c d/e]
>
> set y z
At the end you will find my func 'set-all to make this kind of things.
Waiting for bug/enhancement report...
Writing it, I have found a little strange behaviour of standard set:
>> set [a:] 2
** Script Error: Invalid argument: a
** Where: do-boot
** Near: set [a:] 2
But:
>> set first [a:] 2
== 2
Here it is my function which should replace set in many (not all, /any is not
present) situations:
---
Ciao
Romano
----------------- code ----------
Rebol[
Title: "set-all"
Date: 26/09/01
Author: "Romano Paolo Tenca"
Note: {not /any refinement}
]
set-all: func [[catch] word [any-word! any-block!] value /local ret val] [
if any-word? :word [return set :word :value]
if any[set-path? :word path? :word]
[word: head insert/only copy [] first reduce [:word]]
ret: make block! lenght? :word
sin: func [x v][
reduce [either any-word? :x [to-set-word :x] [to-set-path :x] 'first reduce
[:v]]
]
throw-on-error [
while [not tail? word] [
x: first word
either any-block? :value [
either tail? value [sin :x none][
val: first value
value: next value
]
append ret sin :x :val
][
either all [tail? next word] [
return do sin :x :value
][
do sin :x :value
]
]
word: next :word
]
reduce ret
]
]
;test
aface: context[ font: context [color: 0 size: 150]]
probe set-all [aface/font/color: aface/font/size a] [200.0.0 12 "string"]
?? aface
probe set-all [b: 'c :d] [200.0.0 12 "string1"]
probe set-all ['aface/font/color 'c :d] "string2"
x: [aface/font/color: 'aface/font/size a]
y: [100.0.0 5 "string3"]
probe set-all x y
?? aface
a: 1
set-all [a:] 2
?? a
set-all first [a:] 3
?? a
set-all first [a:] :do
?? a
set-all first [a:] [:do]
?? a
halt