Skip to content

Instantly share code, notes, and snippets.

@drguildo
Last active March 21, 2020 21:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save drguildo/212d14b724e85c833efd6e524290276d to your computer and use it in GitHub Desktop.
Save drguildo/212d14b724e85c833efd6e524290276d to your computer and use it in GitHub Desktop.
import os
import streams
import system
import tables
var data: array[30_000, byte]
var dataPointer: int = 0
var instructions: seq[char]
var instructionPointer: int = 0
proc panic(message: string) =
stderr.writeLine("ERROR: " & message)
system.quit(-1)
proc incrementByte() =
inc(data[dataPointer])
proc decrementByte() =
dec(data[dataPointer])
proc outputByte() =
stdout.write(data[dataPointer])
proc incrementDataPointer() =
inc(dataPointer)
proc decrementDataPointer() =
dec(dataPointer)
proc conditionalJumpForward() =
if data[dataPointer] == 0:
var nestedPairs = 1
while instructions[instructionPointer] != ']' and nestedPairs != 0:
inc(instructionPointer)
if instructions[instructionPointer] == '[':
inc(nestedPairs)
elif instructions[instructionPointer] == ']':
dec(nestedPairs)
proc conditionalJumpBackwards() =
if data[dataPointer] != 0:
var nestedPairs = 1
while instructions[instructionPointer] != '[' and nestedPairs != 0:
dec(instructionPointer)
if instructions[instructionPointer] == ']':
inc(nestedPairs)
elif instructions[instructionPointer] == '[':
dec(nestedPairs)
proc readByte() =
var buf: array[1, byte]
let numBytesRead = stdin.readBytes(buf, 0, 1)
if numBytesRead != 1:
panic("Failed to read byte from stdin.")
data[dataPointer] = buf[0]
var instructionToProc = {
'+': incrementByte,
'-': decrementByte,
'>': incrementDataPointer,
'<': decrementDataPointer,
'[': conditionalJumpForward,
']': conditionalJumpBackwards,
',': readByte,
'.': outputByte
}.newTable
proc loadCode(filename: string): seq[char] =
var strm = newFileStream(filename, fmRead)
var sourceCode = strm.readAll()
strm.close()
for ch in sourceCode:
if instructionToProc.hasKey(ch):
result.add(ch)
when isMainModule:
instructions = loadCode(paramStr(1))
while true:
instructionToProc[instructions[instructionPointer]]()
inc(instructionPointer)
if instructionPointer >= len(instructions):
system.quit(0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment