プログラミング言語の基礎概念オンライン演習

例の演習を馬鹿正直に手でやってると、コンピュータの気持が分かる気がしないでもない。

No 47

|- let twice = fun f -> fun x -> f (f x) in twice twice (fun x -> x * x) 2 evalto 65536 by E-Let {
   |- fun f -> fun x -> f (f x) evalto ()[fun f -> fun x -> f (f x)] by E-Func {};
   twice = ()[fun f -> fun x -> f (f x)] |- twice twice (fun x -> x * x) 2 evalto 65536 by E-App {
      twice = ()[fun f -> fun x -> f (f x)] |- twice twice (fun x -> x * x) evalto ( f = (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)])[fun x -> f (f x)] by E-App {
         twice = ()[fun f -> fun x -> f (f x)] |- twice twice evalto (f = ()[fun f -> fun x -> f (f x)])[fun x -> f (f x)] by E-App {
           twice = ()[fun f -> fun x -> f (f x)] |- twice evalto  ()[fun f -> fun x -> f (f x)] by E-Var1 {};
           twice = ()[fun f -> fun x -> f (f x)] |- twice evalto  ()[fun f -> fun x -> f (f x)] by E-Var1 {};
           f = ()[fun f -> fun x -> f (f x)] |- fun x -> f (f x) evalto (f = ()[fun f -> fun x -> f (f x)])[fun x -> f (f x)] by E-Fun {}
         };
         twice = ()[fun f -> fun x -> f (f x)] |- fun x -> x * x evalto (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x] by E-Fun {};
         f = ()[fun f -> fun x -> f (f x)], x =  (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x] |- f (f x) 
              evalto  ( f = (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)])[fun x -> f (f x)]  by E-App {
            f = ()[fun f -> fun x -> f (f x)], x =  (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x] |- f evalto ()[fun f -> fun x -> f (f x)] by E-Var2 {
               f = ()[fun f -> fun x -> f (f x)]  |- f evalto ()[fun f -> fun x -> f (f x)] by E-Var1 {}
            };
            f = ()[fun f -> fun x -> f (f x)], x =  (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x] |- f x evalto 
               (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)] by E-App {
               f = ()[fun f -> fun x -> f (f x)], x =  (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x] |- f evalto ()[fun f -> fun x -> f (f x)] by E-Var2 {
                  f = ()[fun f -> fun x -> f (f x)]  |- f evalto ()[fun f -> fun x -> f (f x)] by E-Var1 {}
               };
               f = ()[fun f -> fun x -> f (f x)], x = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x] |- x evalto (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x] by E-Var1 {};
               f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x] |- fun x -> f (f x)  evalto (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)] by E-Fun {}
            };
            f = (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)] |- fun x -> f (f x) evalto ( f = (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)])[fun x -> f (f x)] by E-Fun {}
         }
      };
      twice = ()[fun f -> fun x -> f (f x)] |- 2 evalto 2 by E-Int {};
      f = (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)], x = 2 |- f (f x) evalto 65536 by E-App {
        f = (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)], x = 2 |- f evalto  (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)] by E-Var2 {
           f = (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)] |- f evalto  (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)] by E-Var1 {}
        };
        f = (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)], x = 2 |- f x evalto ???? by E-App {
           f = (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)], x = 2 |- f evalto  (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)] by E-Var2 {
              f = (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)] |- f evalto  (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)] by E-Var1 {}
           };
           f = (f = (twice = ()[fun f -> fun x -> f (f x)])[fun x -> x * x])[fun x -> f (f x)], x = 2 |- x evalto 2 by E-Var1 {};


            このへんで力尽きた。



        }
      }
   }
}

死んだ

自作でも盗作でもコンパイラを用意してから始めろ。ということかもしれない。

でもSICPでもAckerman関数とかちゃんと追えてないので、
このへんで腰すえてやるべきなのか。努力する方向間違っているのかしら。