code: func (g *Graph) assign(p *Graph, v interface{}, op int) interface{} {
  
  	if op == '=' {
  		return g.set(p, v)
  	}
  
  	// if p doesn't exist, just set it to the value given
  	left, _ := g.getPath(p)
  	if left != nil {
  		return g.set(p, calc(left.Out[0].This, v, op))
  	}
  
  	switch op {
  	case '+':
  		return g.set(p, v)
  	case '-':
  		return g.set(p, calc(0, v, '-'))
  	case '*':
  		return g.set(p, 0)
  	case '/':
  		return g.set(p, "infinity")
  	case '%':
  		return g.set(p, "undefined")
  	}
  
  	return nil
  }
docs: // assign modifies the context graph