class Necromancy::Necromancy

Public Class Methods

new(necromancy = "args", references = []) click to toggle source
# File lib/necromancy/necromancy.rb, line 8
def initialize(necromancy = "args", references = [])
  @necromancy = necromancy
  @references = references
end

Protected Instance Methods

add_val(v) click to toggle source
# File lib/necromancy/necromancy.rb, line 50
def add_val(v)
  i = @references.size
  @references[i] = v
  i
end
class() click to toggle source
# File lib/necromancy/necromancy.rb, line 38
def class
  @class ||= (class << self; self end).superclass
end
get_ref(i) click to toggle source
# File lib/necromancy/necromancy.rb, line 42
def get_ref(i)
  @references[i]
end
make_evaluable_literal(anyref) click to toggle source
# File lib/necromancy/necromancy.rb, line 56
def make_evaluable_literal(anyref)
  case anyref
  when nil, ::Integer, ::Float, ::Symbol
    anyref.inspect
  else
    i = add_val(anyref)
    "self.get_ref(i + #{i})"
  end
end
make_evaluable_string(anyref) click to toggle source
# File lib/necromancy/necromancy.rb, line 66
def make_evaluable_string(anyref)
  case anyref
  when Necromancy
    references = anyref.instance_eval {@references}
    necromancy = anyref.instance_eval {@necromancy}
    @references.concat(references)
    "stack << i; i = #{references.size}; xs = (#{necromancy}); i = stack.pop; xs"
  when ::Symbol
    "[:#{anyref}.to_proc.(*args)]"
  else
    prc = anyref.to_proc
    i = add_val(prc)
    "[self.get_ref(i + #{i}).(*args)]"
  end
end
method_missing(name, *args, &block) click to toggle source
# File lib/necromancy/necromancy.rb, line 13
def method_missing(name, *args, &block)
  getproc = ":#{name}.to_proc"

  if args.size == 0
    getargs = nil
  elsif args.size == 1
    getargs = ", (#{make_evaluable_literal(args[0])})"
  else
    getargs = ", *(#{make_evaluable_literal(args)})"
  end

  if block
    getblock = ", &(#{make_evaluable_literal(block)})"
  else
    getblock = nil
  end

  necromancy = "[#{getproc}.(*(#{@necromancy})#{getargs}#{getblock})]"
  self.class.new(necromancy, @references.dup)
end
set_ref(i, v) click to toggle source
# File lib/necromancy/necromancy.rb, line 46
def set_ref(i, v)
  @references[i] = v
end
to_proc() click to toggle source
# File lib/necromancy/necromancy.rb, line 34
def to_proc
  instance_eval("->(*args) { i = 0; stack = []; xs = (#{@necromancy}); xs.size == 1 ? xs.first : xs }")
end