追記

以下の記事の「ブロックローカルで関数定義を再定義できる」という仕組みには問題がありましたのでやめることにしました。
何か別の形で矛盾なく同様の機能が使えるようにしたいと思います。

fib(n): fib(n-1) + fib(n-2)
fib(0): 0
fib(1): 1
print_int(fib(10)) # -> 55
{
    fib(0): 2
    print_int(fib(10)) # -> 123  (←×。外側のfib(n-1)、fib(n-2)がブロック内のfib(0)を参照してしまう。)
}