Brainfuck Translator in Nimrod

I play with nim (at the time of writing it was also called nimrod), writing a Brainfuck interpreter in this language. Without implemented loops, I have:

import os, unsigned const RamSize = 200 type TRam = array[0..RamSize, int] var ram : TRam ip : int = 0 dp : int = 0 proc readCode(path: string) = var f : TFile = open(path) i : int = 0 while i < RamSize and not EndOfFile(f): ram[i] = ord(readChar(f)) inc(i) proc main(path: string) = readCode(path) while ip < RamSize: case chr(ram[ip]) of '>' : inc dp of '<' : dec dp of '+' : inc ram[dp] of '-' : dec ram[dp] of '.' : write stdout, chr(ram[dp]) else : nil inc(ip) echo() if paramcount() == 1: main(paramstr(1)) else: echo("usage: bfrun PATH") 

It compiles successfully, but when I add input to it, for example:

 > +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ +++++ . 

Which should print the character "A", it returns "N." Any ideas?

+7
source share
1 answer

If I understood correctly, it seems that dp set to 1, and then ram[dp] increased 65 times. But ram[dp] , aka ram[1] , starts with the second character of the program, which is the carriage return character (ASCII 13). A is ASCII 65, N is ASCII 78, and 65 + 13 is 78.

Install dp somewhere outside the program space before you start to expand the memory location, or use a separate RAM to store the program.

+6
source

All Articles