The mess with NIL vs. NULL can be totally blamed on TDI's implementation. In
the Benchmark package NIL is just like the C null which is LONGWORD(0).
Unfortunately, you're right about all the Amiga Modula-2 compilers not being
compatible with each other. But, again, this is due to these specific
implementations, and are not due to problems with the language. C has the Unix
standard to adhere to for many of the library routines, while Modula-2 doesn't
have an analog.
However, I and some colleagues have ported Modula-2 code from an Apple ][ as
well as a VAX to the Amiga with minimum effort, while I had a problem doing the
same with C (DEC VAX C is lacking when it comes to adherence to convention).
We were forced into the NIL vs NULL problem due to having already produced
Modula-2 packages for machines other than the Amiga, we wanted a portable
basis for peoples code, and did not want different values for NIL on
different machines. On most machines having NIL = -1 catches more errors
with NIL references.