Toy brainf**k interpreter; example app that can be modified without restarting
local cp = 1
local data = {}
local dp = 1
local code = '[->+<]'  -- add
data[1] = 3
data[2] = 4
--? local code = '++>++++[<+>-] # now print result\n ++++ ++++ [<+++ +++ > -] < .'  -- add 2 to 5
--? local code = '++>++++[<+>-]<.'

function rfind(s, pat, i)
  if i == nil then i = #s end
  while i > 0 do
    if s:sub(i,i) == pat then
      return i
    end
    i = i-1
  end
  return nil
end

function eval()
  print(cp, #code)
  while cp <= #code do
    local inst = code:sub(cp,cp)
    if inst == '<' then
      dp = dp-1
    elseif inst == '>' then
      dp = dp+1
    elseif inst == '+' then
      if data[dp] == nil then data[dp] = 0 end
      data[dp] = data[dp]+1
    elseif inst == '-' then
      if data[dp] == nil then data[dp] = 0 end
      data[dp] = data[dp]-1
    elseif inst == '[' then
      if data[dp] == 0 then
        cp = code:find(']', cp)
      end
    elseif inst == ']' then
      if data[dp] ~= 0 then
        cp = rfind(code, '[', cp)
      end
    elseif inst == '.' then
      print(string.char(data[dp]))
--?       print(data[dp])
    elseif inst == ',' then
      data[dp] = string.byte(io.read(1))
    elseif inst == '#' then
      cp = code:find('\n', cp)
    end
    cp = cp+1
  end
end

print(#arg)
if #arg > 0 then
  print(arg[1])
  local f = io.open(arg[1])
  if f == nil then
    print('could not open', arg[1])
    os.exit(1)
  end
  code = f:read('*a')
  eval()
end

print('---')
for i,n in ipairs(data) do
  print(i,n)
end