| Hugs treats runST as a keyword.
But I think Graeme's point is that Hugs doesn't actually treat it like
other keywords. If you try
:i where class let
then you get an error. But if you do the same with runST, then Hugs
seems to treat it as a regular identifier, albeit with an unknown type.
The same things happen with :n. These two commands bypass the lexer,
and hence don't distinguish between keywords and regular identifiers.
They rely, instead, on the fact that a user will never be able to define
an identifier with the same name as a keyword, and hence the symbol
table lookup will fail.
I think Hugs is defining the primitive used to implement runST with the
name "runST", which users of the :n and :i commands can find in the
symbol table. We should change the name of the primitive to prevent
this. Anything that's not a legal identifier would do, like "_runST",
for example.
Mark