package eval

import (
	

	
	
)

func ( *Evaler) ( *parse.Compound) (string, bool) {
	return .PurelyEvalPartialCompound(, -1)
}

func ( *Evaler) ( *parse.Compound,  int) (string, bool) {
	 := false
	 := ""
	for ,  := range .Indexings {
		if len(.Indicies) > 0 {
			return "", false
		}
		if  >= 0 && .To >  {
			break
		}
		switch .Head.Type {
		case parse.Tilde:
			 = true
		case parse.Bareword, parse.SingleQuoted, parse.DoubleQuoted:
			 += .Head.Value
		case parse.Variable:
			if  == nil {
				return "", false
			}
			 := .PurelyEvalPrimary(.Head)
			if ,  := .(string);  {
				 += 
			} else {
				return "", false
			}
		default:
			return "", false
		}
	}
	if  {
		 := strings.Index(, "/")
		if  == -1 {
			 = len()
		}
		 := [:]
		,  := fsutil.GetHome()
		if  != nil {
			return "", false
		}
		 =  + [:]
	}
	return , true
}

// PurelyEvalPrimary evaluates a primary node without causing any side effects.
// If this cannot be done, it returns nil.
//
// Currently, only string literals and variables with no @ can be evaluated.
func ( *Evaler) ( *parse.Primary) interface{} {
	switch .Type {
	case parse.Bareword, parse.SingleQuoted, parse.DoubleQuoted:
		return .Value
	case parse.Variable:
		,  := SplitSigil(.Value)
		if  != "" {
			return nil
		}
		 := &Frame{Evaler: , local: .Global(), up: new(Ns)}
		 := resolveVarRef(, , nil)
		if  != nil {
			 := deref(, )
			if  == nil {
				return nil
			}
			return .Get()
		}
	}
	return nil
}