, ,

Join The Works program to have access to the most current content, and to be able to ask questions and get answers from Revelation staff and the Revelation community

Curious compiler conundrum (AREV32)

At 22 JAN 2024 09:07:38PM Robert Heard wrote:

Hello AREV32 techies,

I was trying to work out limits on decimal places during calculations. I used a simple loop wherein I kept dividing a variable by 10. Such odd results for such a simple program! I had been using EVAL at TCL, so I emulated this in a program called TEST_FRACTION. Program code below.

I am hoping that someone with inside knowledge will be able to advise what is happening? I had stuck in a check on STATUS() thinking this might have been set, but it seems to have made things worse. In only the most basic program (Test 5), did I get the full 20 lines expected. Since when does a FOR loop abort without any kind of message?

I'm hoping I've used this "code" reference correctly. Could not see a way to attach anything to this.

Also, if someone can point me to info regarding decimal limits and/or "precision" calculations, that would be most helpful.

Robert


PRINT @(-1):



PRINT "TEST 1: FOR I=1 TO 20; A=A/10; PRINT I,A,B"

EXECUTE "EVAL A=1; FOR I = 1 TO 20; A=A/10; IF A=0 THEN B=0 ELSE B=A; PRINT I,A,B; NEXT I"

* Yields only 5 lines, then "Press any key to continue...".

INPUT CONT



PRINT "TEST 2: FOR I=1 TO 20; A=A/10; PRINT I,A,B; PRINT 'FINISHED'"

EXECUTE "EVAL A=1; FOR I = 1 TO 20; A=A/10; IF A=0 THEN B=0 ELSE B=A; PRINT I,A,B; NEXT I; PRINT 'FINISHED'"

* Yields only 5 lines, 'FINISHED', then "Press any key to continue...".

INPUT CONT



PRINT "TEST 3: FOR I=1 TO 20; A=A/10; C=STATUS(); PRINT C; PRINT I,A,B"

EXECUTE "EVAL A=1; FOR I = 1 TO 20; A=A/10; C=STATUS(); IF C THEN PRINT I:' STATUS=':C; IF A=0 THEN B=0 ELSE B=A; PRINT I,A,B; NEXT I"

* Yields NO results, only "Press any key to continue..."

INPUT CONT



PRINT "TEST 4: FOR I=1 TO 20; A=A/10; C=STATUS(); PRINT C; PRINT I,A,B; PRINT 'FINISHED'"

EXECUTE "EVAL A=1; FOR I = 1 TO 20; A=A/10; C=STATUS(); IF C THEN PRINT I:' STATUS=':C; IF A=0 THEN B=0 ELSE B=A; PRINT I,A,B; NEXT I; PRINT 'FINISHED'"

* Yields only FINISHED', then "Press any key to continue...".

INPUT CONT



PRINT "TEST 5: A=1; FOR I=1 TO 20; PRINT I,A; PRINT 'FINISHED'"

EXECUTE "EVAL A=1; FOR I = 1 TO 20; PRINT I,A; NEXT I; PRINT 'FINISHED'"

* Yields 20 lines, 'FINISHED', then "Press any key to continue...".

INPUT CONT



PRINT "TEST 6: A=1.000; FOR I=1 TO 20; A=_DIVX(A,10.000,8); PRINT I,A,B"

EXECUTE "EVAL A=1.000; FOR I = 1 TO 20; A=_DIVX(A,10.000,8); IF A=0 THEN B=0 ELSE B=A; PRINT I,A,B; NEXT I"

* Yields only 4 lines with 8 decimal places, then "Press any key..."

INPUT CONT



END

At 23 JAN 2024 03:21AM Andrew McAuley wrote:

Semi-colons mean "continue the line". So everything after the else belongs to the else. Why do it in such a tortuous fashion? Why not just write the program instead of executing an eval? Then your else clauses can be ended.

For precision see here.

The Sprezzatura Group

The Sprezzatura Blog

World leaders in all things RevSoft


At 23 JAN 2024 07:19PM Robert Heard wrote:

Thanks Andrew,

Loving the sound of the SetEPMode routine. Now we've got some control!

You don't state within your example when compare "a < 1", how to NOT have it revert to DOUBLE LONG. Can I assume that by using "_CMPX" will retain EXTENDED precision?

As for the "tortuous" method used, I was curious to see if there are any differences between running a program and using EVAL at TCL. Yet to be determined.

At the first stage, I wanted to confirm that I got the same results as using EVAL at TCL.

Will revert to using standard code in RBasic program to see if gives me for insight.

As for use of ";" in a line of code when using EVAL, I have found that the way to avert all of remaining code following an ELSE clause was to use as:

IF cond1 THEN; [these stmts; fall; within; THEN;] END ELSE; [these stmts; fall; within; ELSE;] END; remaining stmts; executed; in; sequence.

Robert.


At 24 JAN 2024 05:02AM Andrew McAuley wrote:

Yes, expand semi colons to field marks and that makes perfect sense :)

The Sprezzatura Group

The Sprezzatura Blog

World leaders in all things RevSoft


At 09 FEB 2024 10:27PM Robert Heard wrote:

Revisiting this…

Have since found that what I thought was an answer to the IF THEN ELSE clause confusion, does not seem to be accurate.

I had stated that my solution was to use:

IF condition1 THEN; stmt1; stmt2; END ELSE; stmt3; stmt4; END; … continue with remaining program

does NOT work as expected.

I have tried to use the Edit Replace function of ";" to @FM (using Ctrl-S and "ASCII table", but yields a null message and "Press any key to continue…". Below is my EVAL statement:

EVAL A="HELLO"; IF A[1,1] >= "D" THEN; PRINT ">= D"; END ELSE;

PRINT "< D"; END; PRINT "NOW AFTER THE THEN/ELSE CLAUSE"; STOP

So the question is, what is MEANT to be the statement separator used in an EVAL command at TCL?

Robert.

View this thread on the Works forum...