Define a primitive data type: Difference between revisions
Content added Content deleted
Line 559: | Line 559: | ||
: SAFE! ( n addr -- ) |
: SAFE! ( n addr -- ) |
||
OVER 1 10 BETWEEN 0= ABORT" out of range!" |
OVER 1 10 BETWEEN 0= ABORT" out of range!" |
||
! ; |
! ;</LANG> |
||
Testing |
|||
\ testing |
|||
VARIABLE X |
<LANG>VARIABLE X |
||
7 X SAFE! X ? 7 ok |
7 X SAFE! X ? 7 ok |
||
12 X CLIP! X ? 10 ok |
12 X CLIP! X ? 10 ok |
||
Line 582: | Line 582: | ||
: LIMITS-ON ( -- ) ['] SAFE! IS ! ; |
: LIMITS-ON ( -- ) ['] SAFE! IS ! ; |
||
: LIMITS-OFF ( -- ) ['] FAST! IS ! ; |
: LIMITS-OFF ( -- ) ['] FAST! IS ! ; |
||
: CLIPPING-ON ( -- ) ['] CLIP! IS ! ; |
: CLIPPING-ON ( -- ) ['] CLIP! IS ! ; </LANG> |
||
Testing |
|||
⚫ | |||
⚫ | |||
\ tests at console |
|||
LIMITS-OFF ok |
LIMITS-OFF ok |
||
1 Y ! Y ? 1 ok |
1 Y ! Y ? 1 ok |
||
Line 607: | Line 608: | ||
$7FAD4460 c(abort") |
$7FAD4460 c(abort") |
||
</LANG> |
</LANG> |
||
=== Method 3: Create a safe VALUE assignment operator=== |
|||
A VALUE defines a numerical data type that returns it's value rather than an address (pointer) like a variable. |
|||
We can create a word that assigns a number to a VALUE but tests for out of range errors. |
|||
<LANG>: (->) ( n <text> -- ) |
|||
OVER 1 10 BETWEEN 0= ABORT" out of range!" |
|||
>BODY ! ; |
|||
: -> ( n -- ) |
|||
STATE @ |
|||
IF POSTPONE ['] POSTPONE (->) \ compiling action |
|||
ELSE ' (->) \ interpret action |
|||
THEN ; IMMEDIATE</LANG> |
|||
Test |
|||
<LANG>0 VALUE Z ok |
|||
99 TO Z ok ( normal assignment) |
|||
Z . 99 ok |
|||
99 -> Z ( safe assignment) |
|||
:43: out of range! |
|||
99 -> >>>Z<<< |
|||
Backtrace: |
|||
$7FAA2B0C throw |
|||
$7FAD4570 c(abort") |
|||
$7FAD45DC (->)</LANG> |
|||
=={{header|Fortran}}== |
=={{header|Fortran}}== |