package eval

import (
	
	
	
)

// Command and process control.

// TODO(xiaq): Document "fg".

func () {
	addBuiltinFns(map[string]interface{}{
		// Command resolution
		"external":        external,
		"has-external":    hasExternal,
		"search-external": searchExternal,

		// Process control
		"fg":   fg,
		"exec": execFn,
		"exit": exit,
	})
}

//elvdoc:fn external
//
// ```elvish
// external $program
// ```
//
// Construct a callable value for the external program `$program`. Example:
//
// ```elvish-transcript
// ~> x = (external man)
// ~> $x ls # opens the manpage for ls
// ```
//
// @cf has-external search-external

func ( string) Callable {
	return NewExternalCmd()
}

//elvdoc:fn has-external
//
// ```elvish
// has-external $command
// ```
//
// Test whether `$command` names a valid external command. Examples (your output
// might differ):
//
// ```elvish-transcript
// ~> has-external cat
// ▶ $true
// ~> has-external lalala
// ▶ $false
// ```
//
// @cf external search-external

func ( string) bool {
	,  := exec.LookPath()
	return  == nil
}

//elvdoc:fn search-external
//
// ```elvish
// search-external $command
// ```
//
// Output the full path of the external `$command`. Throws an exception when not
// found. Example (your output might vary):
//
// ```elvish-transcript
// ~> search-external cat
// ▶ /bin/cat
// ```
//
// @cf external has-external

func ( string) (string, error) {
	return exec.LookPath()
}

//elvdoc:fn exit
//
// ```elvish
// exit $status?
// ```
//
// Exit the Elvish process with `$status` (defaulting to 0).

func ( *Frame,  ...int) error {
	 := 0
	switch len() {
	case 0:
	case 1:
		 = [0]
	default:
		return ErrArgs
	}

	preExit()
	os.Exit()
	// Does not return
	panic("os.Exit returned")
}

func ( *Frame) {
	 := .Evaler.DaemonClient()
	if  != nil {
		 := .Close()
		if  != nil {
			fmt.Fprintln(os.Stderr, )
		}
	}
}