func (ec EvalCtx) WithTrail(t string) EvalCtx {
	newEC := ec
	trailCopy := make([]string, 0, len(ec.Trail)+1)
	for _, val := range ec.Trail {
		trailCopy = append(trailCopy, val)
	}
	newEC.Trail = append(trailCopy, t)
	return newEC
}
func (ec EvalCtx) WithTrail(t string) EvalCtx {
	newEC := ec
	trailCopy := make([]string, 0, len(ec.Trail)+1)
	for _, val := range ec.Trail {
		trailCopy = append(trailCopy, val)
	}
	newEC.Trail = append(trailCopy, t)
	return newEC
}
// WithTrail creates a new context with trail appended to