F#问题中的BF解释器



好吧,我正在做一个小项目,正如你在标题中所说,我正在用f#做一个BrainFail interper,我对这种语言很陌生,但这很有趣,除了你和编译器打交道,但我已经习惯了,因为我曾经使用过rust,但抛开这一点不谈,我只执行了一次符号。我知道这不是有效的或完全功能,但现在我只是去工作。这是我的代码
main.fs

open System
open System.IO
let mutable reg : int array = Array.zeroCreate 50
let mutable ptr = 0
let mutable larr : int array = Array.zeroCreate 50
let mutable lptr = 0
let mutable pc = 0
let result = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."
let prog = result.ToCharArray()
let startLoop = 
larr.[lptr] <- pc
printfn "STARTING LOOP AT %d" larr.[lptr]
lptr <- lptr + 1
let doEnd = 
pc <- larr.[lptr]
while larr.[lptr - 1] > 0 do
ptr <- larr.[lptr - 1]
larr.[lptr - 1] <- larr.[lptr - 1] - 1
let endLoop =
lptr <- lptr - 1
if reg.[ptr] = 0 then pc <- pc  
else doEnd
let doPlus =
reg.[ptr] <- (reg.[ptr] + 1) % 265
printfn "ADDING"
let doMinus = 
reg.[ptr] <- (reg.[ptr] - 1) % 265
printfn "SUB"
let doInc = 
ptr <- (ptr + 1) % 265
printfn "INC"
let doDec = 
ptr <- (ptr - 1) % 265
printfn "MINUS"
let doPrt = 
printfn "%c" (reg.[ptr] |> char)
let doSloop =
startLoop
printfn "START LOOP"
let doEloop = 
endLoop
printfn "END LOOP"
let exec = 
while pc < prog.Length do
let i = prog.[pc]
if i = '+' then doPlus
elif i = '-' then doMinus
elif i = '>' then doInc
elif i = '<' then doDec
elif i = '.' then doPrt
elif i = '[' then doSloop
elif i = ']' then doEloop
else 1 |> ignore
pc <- pc + 1
exec

欢迎来到F#社区。

这是一种更实用的程序编写风格。这只是一个开始,但我希望它能给你一些关于如何继续的想法。最终,如果可能的话,您将希望避免可变值,并且可能要做到这一点的第一步是编写具有除unit之外的参数的函数。

let result = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."
let doPlus () =
// reg.[ptr] <- (reg.[ptr] + 1) % 265
printfn "ADDING"
let doMinus () = 
// reg.[ptr] <- (reg.[ptr] - 1) % 265
printfn "SUB"
let doDefault () = printfn ""
let funcs = 
[|
'+', doPlus
'-', doMinus
|] |> Map.ofArray
let exec () =
result
|> Seq.iteri (fun i c -> 
printf "%03d: " i
match funcs.TryFind(c) with
| Some func -> func ()
| None -> doDefault ()
)
exec ()

最新更新