Nested blocks - retrieving and setting with variables
[1/8] from: chalz:earthlink at: 24-Sep-2004 1:30
Howdy. First post in a long time; haven't been playing with REBOL much.
However, I have a problem I wanted to handle in REBOL, and I'm kind of stuck
at a point.
Consider:
matrix: [[0 1 2 3 4] [1 0 0 0 0] [2 0 0 0 0]]
i: 2
j: 3
x: 5
I want to set one value within one of the nested blocks to another value.
However, i and j are variable, and this is looped, and I need to modify i
and j in the process of using them. For instance, this is what I've got
right now, and I really don't like it:
do rejoin compose ["matrix/" (i + 1) "/" (j + 1) ": " x]
Also, I get x by comparing a couple values within matrix. For instance,
in another language I work in that's C-like:
min(mtx[si][ti + 1] + 1, mtx[si + 1][ti] + 1, mtx[si][ti] + cost);
Shy of using 'pick' a dozen times, or compose like above, anyone have
recommendations as to how best (simplest) to do that? I know I can do
matrix/:i/:j
But I can't do math on the variables there. Suggestions? Thanks.
--Charles
[2/8] from: carl:cybercraft at: 24-Sep-2004 18:01
On Friday, 24-September-2004 at 1:30:14 you wrote,
> Howdy. First post in a long time; haven't been playing with REBOL much.
>However, I have a problem I wanted to handle in REBOL, and I'm kind of stuck
<<quoted lines omitted: 16>>
>matrix/:i/:j
> But I can't do math on the variables there. Suggestions? Thanks.
How about...
poke pick matrix i + 1 j + 1 x
?
-- Carl
[3/8] from: chalz::earthlink::net at: 24-Sep-2004 3:45
> How about...
>
> poke pick matrix i + 1 j + 1 x
Okay, that's very cool. However, how about:
>> min(mtx[si][ti + 1] + 1, mtx[si + 1][ti] + 1, mtx[si][ti] + cost);
Am I doomed to do something like:
x: (first at pick matrix si ti + 1) + 1
y: (first at pick matrix si + 1 ti) + 1
z: matrix/:si/:ti + cost
poke pick matrix si + 1 ti + 1 first minimum-of reduce [x y z]
? Or am I making life overly complicated for myself?
Thanks again.
--Charles
[4/8] from: gabriele::colellachiara::com at: 27-Sep-2004 18:50
Hi Charles,
On Friday, September 24, 2004, 7:30:14 AM, you wrote:
C> I want to set one value within one of the nested blocks to another value.
C> However, i and j are variable, and this is looped, and I need to modify i
C> and j in the process of using them. For instance, this is what I've got
C> right now, and I really don't like it:
C> do rejoin compose ["matrix/" (i + 1) "/" (j + 1) ": " x]
Given:
m-pick:
func [series indexes] [
foreach index reduce indexes [series: pick series index]
]
m-poke:
func [series indexes data /local lst] [
indexes: reduce indexes
lst: last indexes
remove back tail indexes
foreach index indexes [series: pick series index]
poke series lst data
]
you can then:
>> m-poke matrix [i + 1 j + 1] x
== 5
>> matrix
== [[0 1 2 3 4] [1 0 0 0 0] [2 0 0 5 0]]
C> Also, I get x by comparing a couple values within matrix. For instance,
C> in another language I work in that's C-like:
C> min(mtx[si][ti + 1] + 1, mtx[si + 1][ti] + 1, mtx[si][ti] + cost);
minimum-of reduce [
1 + m-pick matrix [si ti + 1]
1 + m-pick matrix [si + 1 ti]
cost + m-pick matrix [si ti]
]
which maybe is even more readable.
Regards,
Gabriele.
--
Gabriele Santilli <[g--santilli--tiscalinet--it]> -- REBOL Programmer
Amiga Group Italia sez. L'Aquila --- SOON: http://www.rebol.it/
[5/8] from: lmecir::mbox::vol::cz at: 28-Sep-2004 7:57
Charles napsal(a):
> Okay, that's very cool. However, how about:
>>>min(mtx[si][ti + 1] + 1, mtx[si + 1][ti] + 1, mtx[si][ti] + cost);
<<quoted lines omitted: 8>>
> Thanks again.
>--Charles
Carl Sassenrath has decided (at the Collaboration Conference), that we
will be able to use:
min min mtx/(si)/(ti + 1) + 1 mtx/(si + 1)/(ti) + 1 mtx/(si)/(ti) + cost
how would that work for you?
-L
[6/8] from: chalz:earthlink at: 28-Sep-2004 2:25
>>>>min(mtx[si][ti + 1] + 1, mtx[si + 1][ti] + 1, mtx[si][ti] + cost);
> Carl Sassenrath has decided (at the Collaboration Conference), that we
> will be able to use:
>
> min min mtx/(si)/(ti + 1) + 1 mtx/(si + 1)/(ti) + 1 mtx/(si)/(ti) +
> cost
>
> how would that work for you?
I think that would be incredible. Ever since I started working in REBOL,
accessing and manipulating values within a series have always been problems
for me. I'm so used to the array[index] format. Hah, course, there's
another language, a game language, I've toyed with which allows access such
as:
array[1..$]
array[3..$-5]
etc, where '$' represents the end of the array, and '..' is, in case you
haven't guessed, "all values between the specified values, inclusive". So
[1..$] with an array that contains 10 values would be all values from
array[1] to array[10]. This is most useful for working backwards or
selecting portions of an array (data = source[4..$]; tag = source[$-3..$];
and so forth). That spoiled me quickly.
Anyways, that's interesting news. And I hadn't thought of using 'min
min'.. saves me the hassle of reduce and pick.. Like I said, I'm rusty.
Thanks all.
--Charles
[7/8] from: lmecir::mbox::vol::cz at: 28-Sep-2004 13:53
Charles napsal(a):
>> <>min min mtx/(si)/(ti + 1) + 1 mtx/(si + 1)/(ti) + 1 mtx/(si)/(ti) +
>> cost
>>
....
>> <> I think that would be incredible...
>
....
>> <>Hah, course, there's
>> another language, a game language, I've toyed with which allows
<<quoted lines omitted: 11>>
>> source[$-3..$];
>> and so forth). That spoiled me quickly.
this is a different cause. Maxim wanted to have such a syntax too, but a
Rebol dialect:
copy-array [-3 - tail head - 2]
looks better to me. In case you need it there is a lot of people able to
write such a dialect including myself. Rebol ask for more.
-L
[8/8] from: chalz::earthlink::net at: 28-Sep-2004 12:03
>>> array[1] to array[10]. This is most useful for working backwards or
>>> selecting portions of an array (data = source[4..$]; tag
<<quoted lines omitted: 6>>
> looks better to me. In case you need it there is a lot of people able to
> write such a dialect including myself. Rebol ask for more.
As far as I'm concerned, no, I really should just learn, once and for
all, how to use series properly. And learn parse and dialects properly,
too. Even if they should drive me insane - who'll notice? Thanks for all
the assistance. I'm sure I'll be back. :)
--Charles
Notes
- Quoted lines have been omitted from some messages.
View the message alone to see the lines that have been omitted