言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

思考のかたち

よく「考えをかたちにする」と言いますが、考えのかたちってどんな形でしょう?プログラマはよくコンピュータの動作を追いかけるのに抽象的な記号を頭の中に思い浮かべます。その形は人によって違うでしょうし絵に描けるような物でも無いですが、無理やり本当に描いたら、きっと Joy のトレースのような形になるのではないでしょうか?

以下はSqueak 版 Liner Joy で階乗をトレースした結果です。トレースというのは、例えば筆算で難しい方程式を解くように、コンピュータが考えた思考の跡を示したものです。普通の言語と違うのは、全く省略が無い事。どの行をとってもその計算に必要な全ての情報が含まれています。また、

  • 5 factorial.
  • 5 4 [ dup null ] [ pop 1 ] [ dup pred factorial1 * ] :: [ [ i ] dip ] dip branch * .
  • 120

のどの行も、最終的な結果 120 を表現していると言えます。数学の解き方と違うのは、数学では式のどの位置から計算しても良いのと比較して、Joy では計算は必ず :: のところで行います(:: の記号は私が勝手に考えたものです。現在の実行ポイントを示します)。

DEFINE factorial == [dup null] [pop 1] [dup pred factorial *] ifte.
>  :: 
5 factorial.
> 5  :: factorial . 
> 5  :: [ dup null ] [ pop 1 ] [ dup pred factorial * ] ifte . 
> 5 [ dup null ]  :: [ pop 1 ] [ dup pred factorial * ] ifte . 
> 5 [ dup null ] [ pop 1 ]  :: [ dup pred factorial * ] ifte . 
> 5 [ dup null ] [ pop 1 ] [ dup pred factorial * ]  :: ifte . 
> 5 [ dup null ] [ pop 1 ] [ dup pred factorial * ]  :: [ [ i ] dip ] dip branch . 
> 5 [ dup null ] [ pop 1 ] [ dup pred factorial * ] [ [ i ] dip ]  :: dip branch . 
> 5 [ dup null ] [ pop 1 ]  :: [ i ] dip [ dup pred factorial * ] branch . 
> 5 [ dup null ] [ pop 1 ] [ i ]  :: dip [ dup pred factorial * ] branch . 
> 5 [ dup null ]  :: i [ pop 1 ] [ dup pred factorial * ] branch . 
> 5  :: dup null [ pop 1 ] [ dup pred factorial * ] branch . 
> 5 5  :: null [ pop 1 ] [ dup pred factorial * ] branch . 
> 5 false  :: [ pop 1 ] [ dup pred factorial * ] branch . 
> 5 false [ pop 1 ]  :: [ dup pred factorial * ] branch . 
> 5 false [ pop 1 ] [ dup pred factorial * ]  :: branch . 
> 5  :: dup pred factorial * . 
> 5 5  :: pred factorial * . 
> 5 4  :: factorial * . 
> 5 4  :: [ dup null ] [ pop 1 ] [ dup pred factorial * ] ifte * . 
> 5 4 [ dup null ]  :: [ pop 1 ] [ dup pred factorial * ] ifte * . 
> 5 4 [ dup null ] [ pop 1 ]  :: [ dup pred factorial * ] ifte * . 
> 5 4 [ dup null ] [ pop 1 ] [ dup pred factorial * ]  :: ifte * . 
> 5 4 [ dup null ] [ pop 1 ] [ dup pred factorial * ]  :: [ [ i ] dip ] dip branch * . 
> 5 4 [ dup null ] [ pop 1 ] [ dup pred factorial * ] [ [ i ] dip ]  :: dip branch * . 
> 5 4 [ dup null ] [ pop 1 ]  :: [ i ] dip [ dup pred factorial * ] branch * . 
> 5 4 [ dup null ] [ pop 1 ] [ i ]  :: dip [ dup pred factorial * ] branch * . 
> 5 4 [ dup null ]  :: i [ pop 1 ] [ dup pred factorial * ] branch * . 
> 5 4  :: dup null [ pop 1 ] [ dup pred factorial * ] branch * . 
> 5 4 4  :: null [ pop 1 ] [ dup pred factorial * ] branch * . 
> 5 4 false  :: [ pop 1 ] [ dup pred factorial * ] branch * . 
> 5 4 false [ pop 1 ]  :: [ dup pred factorial * ] branch * . 
> 5 4 false [ pop 1 ] [ dup pred factorial * ]  :: branch * . 
> 5 4  :: dup pred factorial * * . 
> 5 4 4  :: pred factorial * * . 
> 5 4 3  :: factorial * * . 
> 5 4 3  :: [ dup null ] [ pop 1 ] [ dup pred factorial * ] ifte * * . 
> 5 4 3 [ dup null ]  :: [ pop 1 ] [ dup pred factorial * ] ifte * * . 
> 5 4 3 [ dup null ] [ pop 1 ]  :: [ dup pred factorial * ] ifte * * . 
> 5 4 3 [ dup null ] [ pop 1 ] [ dup pred factorial * ]  :: ifte * * . 
> 5 4 3 [ dup null ] [ pop 1 ] [ dup pred factorial * ]  :: [ [ i ] dip ] dip branch * * . 
> 5 4 3 [ dup null ] [ pop 1 ] [ dup pred factorial * ] [ [ i ] dip ]  :: dip branch * * . 
> 5 4 3 [ dup null ] [ pop 1 ]  :: [ i ] dip [ dup pred factorial * ] branch * * . 
> 5 4 3 [ dup null ] [ pop 1 ] [ i ]  :: dip [ dup pred factorial * ] branch * * . 
> 5 4 3 [ dup null ]  :: i [ pop 1 ] [ dup pred factorial * ] branch * * . 
> 5 4 3  :: dup null [ pop 1 ] [ dup pred factorial * ] branch * * . 
> 5 4 3 3  :: null [ pop 1 ] [ dup pred factorial * ] branch * * . 
> 5 4 3 false  :: [ pop 1 ] [ dup pred factorial * ] branch * * . 
> 5 4 3 false [ pop 1 ]  :: [ dup pred factorial * ] branch * * . 
> 5 4 3 false [ pop 1 ] [ dup pred factorial * ]  :: branch * * . 
> 5 4 3  :: dup pred factorial * * * . 
> 5 4 3 3  :: pred factorial * * * . 
> 5 4 3 2  :: factorial * * * . 
> 5 4 3 2  :: [ dup null ] [ pop 1 ] [ dup pred factorial * ] ifte * * * . 
> 5 4 3 2 [ dup null ]  :: [ pop 1 ] [ dup pred factorial * ] ifte * * * . 
> 5 4 3 2 [ dup null ] [ pop 1 ]  :: [ dup pred factorial * ] ifte * * * . 
> 5 4 3 2 [ dup null ] [ pop 1 ] [ dup pred factorial * ]  :: ifte * * * . 
> 5 4 3 2 [ dup null ] [ pop 1 ] [ dup pred factorial * ]  :: [ [ i ] dip ] dip branch * * * . 
> 5 4 3 2 [ dup null ] [ pop 1 ] [ dup pred factorial * ] [ [ i ] dip ]  :: dip branch * * * . 
> 5 4 3 2 [ dup null ] [ pop 1 ]  :: [ i ] dip [ dup pred factorial * ] branch * * * . 
> 5 4 3 2 [ dup null ] [ pop 1 ] [ i ]  :: dip [ dup pred factorial * ] branch * * * . 
> 5 4 3 2 [ dup null ]  :: i [ pop 1 ] [ dup pred factorial * ] branch * * * . 
> 5 4 3 2  :: dup null [ pop 1 ] [ dup pred factorial * ] branch * * * . 
> 5 4 3 2 2  :: null [ pop 1 ] [ dup pred factorial * ] branch * * * . 
> 5 4 3 2 false  :: [ pop 1 ] [ dup pred factorial * ] branch * * * . 
> 5 4 3 2 false [ pop 1 ]  :: [ dup pred factorial * ] branch * * * . 
> 5 4 3 2 false [ pop 1 ] [ dup pred factorial * ]  :: branch * * * . 
> 5 4 3 2  :: dup pred factorial * * * * . 
> 5 4 3 2 2  :: pred factorial * * * * . 
> 5 4 3 2 1  :: factorial * * * * . 
> 5 4 3 2 1  :: [ dup null ] [ pop 1 ] [ dup pred factorial * ] ifte * * * * . 
> 5 4 3 2 1 [ dup null ]  :: [ pop 1 ] [ dup pred factorial * ] ifte * * * * . 
> 5 4 3 2 1 [ dup null ] [ pop 1 ]  :: [ dup pred factorial * ] ifte * * * * . 
> 5 4 3 2 1 [ dup null ] [ pop 1 ] [ dup pred factorial * ]  :: ifte * * * * . 
> 5 4 3 2 1 [ dup null ] [ pop 1 ] [ dup pred factorial * ]  :: [ [ i ] dip ] dip branch * * * * . 
> 5 4 3 2 1 [ dup null ] [ pop 1 ] [ dup pred factorial * ] [ [ i ] dip ]  :: dip branch * * * * . 
> 5 4 3 2 1 [ dup null ] [ pop 1 ]  :: [ i ] dip [ dup pred factorial * ] branch * * * * . 
> 5 4 3 2 1 [ dup null ] [ pop 1 ] [ i ]  :: dip [ dup pred factorial * ] branch * * * * . 
> 5 4 3 2 1 [ dup null ]  :: i [ pop 1 ] [ dup pred factorial * ] branch * * * * . 
> 5 4 3 2 1  :: dup null [ pop 1 ] [ dup pred factorial * ] branch * * * * . 
> 5 4 3 2 1 1  :: null [ pop 1 ] [ dup pred factorial * ] branch * * * * . 
> 5 4 3 2 1 false  :: [ pop 1 ] [ dup pred factorial * ] branch * * * * . 
> 5 4 3 2 1 false [ pop 1 ]  :: [ dup pred factorial * ] branch * * * * . 
> 5 4 3 2 1 false [ pop 1 ] [ dup pred factorial * ]  :: branch * * * * . 
> 5 4 3 2 1  :: dup pred factorial * * * * * . 
> 5 4 3 2 1 1  :: pred factorial * * * * * . 
> 5 4 3 2 1 0  :: factorial * * * * * . 
> 5 4 3 2 1 0  :: [ dup null ] [ pop 1 ] [ dup pred factorial * ] ifte * * * * * . 
> 5 4 3 2 1 0 [ dup null ]  :: [ pop 1 ] [ dup pred factorial * ] ifte * * * * * . 
> 5 4 3 2 1 0 [ dup null ] [ pop 1 ]  :: [ dup pred factorial * ] ifte * * * * * . 
> 5 4 3 2 1 0 [ dup null ] [ pop 1 ] [ dup pred factorial * ]  :: ifte * * * * * . 
> 5 4 3 2 1 0 [ dup null ] [ pop 1 ] [ dup pred factorial * ]  :: [ [ i ] dip ] dip branch * * * * * . 
> 5 4 3 2 1 0 [ dup null ] [ pop 1 ] [ dup pred factorial * ] [ [ i ] dip ]  :: dip branch * * * * * . 
> 5 4 3 2 1 0 [ dup null ] [ pop 1 ]  :: [ i ] dip [ dup pred factorial * ] branch * * * * * . 
> 5 4 3 2 1 0 [ dup null ] [ pop 1 ] [ i ]  :: dip [ dup pred factorial * ] branch * * * * * . 
> 5 4 3 2 1 0 [ dup null ]  :: i [ pop 1 ] [ dup pred factorial * ] branch * * * * * . 
> 5 4 3 2 1 0  :: dup null [ pop 1 ] [ dup pred factorial * ] branch * * * * * . 
> 5 4 3 2 1 0 0  :: null [ pop 1 ] [ dup pred factorial * ] branch * * * * * . 
> 5 4 3 2 1 0 true  :: [ pop 1 ] [ dup pred factorial * ] branch * * * * * . 
> 5 4 3 2 1 0 true [ pop 1 ]  :: [ dup pred factorial * ] branch * * * * * . 
> 5 4 3 2 1 0 true [ pop 1 ] [ dup pred factorial * ]  :: branch * * * * * . 
> 5 4 3 2 1 0  :: pop 1 * * * * * . 
> 5 4 3 2 1  :: 1 * * * * * . 
> 5 4 3 2 1 1  :: * * * * * . 
> 5 4 3 2 1  :: * * * * . 
> 5 4 3 2  :: * * * . 
> 5 4 6  :: * * . 
> 5 24  :: * . 
> 120  :: . 
>  :: 
120