MONKEY see no Nil
In a for loop Nil
is turned into a List
with one Element that happens to be Any
. This really buged me so I went to find out why. As it turns out the culprit is the very definition of Nil is Cool
. To be able to turn any single value into a List
Cool
implements method list()
. Which takes a single values and turns that value into a List with that one value. Nil
indicates the absense of a value and turning it into a value doesn’t make sense. Luckily we can change that.
use MONKEY-TYPING;
augment class Nil {
method list() {
note 'Trying to turn Nil into a list.';
note Backtrace.new.list.tail.Str;
Empty
}
}
Nil.HOW.compose(Nil);
sub niler() { Nil }
for niler() { say 'oi‽' }
We can’t just warn
because that would show the wrong point in the stack trace. So we note (which also goes to $*ERR) and pull the last value out of the Backtrace
.
Interestingly Failure
throws both in .list
and in .iterator
. Nil
implements push
, append
, unshift
and prepend
by immediatly die
-ing. Adding more to nothing is deadly but turning nothing first into something vaguely undefined and then allowing to add more stuff to it is inconsistent at best. What leads me to believe that Nil.list
as it is specced today is just an oversight.
At least I can now write a simple module to protect my code from surprising Nil
s.