Created
February 11, 2019 15:25
-
-
Save prologic/2d667a243d623b37e1098c948af363cc to your computer and use it in GitHub Desktop.
Brainfuck in Monkey Lang
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!./monkey-lang | |
let fill = fn(x, i) { | |
let xs = [] | |
while (i > 0) { | |
xs = push(xs, x) | |
i = i - 1 | |
} | |
return xs | |
} | |
let buildJumpMap = fn(program) { | |
let lb = [] | |
let rb = [] | |
let n = 0 | |
while (n < len(program)) { | |
if (program[n] == "[") { | |
lb = push(lb, n) | |
} | |
if (program[n] == "]") { | |
rb = push(rb, n) | |
} | |
n = n + 1 | |
} | |
let jumps = {} | |
let i = 0 | |
while (i < len(lb)) { | |
jumps[lb[i]] = rb[i] | |
jumps[rb[i]] = lb[i] | |
i = i + 1 | |
} | |
return jumps | |
} | |
let printable = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" | |
let ord = fn(s) { | |
return printable[s] + 32 | |
} | |
let read = fn() { | |
let buf = input() | |
if (len(buf) > 0) { | |
return ord(buf[0]) | |
} | |
return 0 | |
} | |
let chr = fn(x) { | |
if (x < 32) { | |
return "??" | |
} | |
if (x > 127) { | |
return "??" | |
} | |
return printable[x - 32] | |
} | |
let write = fn(x) { | |
print(chr(x)) | |
} | |
let VM = fn(program) { | |
let jumps = buildJumpMap(program) | |
let ip = 0 | |
let dp = 0 | |
let memory = fill(0, 32) | |
while (ip < len(program)) { | |
let op = program[ip] | |
if (op == ">") { | |
dp = dp + 1 | |
} else if (op == "<") { | |
dp = dp - 1 | |
} else if (op == "+") { | |
memory[dp] = memory[dp] + 1 | |
} else if (op == "-") { | |
memory[dp] = memory[dp] - 1 | |
} else if (op == ".") { | |
write(memory[dp]) | |
} else if (op == ",") { | |
memory[dp] = read() | |
} else if (op == "[") { | |
if (memory[dp] == 0) { | |
ip = jumps[ip] | |
} | |
} else if (op == "]") { | |
if (memory[dp] != 0) { | |
ip = jumps[ip] | |
} | |
} | |
ip = ip + 1 | |
} | |
print("memory:") | |
print(memory) | |
} | |
// ??? | |
// let program = "+++++>+++[-<->]<." | |
// Hello World | |
// let program = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++." | |
// 2 + 5 | |
let program = "++> +++++ [<+>-] ++++++++ [<++++++>-] < ." | |
VM(program) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment