const L = require("./lambda-calculus.js");

var term = `
@Y #f
  /#x /f /x x #x /f /x x

@F.flip #f #a #b
  //f b a

@F.K #a #b
  b

@C.suc #n #s #z
  /s //n s z

@C.add #a #b #s #z
  //a s //b s z

@C.mul #a #b #s #z
  //a /b s z

@C.exp #a #b
  /b a

@C.0
  #s #z z

@C.1
  /C.suc C.0
  
@C.2
  /C.suc C.1

@C.3
  /C.suc C.2

@C.4
  /C.suc C.3

@C.5
  /C.suc C.4

@C.6
  /C.suc C.5

@C.7
  /C.suc C.6

@C.8
  /C.suc C.7

@C.9
  /C.suc C.8

@C.16
  //C.mul C.8 C.2

@C.32
  //C.mul C.16 C.2

@C.64
  //C.mul C.32 C.2

@C.128
  //C.mul C.64 C.2

@C.256
  //C.mul C.128 C.2

@C.512
  //C.mul C.256 C.2

@L.nil #con #nil
  nil

@L.con #x #xs #con #nil
  //con x xs

@B.suc /Y #r #x #a #b
  //x b #x /a /r x

@B.0 /Y #r #a #b
  /a r

@B.O #bs #o #i
  /o bs

@B.I #bs #o #i
  /i bs

@B.peek #n #x
  ///n
    #t /t #x //x
      #x #r #t //t x #a #b #c ///r a b /a c
      #x #r #t //t x #a #b #c ///r a b /b c
    #t //t x #a #b #c c
    #x #r r

@B.add /Y #R #xxs #yys
  ///xxs
    #xs #t //t C.0 xs
    #xs #t //t C.1 xs
    #n #xs ///yys
      #ys #t //t C.0 ys
      #ys #t //t C.1 ys
      #m #ys //n B.suc //m B.suc /B.O //R xs ys

@B.mul /Y #R #xxs #yys
  ///xxs 
    #xs #t //t C.0 xs
    #xs #t //t C.1 xs
    #n #xs //n /B.add yys /B.O //R xs yys

@B.fromC #c
  //c B.suc B.0

@B.1
  /B.suc B.0

@B.2
  /B.suc B.1

@B.3
  /B.suc B.2

@B.4
  /B.suc B.3

@B.5
  /B.suc B.4

@B.6
  /B.suc B.5

@B.7
  /B.suc B.6

@B.8
  /B.suc B.7

@B.9
  /B.suc B.8

@B.27
  /B.I /B.I /B.I /B.O /B.I B.0

@B.137
  /B.I /B.O /B.O /B.I /B.O /B.O /B.O /B.I B.0

@B.rnd32.a
  /B.I /B.O /B.I /B.O /B.I /B.I /B.I /B.O
  /B.O /B.O /B.O /B.O /B.O /B.O /B.I /B.O
  /B.I /B.O /B.O /B.O /B.I /B.O /B.I /B.O
  /B.O /B.O /B.O /B.O /B.I /B.I /B.I /B.I
  /B.I /B.I /B.O /B.I /B.O /B.I /B.I /B.O
  /B.O /B.I /B.I /B.I /B.O /B.I /B.O /B.I
  /B.O /B.O /B.O /B.O /B.I /B.I /B.I /B.O
  /B.O /B.I /B.I /B.I /B.I /B.O /B.O /B.O
  B.0

@B.rnd32.b
  /B.I /B.O /B.O /B.O /B.O /B.O /B.O /B.O
  /B.O /B.I /B.O /B.I /B.I /B.I /B.O /B.O
  /B.O /B.I /B.I /B.O /B.O /B.I /B.I /B.I
  /B.O /B.O /B.O /B.I /B.I /B.O /B.I /B.I
  /B.I /B.O /B.I /B.I /B.I /B.I /B.O /B.O
  /B.O /B.O /B.O /B.I /B.I /B.O /B.I /B.O
  /B.O /B.I /B.I /B.O /B.I /B.I /B.O /B.O
  /B.O /B.I /B.O /B.I /B.I /B.O /B.I /B.I
  B.0

@B.rnd256.a
  /B.O /B.I /B.O /B.O /B.O /B.I /B.O /B.O
  /B.I /B.I /B.O /B.O /B.I /B.I /B.O /B.I
  /B.O /B.O /B.O /B.I /B.O /B.O /B.O /B.O
  /B.I /B.O /B.I /B.I /B.I /B.I /B.I /B.O
  /B.O /B.O /B.I /B.O /B.I /B.O /B.O /B.I
  /B.O /B.O /B.I /B.O /B.I /B.O /B.O /B.I
  /B.O /B.I /B.I /B.I /B.I /B.O /B.O /B.I
  /B.O /B.O /B.I /B.I /B.O /B.O /B.I /B.I
  /B.O /B.O /B.O /B.O /B.I /B.O /B.O /B.O
  /B.O /B.O /B.I /B.O /B.O /B.I /B.I /B.O
  /B.O /B.O /B.O /B.O /B.I /B.O /B.O /B.O
  /B.I /B.O /B.I /B.O /B.I /B.O /B.I /B.I
  /B.O /B.O /B.I /B.O /B.I /B.I /B.O /B.I
  /B.I /B.I /B.O /B.I /B.I /B.O /B.O /B.I
  /B.O /B.O /B.I /B.O /B.I /B.I /B.O /B.I
  /B.O /B.O /B.I /B.O /B.O /B.I /B.I /B.I
  /B.O /B.I /B.O /B.O /B.O /B.I /B.I /B.O
  /B.O /B.O /B.O /B.O /B.I /B.I /B.I /B.O
  /B.I /B.I /B.I /B.I /B.O /B.I /B.O /B.O
  /B.O /B.I /B.I /B.I /B.I /B.I /B.O /B.I
  /B.O /B.I /B.O /B.I /B.I /B.O /B.O /B.O
  /B.O /B.O /B.O /B.I /B.I /B.O /B.I /B.O
  /B.O /B.I /B.O /B.I /B.O /B.O /B.O /B.I
  /B.O /B.O /B.O /B.I /B.I /B.O /B.O /B.O
  /B.I /B.I /B.O /B.I /B.I /B.O /B.I /B.O
  /B.I /B.O /B.O /B.O /B.O /B.O /B.I /B.O
  /B.I /B.O /B.I /B.O /B.I /B.O /B.I /B.O
  /B.I /B.O /B.O /B.I /B.O /B.O /B.I /B.I
  /B.I /B.O /B.I /B.O /B.I /B.O /B.I /B.O
  /B.O /B.O /B.I /B.O /B.I /B.I /B.I /B.I
  /B.I /B.O /B.O /B.I /B.O /B.O /B.O /B.O
  /B.O /B.I /B.I /B.I /B.I /B.I /B.I /B.I
  B.0

@B.rnd256.b
  /B.O /B.I /B.O /B.O /B.O /B.I /B.I /B.I
  /B.I /B.I /B.I /B.O /B.O /B.O /B.O /B.O
  /B.I /B.O /B.O /B.O /B.O /B.I /B.O /B.O
  /B.I /B.I /B.I /B.O /B.I /B.I /B.O /B.O
  /B.I /B.O /B.I /B.O /B.O /B.O /B.O /B.O
  /B.I /B.O /B.O /B.I /B.I /B.O /B.I /B.O
  /B.O /B.I /B.O /B.O /B.I /B.O /B.I /B.I
  /B.I /B.I /B.O /B.I /B.O /B.I /B.O /B.O
  /B.I /B.I /B.O /B.O /B.I /B.I /B.O /B.O
  /B.I /B.I /B.O /B.O /B.O /B.I /B.I /B.O
  /B.O /B.I /B.O /B.O /B.I /B.I /B.O /B.O
  /B.I /B.I /B.I /B.I /B.I /B.O /B.I /B.O
  /B.I /B.I /B.I /B.I /B.I /B.O /B.I /B.O
  /B.I /B.O /B.I /B.O /B.O /B.I /B.I /B.O
  /B.I /B.O /B.O /B.I /B.I /B.O /B.O /B.O
  /B.O /B.O /B.O /B.O /B.O /B.O /B.O /B.I
  /B.I /B.O /B.O /B.I /B.O /B.O /B.O /B.I
  /B.O /B.O /B.I /B.O /B.I /B.O /B.I /B.I
  /B.O /B.O /B.I /B.I /B.O /B.I /B.I /B.O
  /B.I /B.O /B.I /B.I /B.O /B.O /B.O /B.I
  /B.O /B.O /B.I /B.O /B.O /B.O /B.O /B.I
  /B.I /B.O /B.I /B.O /B.O /B.I /B.I /B.I
  /B.O /B.I /B.I /B.O /B.I /B.O /B.O /B.I
  /B.I /B.I /B.O /B.O /B.I /B.I /B.O /B.O
  /B.I /B.I /B.I /B.I /B.O /B.O /B.O /B.O
  /B.O /B.O /B.O /B.O /B.O /B.I /B.I /B.I
  /B.O /B.I /B.I /B.I /B.O /B.I /B.O /B.I
  /B.I /B.I /B.O /B.O /B.O /B.O /B.I /B.I
  /B.I /B.O /B.O /B.O /B.O /B.I /B.O /B.O
  /B.O /B.O /B.O /B.O /B.I /B.O /B.I /B.I
  /B.O /B.O /B.I /B.O /B.I /B.O /B.I /B.I
  /B.O /B.O /B.I /B.O /B.I /B.O /B.O /B.I
  B.0

@aa
  //B.peek C.32 ///C.5 C.5 B.suc B.0

aa
`;


console.log(L.reduce(term, 1));
