tc и tco

Sergey ShishkinSergey Shishkin
1 min read
(tco lst . prg) -> any
(tc ['any ..])

Оптимизация хвостового вызова. tco реализует цикл, который перезапускается всякий раз, когда вызывается tc во время выполнения prg. Это быстрее и использует гораздо меньше места в стеке, чем рекурсивный вызов функции. lst — это список символов параметров. tc должна быть самой последней функцией, вызываемой в теле функции.

https://picolisp.tiddlyhost.com/#tc

: (de f (N)
   (if (=0 N)
      'OK
      (printsp N)
      (f (dec N)) ) )  # Recursive call
-> f
: (f 8)
8 7 6 5 4 3 2 1 -> OK

# Equivalent to
: (de f (N)
   (tco (N)
      (if (=0 N)
         'OK
         (printsp N)
         (tc (dec N)) ) ) )  # Tail call
-> f
: (f 8)
8 7 6 5 4 3 2 1 -> OK

# Mutually recursive functions
: (de f (N)
   (tco (N)
      (if (le0 N)
         'OK
         (printsp N)
         (g (dec N)) ) ) )
-> f
: (de g (N)
   (if (le0 N)
      'OK
      (tc (dec N)) ) )  # Tail call
-> g
: (f 8)
8 6 4 2 -> OK
0
Subscribe to my newsletter

Read articles from Sergey Shishkin directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Sergey Shishkin
Sergey Shishkin

Всегда чему-то учусь!