⚠️ Warning: This is a draft ⚠️
This means it might contain formatting issues, incorrect code, conceptual problems, or other severe issues.
If you want to help to improve and eventually enable this page, please fork RosettaGit's repository and open a merge request on GitHub.
{{implementation|Brainfuck}}{{collection|RCBF}} An implementation of [[Brainfuck]] in [[F Sharp|F#]].
let RCBF (pgmStr : string) = let pgm = Seq.toArray pgmStr // Turn program into an array let ptr = ref 0 // Pointer into input let ip = ref 0 // Instruction Pointer let input = ref (Array.create 100 0)
let InputNumber() = let mutable fValid = false let mutable num = 0 printfn "Enter a valid number" fValid <- Int32.TryParse(Console.ReadLine(), &num); while not fValid do printfn "Invalid input. Please enter a valid number" fValid <- Int32.TryParse(Console.ReadLine(), &num); num let InputAscii() = printfn "Enter an ascii character" let chOut = (Console.ReadKey().KeyChar) printfn "" int chOut let AdvanceIp() = ip := !ip + 1 // Advance IP let RetreatIp() = ip := !ip - 1 // Decrement IP let SkipBrackets fForward = if (!input).[!ptr] <> 0 then // If we have a 0 input AdvanceIp() // Then just advance to next instruction else // otherwise let fnMove = if fForward then AdvanceIp else RetreatIp // get the appropriate function to move forward or backward let mutable cBrackets = 1 // Count of brackets we've seen while cBrackets > 0 do // While we have unmatched brackets fnMove() // move to the next character if !ip >= 0 && !ip < pgm.Length then // and if we're still within range match pgm.[!ip] with // look at the character | '[' -> cBrackets <- cBrackets + 1 // If it's a '[' then count up brackets | ']' -> cBrackets <- cBrackets - 1 // If it's a ']' then count down brackets | _ -> ignore(0) // Ignore anything else AdvanceIp() // When we're on the matching bracket, skip to the next instruction let MovePtr fRight = if fRight then ptr := !ptr + 1 if !ptr >= (!input).Length then Array.Resize(input, (!input).Length + 20) else ptr := !ptr - 1 if !ptr < 0 then let newInput = Array.create ((!input).Length + 20) 0 Array.ConstrainedCopy(!input, 0, newInput, 20, (!input).Length) ptr := 19 let interpretCmd() = match pgm.[!ip] with | '>' -> MovePtr true; AdvanceIp() | '<' -> MovePtr false; AdvanceIp() | '+' -> (!input).[!ptr] <- (!input).[!ptr] + 1; AdvanceIp() | '-' -> (!input).[!ptr] <- (!input).[!ptr] - 1; AdvanceIp() | '.' -> printf "%c" (char (!input).[!ptr]); AdvanceIp() | ',' -> (!input).[!ptr] <- InputNumber(); AdvanceIp() | '~' -> (!input).[!ptr] <- InputAscii(); AdvanceIp() | '[' -> SkipBrackets true | ']' -> SkipBrackets false | _ -> AdvanceIp() while !ip >= 0 && !ip < pgm.Length do interpretCmd()
</div>
Hello world in RCBF (stolen from the Wiki site):
<div style='width: full; overflow: scroll'>
```fsharp
let pgmHelloWorld = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."
let tape = Array.create 5 0
Rcbf pgmHelloWorld tape