Skip to content

Instantly share code, notes, and snippets.

@prologic
Created February 11, 2019 15:25
Show Gist options
  • Save prologic/2d667a243d623b37e1098c948af363cc to your computer and use it in GitHub Desktop.
Save prologic/2d667a243d623b37e1098c948af363cc to your computer and use it in GitHub Desktop.
Brainfuck in Monkey Lang
#!./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