on run {ethMult(17, 34), ethMult("Rhind", 9)} --> {578, "RhindRhindRhindRhindRhindRhindRhindRhind"} end run -- Int -> Int -> Int -- or -- Int -> String -> String on ethMult(m, n) script fns property identity : missing value property plus : missing value on half(n) -- 1. half an integer (div 2) n div 2 end half on double(n) -- 2. double (add to self) plus(n, n) end double on isEven(n) -- 3. is n even ? (mod 2 > 0) (n mod 2) > 0 end isEven on chooseFns(c) if c is string then set identity of fns to "" set plus of fns to plusString of fns else set identity of fns to 0 set plus of fns to plusInteger of fns end if end chooseFns on plusInteger(a, b) a + b end plusInteger on plusString(a, b) a & b end plusString end script chooseFns(class of m) of fns -- MAIN PROCESS OF CALCULATION set o to identity of fns if n < 1 then return o repeat while (n > 1) if isEven(n) of fns then -- 3. is n even ? (mod 2 > 0) set o to plus(o, m) of fns end if set n to half(n) of fns -- 1. half an integer (div 2) set m to double(m) of fns -- 2. double (add to self) end repeat return plus(o, m) of fns end ethMult