view share/delvs-master/delvs.rb @ 10288:2914125a0a85

<oerjan> le/rn tmp//tmp/ is a directory for files that are not worth saving in HackEgo history, but which should still survive a single command. Note that it interacts funnily with HackEgo\'s lock and re-run commit check: files can disappear if you don\'t know what you\'re doing. Basically, don\'t modify files inside and outside tmp/ in the same HackEgo command.
author HackBot
date Thu, 16 Feb 2017 17:28:09 +0000
parents 38a5b4d8a98e
children
line wrap: on
line source

#!/usr/bin/env ruby
# NOTE: this proram was just made for the lulz, PLEASE DO NOT USE THIS
# Please use the actually semi-well written delvs interpreter writtin in C, because this isn't even close to the actual delvs interpreter
require 'io/console'

class RuntimeData
  attr_accessor :c
  attr_accessor :v
  attr_accessor :i
  attr_accessor :f
  attr_accessor :p

  def initialize
    @c = ""
    @i = 0
    @v = Array.new 30000, 0
    @p = 15000
    @f = ""
  end
end

def dummy_lexer d
  while d.i <= d.c.length do
    return d.i if d.c[d.i] == ']'
    d.i += 1
  end
end

def lexer d
  while d.i <= d.c.length do
    case d.c[d.i]
      when '>' then
        d.p += 1

      when '<' then
        d.p -= 1

      when '+' then
        d.v[d.p] += 1

      when '-' then
        d.v[d.p] -= 1

      when '.' then
        print d.v[d.p].chr

      when ',' then
        d.v[d.p] = IO.console.getch.ord

      when '[' then
        r = d.i + 1
        d.i = dlexer d if !d.v[d.p]
        while d.v[d.p] != 0 do
          d.i = r
          d = lexer d
        end

      when ']' then
        return d
      
      else
        # Everything else is comments
    end
    d.i += 1
  end
end

# example usage:
# data = RuntimeData.new
# data.c = "+++++ +++++ [ > +++++ +++++ > + << - ] > ++++ . + . > ."
# lexer data