Reduce, Reuse, Recycle
I had to share a "Eureka!" moment that I recently experienced about REBOL. I never did get around to refining it, but it stands here as a rambling testament of - well, as a testament of my ability to ramble. I might end up refining it later on for an article on my site, or I might not. I just didn't want the thoughts to disappear in air as thoughts are sometimes known to do.
My Baffling Issue
There are a lot of re- words in
Rebol.
- reduce
- reform
- rejoin
- remold
- repend
There are others, but they make sense to people who are comfortable with the English language. I won't spend too much time with them.
- recycle
- remove
- rename
- repeat
- replace
- request
- resend
These do more or less what you would expect them to.
remove will remove an item from a series,
rename renames a file, request
requests console input from the user. Try help
_word_ to get the specifics on the others. Like I
said, I'm not worrying about them right now.
That first list of re- words was really
standing in the way of understanding Rebol. That's
because the prefix re- doesn't quite
mean what you would expect in an English language
context. I'm used to the meaning "do this thing
again," and that's the way it gets used in words
like resend and repeat. What
about repend and those others?
reduce
The key for those words is in understanding
reduce. reduce takes a series
and evaluates every expression in that series. When
it's done, it hands you a new list consisting of the
results of those evaluations. It's easier to show
than explain:
>> example: [
[ 2 + 3
[ 4 * 6
[ 4 / 2
[ ]
== [
2 + 3
4 * 6
4 / 2
]
>> reduce example
== [5 24 2]
It gets more interesting when your expressions are a little more interesting, but I'm keeping it simple so I don't get distracted.
Those other four words which have been confusing me
for months suddenly make a lot more sense when I realize
that the prefix re- means "@reduce@
these values before doing this other thing."
reform
form takes a value and returns a
stringified version of the value.
>> form example == "2 + 3 4 * 6 4 / 2"
Now that we know what reduce does, we
have a good idea what to expect out of
reform.
>> reform example == "5 24 2"
It will reduce the series, and then
form a string from the values in the new
series.
rejoin
join is a little funky. Now that I
understand what rejoin does, I usually end
up using it directly. Here's a breakdown just the
same.
join takes two arguments: a value and a
series. It will reduce the value and the series, and then
glue the results tightly into a string. Sounds a little
bit like form, doesn't it? Unlike
form, join will not provide
spaces in between the values.
>> join 3 + 2 example == "55242"
rejoin effectively does the same thing,
but it doesn't need the first value. You can
rejoin your series directly.
>> rejoin example == "5242"
remold
mold is somewhat nifty. It will transform
its argument into a string that Rebol can evaluate later.
Pretty handy for generating code on the fly!
>> mold example
== {[
2 + 3
4 * 6
4 / 2
]}
remold will reduce the
argument and then mold the results.
>> remold example == "[5 24 2]"
repend
>> append example [2 + 3]
== [
2 + 3
4 * 6
4 / 2 2 + 3
]
Be careful, append actually does append
the value to your original series. You may want to work
on a copy if you want to leave your original
series alone.
>> append copy example [2 + 3]
== [ 2 + 3
4 * 6
4 / 2
2 + 3
]
>> example
== [2 + 3 4 * 6 4 / 2]
Let's look at repend now that
we've got the append warning out of the
way. Easy enough. repend will
reduce the extra value before appending. I
haven't gotten far enough along to see why this is
better or even different from just appending the raw
expression:
>> append copy example 2 + 3 == [2 + 3 4 * 6 4 / 2 5]
I do feel a little smarter than I did 20 minutes ago, though. If nothing else, I feel good.
Great, now I think I've got a little bit better understanding of Rebol. Let's see if I've gotten far enough to make truly useful programs.
