Reputation: 1
I'm reading Starting Forth: 4. Decisions, Decisions.... I can run 42 42 = .
42 42 = ok
42 42 = . -1 ok
Predictably, I get -1
which is two's compliment for true
. However, if I push a 42
on the stack, and I run
42 .s
42 = IF ." foobar " THEN ;
I would expect foobar
to be outputted and it's not. Instead I get
42 .s <1> 42 ok
42 = IF ." foobar " THEN ;
:2: Interpreting a compile-only word
42 = >>>IF<<< ." foobar " THEN ;
Backtrace:
$7F7539250B30 throw
What's going on here?
Upvotes: 2
Views: 1247
Reputation: 1
I believe these must be compiled into words, for whatever reasons expressions aren't primitives. I believe this is referenced in the book with,
Notice: an
IF…THEN
statement must be contained within a definition. You can’t just enter these words in “calculator style.”
So it would look like this,
: mycond 42 = IF ." foobar " THEN ; ok
42 .s <1> 42 ok
mycond foobar ok
42 mycond foobar ok
This is again in the gforth docs on Conditional execution
In Forth you can use control structures only inside colon definitions. An if-structure looks like this:
Upvotes: 4
Reputation: 11831
The FORTH standard says that control structures (IF, ELSE, THEN; DO, LOOP; and so on) are for compiled use only, interactive use is an "ambiguous situation". Some implementations allow interactive use, but it is far from universal.
Upvotes: 1
Reputation: 392
Exactly structured words are compiled word usage only for loops / if / while...until & so on....
Use Gforth documentation only. This is the best one. I mean to use Gforth ... else you may have difficulties with bad examples or other Forth interpreters specific words not included in ANSI Forth nor gnuforth.
Upvotes: 1