tc и tco

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
Всегда чему-то учусь!