Discussion:
Problem compliling words in GFROTH
(too old to reply)
Jose Morales
2022-10-30 11:33:45 UTC
Permalink
Sorry all, it looks like I'm having an issue I can't seem to understand my problem.

Here is what I'm trying to accomplish... it seems to work when I'm interactive, with the exception if the condition. I have some concerns on the AND condition as that might be the problem... but it fails on the last part off the definition.

\ Next we calculate an uncorrected date for the Paschal full moon, p'; then we apply a
\ minor correction to get the exact date, p, as the number of days after 21st March.
\ p' = (3 - 11g + s - l) mod 30
\ if (p' == 29) or (p' == 28 and g > 11) then
\ p = p' - 1
\ else
\ p = p'

Here is my word that fails to compile...
: _PascalCorr ( -- -- ) compiled
3 11 G @ * - S @ L @ - + 30 MOD P' ! compiled
P' @ DUP 29 = IF P ! ELSE DROP compiled
P' @ DUP 28 = AND G @ 11 > IF 1 - P ! ELSE DROP THEN compiled
P' @ P ! ;
:163: unstructured
P' @ P ! >>>;<<<
Backtrace:
$7F185F1E8988 throw
$7F185F1F84E0 c(abort")
$7F185F2055E0 def?
$7F185F1F18C0 ;-hook

Any pointers into this issue would shed some light as I seem to be missing something.

Cheers!
Doug Hoffman
2022-10-30 13:44:58 UTC
Permalink
It would help if you provided example values for
your input variables and what you expect the
output P to then be.

Just glancing at your pseudocode and your Forth
definition they don't look like the same algorithm.

Your Forth definition uses two IF statements
where your pseudocode uses one.

Further, your Forth code is missing a THEN for
one of the IFs which is probably why it did not compile..

Did you mean something like:

: pascalCorr' { g s L -- p }
3 11 g * - s + L - 30 mod \ leaves p' on stack
dup 29 = over 28 = g 11 > and or
if 1-
then ;

I used locals for simplicity and readability but left p'
on the stack.
Once it works you could easily remove the locals
and replace with variables (and @ !).

-Doug
Post by Jose Morales
Sorry all, it looks like I'm having an issue I can't seem to understand my problem.
Here is what I'm trying to accomplish... it seems to work when I'm interactive, with the exception if the condition. I have some concerns on the AND condition as that might be the problem... but it fails on the last part off the definition.
\ Next we calculate an uncorrected date for the Paschal full moon, p'; then we apply a
\ minor correction to get the exact date, p, as the number of days after 21st March.
\ p' = (3 - 11g + s - l) mod 30
\ if (p' == 29) or (p' == 28 and g > 11) then
\ p = p' - 1
\ else
\ p = p'
Here is my word that fails to compile...
: _PascalCorr ( -- -- ) compiled
:163: unstructured
$7F185F1E8988 throw
$7F185F1F84E0 c(abort")
$7F185F2055E0 def?
$7F185F1F18C0 ;-hook
Any pointers into this issue would shed some light as I seem to be missing something.
Cheers!
jem...@gmail.com
2022-10-30 18:54:36 UTC
Permalink
Post by Doug Hoffman
It would help if you provided example values for
your input variables and what you expect the
output P to then be.
Just glancing at your pseudocode and your Forth
definition they don't look like the same algorithm.
Your Forth definition uses two IF statements
where your pseudocode uses one.
Further, your Forth code is missing a THEN for
one of the IFs which is probably why it did not compile..
: pascalCorr' { g s L -- p }
3 11 g * - s + L - 30 mod \ leaves p' on stack
dup 29 = over 28 = g 11 > and or
if 1-
then ;
Thank you Dough, i missed the second THEN for the failed compilation, Thanks Anton for catching this also.

What I'm trying to do is multiple condition testing in the IF statement, was hopping for a ANDIF word...

So the conditions are:
P' == 28 ( Condition1)
G > 11 ( Condition2)

if Condittion1 && Condition2 TRUE THEN P = P1 - 1.
In testing the values, consider P'=28 and G=15
So this case the value of P is P' 1- or 27

Not sure if this is a case for factoring and testing the condition outside with a new word.

Again, thank you.
minf...@arcor.de
2022-10-30 19:59:52 UTC
Permalink
Post by ***@gmail.com
Post by Doug Hoffman
It would help if you provided example values for
your input variables and what you expect the
output P to then be.
Just glancing at your pseudocode and your Forth
definition they don't look like the same algorithm.
Your Forth definition uses two IF statements
where your pseudocode uses one.
Further, your Forth code is missing a THEN for
one of the IFs which is probably why it did not compile..
: pascalCorr' { g s L -- p }
3 11 g * - s + L - 30 mod \ leaves p' on stack
dup 29 = over 28 = g 11 > and or
if 1-
then ;
Thank you Dough, i missed the second THEN for the failed compilation, Thanks Anton for catching this also.
What I'm trying to do is multiple condition testing in the IF statement, was hopping for a ANDIF word...
P' == 28 ( Condition1)
G > 11 ( Condition2)
if Condittion1 && Condition2 TRUE THEN P = P1 - 1.
In testing the values, consider P'=28 and G=15
So this case the value of P is P' 1- or 27
Not sure if this is a case for factoring and testing the condition outside with a new word.
Again, thank you.
G 11 > P' 28 = AND P +
jem...@gmail.com
2022-10-31 09:26:00 UTC
Permalink
Post by ***@arcor.de
Post by ***@gmail.com
Again, thank you.
G 11 > P' 28 = AND P +
Thank you all!

It's all working now as expected, is the final working def of the word:

3 11 G @ * - S @ L @ - + 30 MOD P' !
P' @ DUP 29 = IF P ! ELSE DROP
P' @ DUP 28 = G @ 11 > AND IF 1 - P ! ELSE
P' @ P ! THEN THEN ;

Anton Ertl
2022-10-30 15:58:48 UTC
Permalink
Post by Jose Morales
Here is my word that fails to compile...
: _PascalCorr ( -- -- ) compiled
^^
This IF has no THEN
Post by Jose Morales
:163: unstructured
- anton
--
M. Anton Ertl http://www.complang.tuwien.ac.at/anton/home.html
comp.lang.forth FAQs: http://www.complang.tuwien.ac.at/forth/faq/toc.html
New standard: https://forth-standard.org/
EuroForth 2022: https://euro.theforth.net
Loading...