PostScript で再帰により階乗計算をする様子

PostScript TUTORIAL and COOKBOOKの70ページ。70 Chapter 7: LOOPS AND CONDITIONALS に再帰で階乗計算の結果を印刷するサンプルがあります。その階乗計算の部分。

/factorial %stack: n --- n! (after)
  { dup 1 gt
    {dup 1 sub factorial mul} if
  } def

print、pstackはスタックに影響を与えませんので、どこに何個入れても問題ありません。
factorialにprint、pstackを入れまくって階乗計算の様子をみてみます。

GS>/factorial {(=factorial\n) print 
                  dup 1 gt  (==dup 1 gt\n)  print pstack  
         {dup 1 sub (==dup 1 sub\n) print pstack 
                  factorial mul (==mul\n) print pstack } if } def
GS>5 factorial
=factorial
==dup 1 gt
true        % 5 から複製され 1より大きいかどうかの論理演算結果
5           % 最初に積まれた 5
==dup 1 sub
4           % 5 から複製され 1引くかれた値。
5
  % 再帰が一段深くなる(インデントは手作業による)
  =factorial
  ==dup 1 gt
  true
  4
  5
  ==dup 1 sub
  3
  4
  5
    =factorial
    ==dup 1 gt
    true
    3
    4
    5
    ==dup 1 sub
    2
    3
    4
    5
      =factorial
      ==dup 1 gt
      true
      2
      3
      4
      5
      ==dup 1 sub
      1
      2
      3
      4
      5
        =factorial
        ==dup 1 gt
        false
        1
        2
        3
        4
        5
      ==mul
      2    % 1と2を乗算した結果
      3
      4
      5
    ==mul
    6    % 2と3を乗算した結果
    4
    5
  ==mul
  24    % 6と4を乗算した結果
  5
==mul
120    % 24と5を乗算した結果
GS<1>==
120
GS>