switch := method(match, hasMatch := call message arguments size == 1 check := if(hasMatch, method(x, x) , method(x, match == x) ) m := call argAt(if(hasMatch, 0, 1)) if(m == nil, return) n := nil loop( if(m arguments size == 1, return call sender doMessage(m argAt(0)) , if(check(call sender doMessage(m argAt(0), call sender)), return call sender doMessage(m argAt(1), call sender) ) ) if(m nextMessage and m attachedMessage, n = m nextMessage m = m attachedMessage continue ) if(m nextMessage, m = m nextMessage continue ) if(m attachedMessage, m = m attachedMessage continue ) if(n, m = n n = nil continue ) return ) ) debug := method( call message arguments foreach(i, arg, if (i != 0, write(" ")) if(arg cachedResult, write(call evalArgAt(i)) , write(arg code, ": ", call evalArgAt(i)) ) ) writeln )