The effect of learning Forth on my understanding of REBOL
[1/16] from: GedB::Rushcoding::co::uk at: 22-Mar-2007 13:23
I've been on and off with REBOL for years now. I'd try it for one purpose, and get blown
away be the expressive power. Then I'd try it for something else and wind up hopelessly
muddled. I'd reached the conclusion that I just wasn't smart enough. However, all this
changed after spending a couple of months learning FORTH. Suddenly REBOL makes sense.
Take the examples from the 'Whats Wrong With Ruby' thread: a: if arg [red] color: any
[ all [arg arg2 green] if arg [red] if arg2 [black] purple ] I struggled for a long time
understanding how it worked. I was at the point where I could use them, but just couldn't
visualise what was going on. Now I understant how the Stack is used, and how the result
bubbles up on it. Now everything is obvious. Are many REBOLers former FORTHers? Does
anybody else think that Ian Brodies Thinking FORTH should be required reading (or better
still, adapter into Thinking REBOLisouly)?
[2/16] from: btiffin:rogers at: 22-Mar-2007 13:17
Hi, Ged
Former (current) Forther.
I learned about REBOL from comp.lang.forth Haven't looked back since.
Everyone should read Leo's books. My copy of Starting Forth is so rag
eared now that I almost want to get a new copy. By the time Thinking Forth
came out, our team was so far immersed that we just winked at each other and
nodded, Yep, we live here already.
Every once in a while I slip RPN in REBOL code. + 2 3 type operations.
They are usually mental blips, but the code works anyway, so it stays.
I still miss the immersive nature of polyFORTH, with the editor being part
of the language itself. There is never any mental context switching while
working on Forth screens. No Edit/Compile/Link/Go, or Edit/do, just
go/go/go. Perhaps someday I'll quit whining about the issue and finish the
immersive.r project I tinker with on and off.
btiffin
On Thursday 22 March 2007 09:23, Ged Byrne wrote:
[3/16] from: gregg:pointillistic at: 22-Mar-2007 11:33
Hi Ged,
GB> I've been on and off with REBOL for years now....
GB> However, all this changed after spending a couple of months
GB> learning FORTH. Suddenly REBOL makes sense.
Yeah! That's great.
GB> Now I understant how the Stack is used, and how the result bubbles
GB> up on it. Now everything is obvious.
If you could post some thoughts on this, it might help others. That
is, how *do* you visualize that code working now.
GB> Are many REBOLers former FORTHers? Does anybody else think that
GB> Ian Brodies Thinking FORTH should be required reading (or better
GB> still, adapter into Thinking REBOLisouly)?
I have 'Thinking Forth' here, but didn't read it until after spending
much time with REBOL, and even then, didn't study it in depth. Maybe I
should. 'Threaded Interpretive Languages' is another good one, showing
how TILs work internally, and how to build them. I also really enjoyed
the Brian Harvey 'Computer Science Logo Style' series, in a REBOL
context. I think 'Starting Forth' and the Brian Harvey books are
available online now. Not sure about 'Thinking Forth', and it's out of
print and hard to find.
-- Gregg
[4/16] from: tim-johnsons:web at: 22-Mar-2007 11:02
On Thursday 22 March 2007 13:23, Ged Byrne wrote:
> Are many REBOLers former FORTHers? Does anybody else think that Ian
> Brodies Thinking FORTH should be required reading (or better still,
> adapter into Thinking REBOLisouly)?
Not me, but according to Carl rebol is also inspired by lisp. When I read
that I starting playing with lisp a bit. Actually, most of the lisp writing
I have done is in elisp (emacs version of lisp). I find that playing with
lisp helps my rebol coding.
tim
--
Tim Johnson <tim-johnsons-web.com>
Palmer, Alaska, USA
[5/16] from: moliad:g:mail at: 22-Mar-2007 15:01
Ged,
I remember and loved that moment when everything just lit up... I think
most of the old time rebolers have had that moment, and fundamentally
understand WHY they like REBOL.
Have fun REBOLing!
-MAx
On 3/22/07, Tim Johnson <tim-johnsons-web.com> wrote:
[6/16] from: compkarori::gmail::com at: 23-Mar-2007 8:08
Thinking Forth is online now as a downloadable pdf.
--
Graham Chiu
http://www.synapsedirect.com
Synapse-EMR - innovative electronic medical records system
[7/16] from: andreas:bolka:gmx at: 22-Mar-2007 21:38
Thursday, March 22, 2007, 9:08:17 PM, Graham wrote:
> Thinking Forth is online now as a downloadable pdf.
There: http://thinking-forth.sourceforge.net/
--
Best regards,
Andreas
[8/16] from: rasmussen:bryan:g:mail at: 22-Mar-2007 21:50
I'd always thought it pretty obvious that Rebol fit somewhere in the
Lisp family, I don't know anything about Forth and am finding the
description of its Forthness surprising, so I would like, as someone
further up the line asked, some pointers on how people see Rebol as
Forthlike?
Cheers,
Bryan Rasmussen
On 3/22/07, Tim Johnson <tim-johnsons-web.com> wrote:
[9/16] from: anton:wilddsl:au at: 23-Mar-2007 13:12
Well, I'm learning Factor ("a practical stack language",
similar to Forth), and it has some similar words to Rebol,
like "append", "join", "reduce".
I'm not sure but these probably have common roots in Lisp.
Having the stack there just makes it obvious how the
arguments are passed and returned.
Implementing a DLL library interface for Factor clarified
for me what compiled C code is in fact doing when
it calls functions.
Anton.
[10/16] from: carl:cybercraft at: 23-Mar-2007 18:00
On Thursday, 22-March-2007 at 13:23:26 Ged Byrne wrote,
>Are many REBOLers former FORTHers? Does anybody else think that Ian
>Brodies Thinking FORTH should be required reading (or better still,
>adapter into Thinking REBOLisouly)?
I learnt FORTH a decade or more before I encountered REBOL, and ditto for LOGO, both
of which are languages you extend by adding new words to. So I'm sure that helped me
to get to grips with REBOL, as did FORTH's reverse-Polish-notation and stack approach.
For some reason, I remember FORTH much better than I remember LOGO.
Encountering such different languages early in your programming life is a very good thing
I think, as apart from making you realize there's other approaches to language design,
it must be hard to switch from (say) just imperative languages after you've been using
them for many years.
REBOL does suffer from the same problem as FORTH and LOGO due to the 'adding new words'
ability though, in that code can be filled with words you won't find in the default dictionaries.
This can make the 'learn by examing some code' approach to getting to grips with a new
language difficult. I found learning by writing code to be the best approach.
-- Carl Read.
[11/16] from: gabriele::colellachiara::com at: 23-Mar-2007 12:24
Hi Ged,
On Thursday, March 22, 2007, 2:23:26 PM, you wrote:
GB> Are many REBOLers former FORTHers? Does anybody else think that Ian
GB> Brodies Thinking FORTH should be required reading (or better still,
GB> adapter into Thinking REBOLisouly)?
I came to REBOL just after learning FORTH too. Probably just a
coincidence... but maybe not. :)
Regards,
Gabriele.
--
Gabriele Santilli <gabriele-rebol.com> --- http://www.rebol.com/
Colella Chiara software division --- http://www.colellachiara.com/
[12/16] from: GedB:Rushcoding at: 23-Mar-2007 13:18
On 3/22/07, Gregg Irwin <gregg-pointillistic.com> wrote:
> If you could post some thoughts on this, it might help others. That
> is, how *do* you visualize that code working now.
>
The main breakthrough is 'what does a word do'.
My thinking was strictly imperetive, so every word is a procedure to
be executed.
So if you have 'red', what does it do? Apparantly nothing.
So if you have 'a: if arg1 [red]' what happens when red is executed? Nothing?
My understanding before was that a block is an anonymous method with
an implicit return.
The actual code being executed was 'if arg1 do [return red]'.
Obviously If returns whatever is passed to it.
This was all very complicated, and never quite fitted. It was all
just too Ptolemaic.
To be honest, I would write if arg1 [a: red] just so I could keep a
track of it all in my head.
Now I see that what red does is place something on the stack, where it
remains until something picks it up. 'if' just leaves the stack
unchanged.
However, unlike FORTH, REBOL enforces a scricter scope. I imagine
that a: sets an expectation for a token, which needs to be satisfied
within a specific scope. The stack is cleared once the current scope
is left. This removes the need for reverse polish and constant drops.
This is why 'a: if false [red] if true [blue]' returns none rather then blue.
This leads us to the need for the 'all' and 'any' words, and what the
difference between them is. These are commands that control the
scope.
I'm sure my mental model will need further refinement, but it is a
serious breakthrough for me :)
[13/16] from: GedB:Rushcoding at: 23-Mar-2007 13:21
Bryan,
I've tried to understand REBOL by learning more about LISP, but it
never quite worked.
LISP is functional, with the change of state being something to be avoided.
REBOL, on the other hand, seems to encourage tinkering with the
context. This is a style FORTH reflects.
On 3/22/07, bryan rasmussen <rasmussen.bryan-gmail.com> wrote:
[14/16] from: moliad::gmail::com at: 23-Mar-2007 9:13
thanks for this thread Ged,
Its my first real brush with FORTH, and you've just explained/confirmed
what I was about to develop wrt antidote's (see other thread) stack
handling. so its seems I am on the right path.
I understood stacks a long time ago with my amiga... I had many stack
overflows in some application and I had to come to grips with a btree
algorythm which was just going in circles. The information required to
program on amiga really forced many developpers to become quality
developpers... you could not overlook linked-lists, semaphores, garbage
collection (pools), resident applications, graphics, there where so many
advanced concepts given directly to you in the api... its still something I
miss somehow. everything was bare and accessible, real control. yet having
everything plainly documented and properly designed, meant that if you
followed the few simple rules... you could litteraly rewrite the OS from the
inside out!
-MAx
On 3/23/07, Ged Byrne <GedB-rushcoding.co.uk> wrote:
[15/16] from: lmecir::mbox::vol::cz at: 23-Mar-2007 19:58
Ged Byrne napsal(a):
> My thinking was strictly imperetive, so every word is a procedure to
> be executed.
>
> So if you have 'red', what does it do? Apparantly nothing.
>
> So if you have 'a: if arg1 [red]' what happens when red is executed? Nothing?
>
> My understanding before was that a block is an anonymous method with
> an implicit return.
>
This explanation is arguable, I guess. A block doesn't return anything
except for itself. The function IF is needed to evaluate the block to
yield the RED value when ARG1 is considered true. The other case is,
that ARG1 is considered false by IF. Even in that case IF has to return
a value, which equals to NONE in that case.
> Now I see that what red does is place something on the stack, where it
> remains until something picks it up. 'if' just leaves the stack
> unchanged.
>
Again, the things are simpler - it is not a stack, it is just "result
place". Example:
1 2
is an expression in REBOL yielding 2, since 2 replaces 1 in the "result
place".
I don't know whether this can be of any help to you, but it looks more
accurate to me.
-L
[16/16] from: moliad::gmail::com at: 23-Mar-2007 14:41
On 3/23/07, Ladislav Mecir <lmecir-mbox.vol.cz> wrote:
>
> Again, the things are simpler - it is not a stack, it is just "result
> place". Example:
>
> 1 2
my understanding follows your logic ladislav...
actions push the result of evaluating expressions on the stack until a
specific number of results have been accounted for.
so:
1 2
will not be pushed, since there is no function arguments being pushed on the
stack.
but I think the "return space" could also be the 0 stack offset of the
callee's arguments. this could actually simplify evaluation of
expressions... since the push needed to be done by the calling function will
be already done by the returning function.
and some functions knowing that they return first arg they received wont
even have to touch the stack a part from popping their local vars. :-)
-MAx