A couple things worth noting in Max’s snippet above:
Here we see a few things for the first time.
REPEAT is ZIL’s fundamental looping construct. There are a few other ways to write loops, but they can all be rewritten in terms of REPEAT. As the name suggests, the code inside will run repeatedly, until it explicitly breaks out of the loop or returns from the routine[1]. The ((X 0)) bit defines a local variable that only exists inside the loop.[2]
PUTB writes a byte into the table.
IGRTR? is short for “increment and test if greater” (or INC + GRTR?), which Inform programmers may know as the @inc_chk opcode. The loop will end when X exceeds 809—i.e., when it reaches the end of that 810-byte table.
The comment is referring to some of ZIL’s confusingly rich syntax for defining tables.[3]
(STRING), as used above, means that the table entries are bytes instead of words, and also that if you put a string in the table initializer, it will be compiled as a series of bytes in the table, instead of as a pointer to a string:
<TABLE (STRING) "initial">
;; Gives a seven-byte table spelling "initial" in ZSCII
<TABLE "initial">
;; Gives a two-byte table containing the address of the packed string "initial"
(Unlike a string array in Inform, a STRING table doesn’t automatically have a length prefix.)
ITABLE is a convenient way to define a table whose initial contents are repetitive: <ITABLE 100 3> creates a table filled with one hundred copies of the number 3.
In this case, the STRING table filled with 810 zero bytes would seem to be equivalent to <ITABLE 810 (BYTE) 0>… but perhaps the Iron Chef plans to put a string in the initializer later? Laying out such a large table by hand would be an unusual choice in most kitchens, but at this level, one hesitates to call anything accidental.
In this context, the
RETURNis breaking out of the loop, not returning from the routine, although the effect is the same since the routine ends after the loop. ↩︎Technically, it exists for the whole routine, because of how Z-machine locals work. But it can only be referenced inside the loop, and the compiler may reuse the Z-machine variable for other purposes elsewhere in the routine. ↩︎
Confusing not only because of the variety of options, and not only because
<ITABLE BYTE 100>and<ITABLE 100 (BYTE)>do different things, but also because I just noticed that one of those was documented incorrectly. I’ve updated the ZILF Reference Guide. ↩︎

