Next: , Previous: , Up: External Calls to C   [Index]


14.1.3 ick_linelabel

A line label is something that can be NEXTed to and COME FROM. Unlike an INTERCAL line label, it does not label a statement, and therefore attempts to ABSTAIN or REINSTATE it may be errors, or may be ignored (it’s unspecified which, which means that either may happen for any or no reason, but exactly one will happen in any given case, although the choice might not be consistent).

The macro ick_linelabel(expression); may appear anywhere a compound statement would normally be able to appear. (That is, it looks like a function call being used as a standalone expression, but in fact the places where it can appear are more limited.) In contrast to ordinary line labels, an expression can be used rather than just a constant; however, the behaviour is undefined if the expression has side-effects. Upon encountering the line label, any COME FROMs or NEXT FROMs aiming at the line label (including ick_comefroms and ick_nextfroms) will steal control from the program; RESUMING after a NEXT FROM will work, but suffers from the same caveats as setjmp/longjmp do (any auto variables that change their value between the NEXT FROM and RESUME will have their value clobbered (i.e. their value is no longer reliable and should not be accessed)). Note that the INTERCAL variables are immune to this problem. You can also avoid the problem by marking variables as volatile in the C program.

It is possible to NEXT or ick_next to a ick_linelabel, which has the same effect as saving the NEXT stack, calling the function containing the ick_linelabel and then immediately doing a C goto to an imaginary label preceding it. Due to this possibility, an ick_linelabel is only allowed within a function defined with ICK_EC_FUNC_START.


Next: , Previous: , Up: External Calls to C   [Index]