commodorejohn wrote:
it'd be nice if one handler routine could simply :noname up a definition to assign to a selector within the body of the handler itself, but I'm not up enough on low-level Forth monkeying to be certain that that's how this works. If, say, I have:
If that even parses correctly, is it going to roll up a new copy of the anonymous function every time it's executed? I'm thinking of this in a Lisp-y or Smalltalk-y context where symbols/lists are unique and immutable so there's only ever one copy of a given function, but I know Forth doesn't work that way by nature.
Code: Select all
: handler-A
some-code
:noname
code-for-another-handler ;
selector-B !
;Code: Select all
DOER SELECTOR-B
: HANDLER-A
.S
MAKE SELECTOR-B
." THIS HAS NO NAME." ;
4D LOAD OK
SELECTOR-B OK
HANDLER-A STACK EMPTY OK
SELECTOR-B THIS HAS NO NAME. OK
And no, a new version is not compiled each time HANDLER-A is run.
To give you an example of what's possible with DOER/MAKE , here is an example from "Thinking Forth".
Code: Select all
// TODDLER
DOER ANSWER
: RECITAL
CR ." YOUR DADDY IS STANDING ON THE TABLE. ASK HIM 'WHY?' "
MAKE ANSWER ." TO CHANGE THE LIGHT BULB."
BEGIN
MAKE ANSWER ." BECAUSE IT'S BURNED OUT."
MAKE ANSWER ." BECAUSE IT WAS OLD."
MAKE ANSWER ." BECAUSE WE PUT IT IN THERE A LONG TIME AGO."
MAKE ANSWER ." BECAUSE IT WAS DARK!"
MAKE ANSWER ." BECAUSE IT WAS NIGHT TIME!!"
MAKE ANSWER ." STOP SAYING WHY?"
MAKE ANSWER ." BECAUSE IT'S DRIVING ME CRAZY."
MAKE ANSWER ." JUST LET ME CHANGE THIS LIGHT BULB!"
AGAIN ;
: WHY? CR ANSWER QUIT ;
Code: Select all
RECITAL
YOUR DADDY IS STANDING ON THE TABLE. ASK HIM 'WHY?' OK
WHY?
TO CHANGE THE LIGHT BULB.
WHY?
BECAUSE IT'S BURNED OUT.
WHY?
BECAUSE IT WAS OLD.
WHY?
BECAUSE WE PUT IT IN THERE A LONG TIME AGO.
WHY?
BECAUSE IT WAS DARK!
WHY?
BECAUSE IT WAS NIGHT TIME!!
WHY?
STOP SAYING WHY?
WHY?
BECAUSE IT'S DRIVING ME CRAZY.
WHY?
JUST LET ME CHANGE THIS LIGHT BULB!
WHY?
BECAUSE IT'S BURNED OUT.
WHY?
BECAUSE IT WAS OLD.
WHY?
BECAUSE WE PUT IT IN THERE A LONG TIME AGO.
WHY?
BECAUSE IT WAS DARK!
WHY?
BECAUSE IT WAS NIGHT TIME!!
WHY?
STOP SAYING WHY?
WHY?
BECAUSE IT'S DRIVING ME CRAZY.
WHY?
JUST LET ME CHANGE THIS LIGHT BULB!
WHY?
BECAUSE IT'S BURNED OUT.
WHY?
BECAUSE IT WAS OLD.
WHY?
BECAUSE WE PUT IT IN THERE A LONG TIME AGO.
Jim