たらいまわし関数

竹内郁雄氏のたらい回し関数Clojureで書いてみました。とは言っても、ClojureLISPファミリーの一員なので、定義を単純に式に置き換えるだけ。めんどくさいことは皆無です。中で何をしているかが知りたいので、複数の関数を逐次実行させるためのdo命令*1を用いて、prnで値を表示させています。

(defn tak [x y z]
  (do 
    (prn x y z)
    (if (<= x y)
      y
      (tak
       (tak (- x 1) y z)
       (tak (- y 1) z x)
       (tak (- z 1) x y)))))

*1:Common Lisp逐次実行はprognなのですが、それに相当するClojureの命令を見つけるのに手間取ってしまいました。