Collecting my attempts to improve at tech, art, and life

Reduce, Reuse, Recycle in REBOL

Tags: rebol coolnamehere

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.

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.

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?


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.”


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.


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"


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]"


>> 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.

Added to vault 2024-01-15. Updated on 2024-02-01