なんでもできるぞー

チャーチ数を使って計算してみるテスト。810バイト。全然縮んでない。

チャーチ数を使うと、掛け算が簡単だ。べき乗はさらに簡単だ。

169とか251とか重要な数値が簡単に作れるぞー。頑張れば縮むと思うんだけどなあ。なんつーかかっこいいし

require 'compile.rb'

compile do
  let.x2 = abs f, x do
    f(f(x))
  end
  let.x4 = x2(x2)
  let.x3 = abs f, x do
    f(x2(f,x))
  end
  let.x12 = abs f do
    x3(x4(f))
  end
  # 13 = 3*4+1
  let.x13 = abs f, x do
    f(x3(x4(f),x))
  end
  # 39 = 3*13 = 'H'-'!'
  let.x39 = abs f, x do
    x3(x13(f),x)
  end
  # 169 = 13^2 = ' '
  let.x169 = x2(x13)
  # 251 = 169*3 = 'r'
  let.x251 = abs f do
    x3(x169(f))
  end
  # 170 = 169+1 = '!'
  let.x170 = abs f, x do
    f(x169(f,x))
  end
  # 237 = 12*169+1 = 'd'
  let.x237 = abs f, x do
    f(x12(x169(f),x))
  end
  # 253 = 251+2
  let.x253 = abs f, x do
    f(f(x251(f,x)))
  end

  let.calc = abs f, x do
    f(succ,x)
  end
  let.calc119 = abs f do
    calc(f, ch119)
  end
  let.mout = abs x do
    out(x)
  end
  let.tail = abs ch_ban, ch_d, ch_r, ch_o, ch_l, ch_sp do
    mout(ch_sp)
    mout(ch119)
    mout(ch_o)
    mout(ch_r)
    mout(ch_l)
    mout(ch_d)
    mout(ch_ban)
  end
  let.cout = abs f, x do
    mout(calc(f,x))
  end
  let.cout119 = abs f do
    mout(calc119(f))
  end
  let.ch_ban = calc119(x170)
  let.tail2 = tail(ch_ban)
  cout(x39, ch_ban)
  let.ch_d = calc119(x237)
  let.tail3 = tail2(ch_d)
  mout(succ(ch_d))
  let.ch_r = calc119(x251)
  let.tail4 = tail3(ch_r)
  let.ch_o = calc(x253, ch_r)
  let.tail5 = tail4(ch_o)
  let.ch_l = mout(cout(x253, ch_o))
  let.tail6 = tail5(ch_l)
  mout(ch_o)
  let.ch_sp = calc119(x169)
  cout(x12, ch_sp)
  tail6(ch_sp)
end