code: func (p *parser) parseBind(binds *ast.LocalBinds) error {
  	varID, err := p.popExpect(tokenIdentifier)
  	if err != nil {
  		return err
  	}
  	for _, b := range *binds {
  		if b.Variable == ast.Identifier(varID.data) {
  			return MakeStaticError(fmt.Sprintf("Duplicate local var: %v", varID.data), varID.loc)
  		}
  	}
  
  	var fun *ast.Function
  	if p.peek().kind == tokenParenL {
  		p.pop()
  		params, gotComma, err := p.parseParameters("function parameter")
  		if err != nil {
  			return err
  		}
  		fun = &ast.Function{
  			Parameters:    *params,
  			TrailingComma: gotComma,
  		}
  	}
  
  	_, err = p.popExpectOp("=")
  	if err != nil {
  		return err
  	}
  	body, err := p.parse(maxPrecedence)
  	if err != nil {
  		return err
  	}
  
  	if fun != nil {
  		fun.NodeBase = ast.NewNodeBaseLoc(locFromTokenAST(varID, body))
  		fun.Body = body
  		*binds = append(*binds, ast.LocalBind{
  			Variable: ast.Identifier(varID.data),
  			Body:     body,
  			Fun:      fun,
  		})
  	} else {
  		*binds = append(*binds, ast.LocalBind{
  			Variable: ast.Identifier(varID.data),
  			Body:     body,
  		})
  	}
  
  	return nil
  }
docs: // TODO(sbarzowski) add location to all individual binds