Node:Assertions, Next:Singlestep Debugger, Previous:Debugging, Up:Programming Tools
It is a good idea to make your programs self-checking, especially if you
make an assumption that may become invalid during maintenance (for
example, that a certain field of a data structure is never zero). Gforth
supports assertions for this purpose. They are used like this:
assert( flag )
The code between
) should compute a flag, that
should be true if everything is alright and false otherwise. It should
not change anything else on the stack. The overall stack effect of the
( -- ). E.g.
assert( 1 1 + 2 = ) \ what we learn in school assert( dup 0<> ) \ assert that the top of stack is not zero assert( false ) \ this code should not be reached
The need for assertions is different at different times. During
debugging, we want more checking, in production we sometimes care more
for speed. Therefore, assertions can be turned off, i.e., the assertion
becomes a comment. Depending on the importance of an assertion and the
time it takes to check it, you may want to turn off some assertions and
keep others turned on. Gforth provides several levels of assertions for
Important assertions that should always be turned on.
assert0(-- gforth ``assert-zero''
Normal assertions; turned on by default.
assert1(-- gforth ``assert-one''
assert2(-- gforth ``assert-two''
Slow assertions that you may not want to turn on in normal debugging; you would turn them on mainly for thorough checking.
assert3(-- gforth ``assert-three''
assert(-- gforth ``assert(''
End an assertion.
)-- gforth ``close-paren''
assert-level specifies the highest assertions that
are turned on. I.e., at the default
assert-level of one,
assert1( assertions perform checking, while
assert3( assertions are treated as comments.
The value of
assert-level is evaluated at compile-time, not at
run-time. Therefore you cannot turn assertions on or off at run-time;
you have to set the
assert-level appropriately before compiling a
piece of code. You can compile different pieces of code at different
assert-levels (e.g., a trusted library at level 1 and
newly-written code at level 3).
All assertions above this level are turned off.
assert-level-- a-addr gforth ``assert-level''
If an assertion fails, a message compatible with Emacs' compilation mode
is produced and the execution is aborted (currently with
If there is interest, we will introduce a special throw code. But if you
catch a specific condition, using
probably more appropriate than an assertion).
~~) will usually print the wrong file name if a
marker is executed in the same file after their occurance. They will
*somewhere* as file name if a marker is executed in the
same file before their occurance.
Definitions in ANS Forth for these assertion words are provided