PostScript のコードが末尾再帰が最適化がされているか処理系で動くコードから判定できるか
の PostScript 版
http://www.adobe.com/products/postscript/pdfs/PLRM.pdf の 3.5.5 章によると PostScript は末尾再帰を最適化して execution stack があふれないようにするそうな。
PostScript には countexecstack という手続きがあるのでそれを使って確かめてみる。f は末尾再帰で g は末尾再帰じゃない手続き。
/f{ dup 0 eq{ % 引数が 0 の場合その時点での execution stack の深さを数えてスタックに積む pop countexecstack }{ % 引数が 0 以外の場合引数から 1 引いて再帰 1 sub f }ifelse }def /g{ dup 0 eq{ pop countexecstack }{ 1 sub g }ifelse 0 pop % 何の効果もない事をする }def /is_tail_opt{ 1 dict begin /func exch def countexecstack 100 func eq end }def
Ghostscript で実行すると
GS> {f} is_tail_opt = true GS> {g} is_tail_opt = false
判定できている。