443   | 
   443   | 
   444 def instrs(prog: String) : String =  | 
   444 def instrs(prog: String) : String =  | 
   445   prog.toList.map(instr).mkString  | 
   445   prog.toList.map(instr).mkString  | 
   446   | 
   446   | 
   447   | 
   447   | 
         | 
   448 // the mandelbrot.bf program is so large that  | 
         | 
   449 // it does not fit into the limitations of what the  | 
         | 
   450 // JVM imposes on methods.  | 
         | 
   451 //  | 
         | 
   452 // below it just about fits by optimising [-] loops  | 
         | 
   453 // and combining instructions  | 
         | 
   454   | 
   448 def splice(cs: List[Char], acc: List[(Char, Int)]) : List[(Char, Int)] = (cs, acc) match { | 
   455 def splice(cs: List[Char], acc: List[(Char, Int)]) : List[(Char, Int)] = (cs, acc) match { | 
   449   case (Nil, acc) => acc  | 
   456   case (Nil, acc) => acc  | 
   450   case (c :: cs, Nil) => splice(cs, List((c, 1)))  | 
   457   case (c :: cs, Nil) => splice(cs, List((c, 1)))  | 
   451   case (c :: cs, (d, n) :: acc) =>   | 
   458   case (c :: cs, (d, n) :: acc) =>   | 
   452     if (c == d) splice(cs, (c, n + 1) :: acc)  | 
   459     if (c == d) splice(cs, (c, n + 1) :: acc)  | 
   454 }  | 
   461 }  | 
   455   | 
   462   | 
   456 def spl(s: String) = splice(s.toList, Nil).reverse  | 
   463 def spl(s: String) = splice(s.toList, Nil).reverse  | 
   457   | 
   464   | 
   458 def instr2(c: Char, n: Int) : String = c match { | 
   465 def instr2(c: Char, n: Int) : String = c match { | 
   459   case '>' => "ptr := ptr + " + n.toString + ";"  | 
   466   case '>' => s"ptr := ptr + $n;"  | 
   460   case '<' => "ptr := ptr - " + n.toString + ";"  | 
   467   case '<' => s"ptr := ptr - $n;"  | 
   461   case '+' => "field[ptr] := field[ptr] + " + n.toString + ";"  | 
   468   case '0' => s"field[ptr] := 0;"  | 
   462   case '-' => "field[ptr] := field[ptr] - " + n.toString + ";"  | 
   469   case '+' => s"field[ptr] := field[ptr] + $n;"  | 
   463   case '.' => "x := field[ptr]; write x;" //* n  | 
   470   case '-' => s"field[ptr] := field[ptr] - $n;"  | 
   464   //case ',' => "*ptr = getchar();\n" * n  | 
   471   case '.' => s"x := field[ptr]; write x;"   | 
   465   case '['  => "while (field[ptr] != 0) do {" * n  | 
   472   case '['  => "while (field[ptr] != 0) do {" * n  | 
   466   case ']'  => "skip};" * n  | 
   473   case ']'  => "skip};" * n  | 
   467   case _ => ""  | 
   474   case _ => ""  | 
   468 }  | 
   475 }  | 
   469   | 
   476   | 
   470 def instrs2(prog: String) : String =  | 
   477 def instrs2(prog: String) : String =  | 
   471   spl(prog).map{ case (c, n) => instr2(c, n) }.mkString | 
   478   spl(prog.replaceAll("""\[-\]""", "0")).map{ case (c, n) => instr2(c, n) }.mkString | 
   472   | 
         | 
   473   | 
   479   | 
   474 def bf_str(prog: String) : String = { | 
   480 def bf_str(prog: String) : String = { | 
   475   "\n" ++  | 
   481   "\n" ++  | 
   476   //"new field[30000];\n" ++  | 
         | 
   477   "ptr := 15000;" ++  | 
   482   "ptr := 15000;" ++  | 
   478   instrs(prog) ++  | 
   483   instrs2(prog) ++  | 
   479   "skip"  | 
   484   "skip"  | 
   480 }  | 
   485 }  | 
   481   | 
   486   | 
   482 def bf_run(prog: String, name: String) = { | 
   487 def bf_run(prog: String, name: String) = { | 
   483   println("BF processing start") | 
   488   println("BF processing start") | 
   521       <<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<  | 
   526       <<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<  | 
   522       [-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]"""  | 
   527       [-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]"""  | 
   523   | 
   528   | 
   524 bf_run(bf2, "fibs")  | 
   529 bf_run(bf2, "fibs")  | 
   525   | 
   530   | 
   526 /*  | 
         | 
   527   | 
   531   | 
   528   | 
   532   | 
   529 bf_run("""      A mandelbrot set fractal viewer in brainf*** written by Erik Bosman | 
   533 bf_run("""      A mandelbrot set fractal viewer in brainf*** written by Erik Bosman | 
   530 +++++++++++++[->++>>>+++++>++>+<<<<<<]>>>>>++++++>--->>>>>>>>>>+++++++++++++++[[  | 
   534 +++++++++++++[->++>>>+++++>++>+<<<<<<]>>>>>++++++>--->>>>>>>>>>+++++++++++++++[[  | 
   531 >>>>>>>>>]+[<<<<<<<<<]>>>>>>>>>-]+[>>>>>>>>[-]>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+  | 
   535 >>>>>>>>>]+[<<<<<<<<<]>>>>>>>>>-]+[>>>>>>>>[-]>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+  | 
   670 -<<[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>  | 
   674 -<<[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>  | 
   671 >>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>[-]<<<++++  | 
   675 >>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<<<<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>[-]<<<++++  | 
   672 +[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<<  | 
   676 +[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<<  | 
   673 <<<<<]]>>>]""", "mand")  | 
   677 <<<<<]]>>>]""", "mand")  | 
   674   | 
   678   | 
   675 */  | 
   679   |