Machine Brainfuck en Caml
[code]type mot = BD | BG | Bp | Bm | Bifnotzero | Belse | Bget | Bput;;
let rec cherche_fi = function
| Belse::suite -> suite
| _::suite -> cherche_fi suite;;
let rec etape ruban_gauche mot ruban_droit pile instruction =
match ruban_gauche,mot,ruban_droit,pile,instruction with
| ,,,,[] -> (ruban_gauche,mot,ruban_droit)
(* décalage à droite )
| ,a,[],,(BD::suite) -> etape (a::ruban_gauche) 0 [] pile suite
| ,a,(b::p),,(BD::suite) -> etape (a::ruban_gauche) b p pile suite
( décalage à gauche )
| [],a,,,(BG::suite) -> etape [] 0 (a::ruban_droit) pile suite
| (b::p),a,,,(BG::suite) -> etape p b (a::ruban_droit) pile suite
( addition et soustraction )
| ,,,,(Bp::suite) -> etape ruban_gauche (mot+1) ruban_droit pile suite
| ,,,,(Bm::suite) -> etape ruban_gauche (mot-1) ruban_droit pile suite
( Impression )
| ,,,,(Bput::suite) -> ((print_int mot);print_newline ();(etape ruban_gauche mot ruban_droit pile suite))
( Lecture )
| ,,,,(Bget::suite) -> etape ruban_gauche ((print_string “->”); read_int ()) ruban_droit pile suite
( Crochet ouvrant )
| ,0,,,(Bifnotzero::suite) -> etape ruban_gauche mot ruban_droit pile (cherche_fi suite)
| ,,,_,(Bifnotzero::suite) -> etape ruban_gauche mot ruban_droit (suite::pile) suite
( crochet fermant *)
| ,0,,,(Belse::suite) -> etape ruban_gauche mot ruban_droit (tl pile) suite
| ,,,,(Belse::) -> etape ruban_gauche mot ruban_droit pile (hd pile)
;;
let transfo = function
| > -> BD
| < -> BG
| + -> Bp
| - -> Bm
| , -> Bget
| . -> Bput
| [ -> Bifnotzero
| ] -> Belse;;
let b_to_list s =
let rec boucle l = function
| (-1) -> l
| i -> (boucle ((transfo s.[i])::l) (i-1))
in (boucle [] ((string_length s)-1));;
let execute pg pd s = let rbg,m,rbd = etape (tl (rev pg)) (hd (rev pg)) pd [] (b_to_list s) in (rev (m::rbg)),rbd;;[/code]
Un exemple:
[quote]#execute [6;7] [] “[->+>+<<]>>[-<<+>>]<”;;
- : int list * int list = [6; 7; 7], [0]
#[/quote]
execute prend le ruban à gauche, à droite et le programme. Ainsi, ici, le ruban est
…,0,0,0,6,7,0,0,0… avec le pointeur sur 7 et la sortie est
…,0,0,0,6,7,7,0,0,0… avec le pointeur sur 7 (le programme double le sommet de la «pile»). Plus simple que Perl, ça 