code: func interpolationFuncJoin() ast.Function {
  	return ast.Function{
  		ArgTypes:     []ast.Type{ast.TypeString},
  		Variadic:     true,
  		VariadicType: ast.TypeList,
  		ReturnType:   ast.TypeString,
  		Callback: func(args []interface{}) (interface{}, error) {
  			var list []string
  
  			if len(args) < 2 {
  				return nil, fmt.Errorf("not enough arguments to join()")
  			}
  
  			for _, arg := range args[1:] {
  				for _, part := range arg.([]ast.Variable) {
  					if part.Type != ast.TypeString {
  						return nil, fmt.Errorf(
  							"only works on flat lists, this list contains elements of %s",
  							part.Type.Printable())
  					}
  					list = append(list, part.Value.(string))
  				}
  			}
  
  			return strings.Join(list, args[0].(string)), nil
  		},
  	}
  }
docs: // interpolationFuncJoin implements the "join" function that allows
  // multi-variable values to be joined by some character.