Skip to content

Instantly share code, notes, and snippets.

@thinca
Created April 1, 2009 16:16
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 thinca/88764 to your computer and use it in GitHub Desktop.
Save thinca/88764 to your computer and use it in GitHub Desktop.
function! Bf()
let bf = {}
function! bf.inc()
let self[self.ptr] = get(self, self.ptr, 0) + 1
endfunction
function! bf.dec()
let self[self.ptr] = get(self, self.ptr, 0) - 1
endfunction
function! bf.next()
let self.ptr += 1
endfunction
function! bf.prev()
let self.ptr -= 1
endfunction
function! bf.putc()
echon nr2char(get(self, self.ptr, 0))
endfunction
function! bf.getc()
let self[self.ptr] = getchar()
endfunction
function! bf.while()
if get(self, self.ptr, 0)
call add(self.stack, self.pos)
else
let nest = 1
let p = self.pos
while nest
let p = match(self.src, '[][]', p + 1)
if p == -1
throw 'error: "]" is missing.'
endif
let nest += self.src[p] == '[' ? 1 : -1
endwhile
let self.pos = p
endif
endfunction
function! bf.end()
if empty(self.stack)
throw 'error: "]" appeared before "[".'
endif
let self.pos = remove(self.stack, -1) - 1
endfunction
let bf['+'] = bf.inc | unlet bf.inc
let bf['-'] = bf.dec | unlet bf.dec
let bf['>'] = bf.next | unlet bf.next
let bf['<'] = bf.prev | unlet bf.prev
let bf['.'] = bf.putc | unlet bf.putc
let bf[','] = bf.getc | unlet bf.getc
let bf['['] = bf.while | unlet bf.while
let bf[']'] = bf.end | unlet bf.end
function! bf.run(src)
let self.ptr = 0 " heep pointer
let self.pos = 0 " program position
let self.stack = [] " loop stack
let self.src = substitute(a:src, '[^][+-><.,]', '', 'g') " delete noise data
try
while self.pos < strlen(self.src)
call self[self.src[self.pos]]()
let self.pos += 1
endwhile
catch
echoerr v:exception
endtry
endfunction
return bf
endfunction
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment