(* The prime number sieve as a self-cloning, self-modifying object. *) let print = proc(n) wr_putText(wr_stdout, fmt_int(n) & "\n"); end; let sieve = {m => meth(s,n) print(n); let sieve1 = clone(s); s.m := meth(s1,n1) if (n1%n) is 0 then ok else sieve1.m(n1) end end end}; for i = 2 to 100 do sieve.m(i) end; (* Using recursion to replace cloning. let rec newSieve = proc() {m => meth(s,n) print(n); let sieve1 = newSieve(); s.m := meth(s1,n1) if (n1%n) is 0 then ok else sieve1.m(n1) end end end} end; *)