Assembles the TAL in talScript into bytecode, and then executes it.
Ulam's 3n+1 problem
proc ulam {n} { assemble { load n; # max dup; # max n jump start; # max n label loop; # max n over 1; # max n max over 1; # max n max n ge; # max n max>=n jumpTrue skip; # max n reverse 2; # n max pop; # n dup; # n n label skip; # max n dup; # max n n push 2; # max n n 2 mod; # max n n%2 jumpTrue odd; # max n push 2; # max n 2 div; # max n/2=n' jump start; # max n label odd; # max n push 3; # max n 3 mult; # max 3*n push 1; # max 3*n 1 add; # max 3*n+1=n' label start; # max n dup; # max n n push 1; # max n n 1 neq; # max n n>1 jumpTrue loop; # max n pop; # max } }
Fibonacci numbers
proc fib n { ::tcl::unsupported::assemble { load n ; # n dup ; # n n push 1 ; # n n 1 gt ; # n n>1 jumpFalse done ;# n push 1 ; # n 1 sub ; # n-1 push fib ; # n-1 fib dup ; # n-1 fib fib over 2 ; # n-1 fib fib n-1 invokeStk 2 ; # n-1 fib fib(n-1) reverse 3 ; # fib(n-1) fib n-1 push 1 ; # fib(n-1) fib n-1 1 sub ; # fib(n-1) fib n-2 invokeStk 2 ; # fib(n-1) fib(n-2) add ; # fib(n) label done ; # result } }