List foldl := method( accu := first if(call message arguments size == 1, args := list(nil) meth := call message argAt(0) name slice(1) foreach(x, accu = accu performWithArgList(meth, args atPut(0, x))) , aName := call argAt(0) name bName := call argAt(1) name body := call argAt(2) slice(1) foreach(x, call sender setSlot(aName, accu) call sender setSlot(bName, x) accu = call sender doMessage(body, call sender) ) ) accu ) List foldr := method( accu := last if(call message arguments size == 1, args := list(nil) meth := call message argAt(0) name slice(0, -1) reverseForeach(x, accu = x performWithArgList(meth, args atPut(0, accu))) , aName := call argAt(0) name bName := call argAt(1) name body := call argAt(2) slice(0, -1) reverseForeach(x, call sender setSlot(aName, x) call sender setSlot(bName, accu) accu = call sender doMessage(body, call sender) ) ) accu )