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, 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 while the program
is running!
>> 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.