func (e *Eek) SetBaseBuildPath(baseBuildPath string) {
	e.baseBuildPath = baseBuildPath
}
SetBaseBuildPath set the base build path. Every so file generated from build will be stored into <baseBuildPath>/<name>/<name>.so
package eek
import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
	"go/build"
	"io/ioutil"
	"os"
	"os/exec"
	"path/filepath"
	"plugin"
	"reflect"
	"regexp"
	"runtime"
	"strings"
)
type eekType int
const (
	eekTypeSimple eekType = iota
	eekTypeComplex
)
var (
	regexFileName = regexp.MustCompile("[^A-Za-z0-9]+")
)
type Eek struct {
	name              string
	goBinaryPath      string
	functions         []Func
	variables         []Var
	packages          []string
	evaluationType    eekType
	evaluationFormula string
	baseBuildPath     string
	buildPath         string
	buildFilePath     string
	UseCachedBuildForSameFormula bool
}
type Func struct {
	Name         string
	BodyFunction string
}
type Var struct {
	Name         string
	Type         string
	DefaultValue interface{}
}
type ExecVar map[string]interface{}
func New(args ...string) *Eek {
	eek := new(Eek)
	if len(args) > 0 {
		eek.SetName(args[0])
	}
	eek.functions = make([]Func, 0)
	eek.variables = make([]Var, 0)
	eek.packages = make([]string, 0)
	eek.evaluationType = eekTypeSimple
	eek.UseCachedBuildForSameFormula = true
	eek.setDefaultGoBinaryPath()
	eek.setDefaultBaseBuildPath()
	return eek
}
func (e *Eek) setDefaultGoBinaryPath() {
	if root := build.Default.GOROOT; root != "" {
		e.goBinaryPath = filepath.Join(root, "bin", "go")
		return
	}
	if root := os.Getenv("GOROOT"); root != "" {
		e.goBinaryPath = filepath.Join(root, "bin", "go")
		return
	}
	e.goBinaryPath = "go"
}
func (e *Eek) setDefaultBaseBuildPath() {
	basePath := ""
	tmpFolderName := "go-eek-plugins"
	switch runtime.GOOS {
	case "darwin", "freebsd", "linux":
		basePath = os.Getenv("TMPDIR")
		if basePath == "" {
			tempFolder := "/tmp"
			if tempBasePath := filepath.Join(tempFolder, tmpFolderName); e.isPathExists(tempBasePath) {
				basePath = tempFolder
			} else if err := os.MkdirAll(tempBasePath, os.ModePerm); err == nil {
				basePath = tempFolder
			}
		}
	case "windows":
		basePath = os.Getenv("TEMP")
	default:
	}
	if basePath == "" {
		basePath = "./"
	}
	defaultBaseBuildPath := filepath.Join(basePath, tmpFolderName)
	e.SetBaseBuildPath(defaultBaseBuildPath)
}
func (e *Eek) SetName(name string) {
	e.name = name
}