From c5fcf7179a83ef65c86c6a4a390029149e518649 Mon Sep 17 00:00:00 2001 From: Franciszek Malinka Date: Tue, 5 Oct 2021 21:49:54 +0200 Subject: Duzy commit ze smieciami --- semestr-3/pf/lista13/BF.he | 57 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 semestr-3/pf/lista13/BF.he (limited to 'semestr-3/pf/lista13') diff --git a/semestr-3/pf/lista13/BF.he b/semestr-3/pf/lista13/BF.he new file mode 100644 index 0000000..cf33e4f --- /dev/null +++ b/semestr-3/pf/lista13/BF.he @@ -0,0 +1,57 @@ +effect Reader X = + { ask : Unit => Option X + } + +let hReadString str c = + handle c () with + | ask () => fn pos => + if pos >= String.length str then + resume None pos + else + resume (Some (String.get pos str)) (pos+1) + | return x => fn _ => x + end 0 + +data rec BF = +| MoveR +| MoveL +| Inc +| Dec +| Output +| Input +| While of List BF + +let parse str = + let rec parse () = + match ask () with + | None => [] + | Some c => + if Char.equal c '>' then MoveR :: parse () + elif Char.equal c '<' then MoveL :: parse () + elif Char.equal c '+' then Inc :: parse () + elif Char.equal c '-' then Dec :: parse () + elif Char.equal c '.' then Output :: parse () + elif Char.equal c ',' then Input :: parse () + elif Char.equal c '[' then + begin let body = parse () in + While body :: parse () + end + elif Char.equal c ']' then [] + else parse () + end + in + handle parse () with hReadString str + +(** Odczytanie pojedynczego znaku ze standardowego wejścia *) +let tryReadChar () = + let str = input stdin 1 in + if String.length str = 1 then + Some (String.get 0 str) + else None + +(** Wypisanie pojedynczego znaku na standardowe wyjście *) +let printChar c = + outputString stdout (String.repeat 1 c) + +(* Do konwersji pomiędzy typami Char i Int możesz użyć funkcji +* Char.chr oraz Char.code *) \ No newline at end of file -- cgit v1.2.3