eval

package
v0.0.0-...-5da5f19 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 8, 2016 License: BSD-2-Clause Imports: 29 Imported by: 0

Documentation

Overview

Package eval handles evaluation of nodes and consists the runtime of the shell.

Index

Constants

View Source
const (
	Return flow = iota
	Break
	Continue
)

Control flows.

View Source
const FnPrefix = "&"

FnPrefix is the prefix for the variable names of functions. Defining a function "foo" is equivalent to setting a variable named FnPrefix + "foo".

View Source
const (
	NoPretty = util.MinInt
)

Variables

View Source
var (
	ErrArgs              = errors.New("args error")
	ErrInput             = errors.New("input error")
	ErrStoreNotConnected = errors.New("store not connected")
	ErrNoMatchingDir     = errors.New("no matching directory")
	ErrNotInSameGroup    = errors.New("not in the same process group")
	ErrInterrupted       = errors.New("interrupted")
)
View Source
var (
	ErrBadGlobPattern          = errors.New("bad GlobPattern; elvish bug")
	ErrCannotDetermineUsername = errors.New("cannot determine user name from glob pattern")
)
View Source
var (
	ErrCanOnlyAssignList          = errors.New("can only assign compatible values")
	ErrPathMustBeString           = errors.New("path must be string")
	ErrPathCannotContainColonZero = errors.New(`path cannot contain colon or \0`)
)

Errors

View Source
var (
	ErrMustFollowWildcard   = errors.New("must follow wildcard")
	ErrModifierMustBeString = errors.New("modifier must be string")
)
View Source
var (
	// ErrNeedIntIndex    = errors.New("need integer index")
	ErrBadIndex        = errors.New("bad index")
	ErrIndexOutOfRange = errors.New("index out of range")
)

Error definitions.

View Source
var BuiltinSpecialNames []string

BuiltinSpecialNames contains all names of builtin special forms. It is useful for the syntax highlighter.

View Source
var ErrArityMismatch = errors.New("arity mismatch")
View Source
var ErrBadBase = errors.New("bad base")
View Source
var ErrCdNoArg = errors.New("implicit cd accepts no arguments")
View Source
var (
	ErrIndexMustBeString = errors.New("index must be string")
)
View Source
var ErrMoreThanOneRest = errors.New("more than one @ lvalue")
View Source
var (
	ErrOnlyStrOrRat = errors.New("only str or rat may be converted to rat")
)

Error definitions.

View Source
var (
	ErrRoCannotBeSet = errors.New("read-only; cannot be set")
)
View Source
var ErrStoreUnconnected = errors.New("store unconnected")

ErrStoreUnconnected is thrown by ResolveVar when a shared: variable needs to be resolved but the store is not connected.

View Source
var (
	ErrValueMustBeString = errors.New("index must be string")
)
View Source
var Logger = util.GetLogger("[eval] ")
View Source
var OK = Error{nil}

OK is an alias for the zero value of Error.

Functions

func ClosePorts

func ClosePorts(ports []*Port)

ClosePorts closes a list of Ports.

func DeepEq

func DeepEq(a, b Value) bool

DeepEq compares two Value's deeply.

func IncIndent

func IncIndent(indent, inc int) int

func IsListOfFnValue

func IsListOfFnValue(v Value) error

func MakeVariableName

func MakeVariableName(splice bool, ns string, name string) string

func NewExternalCmdExit

func NewExternalCmdExit(name string, ws syscall.WaitStatus, pid int) error

func ParseAndFixListIndex

func ParseAndFixListIndex(s string, n int) (bool, int, int)

ParseAndFixListIndex parses a list index and returns whether the index is a slice and "real" (-1 becomes n-1) indicies. It throws errors when the index is invalid or out of range.

func ParseVariable

func ParseVariable(qname string) (splice bool, ns string, name string)

ParseVariable parses a variable name.

func PprintError

func PprintError(e error)

PprintError pretty prints an error. It understands specialized error types defined in this package.

func ToBool

func ToBool(v Value) bool

ToBool converts a Value to bool. When the Value type implements Bool(), it is used. Otherwise it is considered true.

func ToString

func ToString(v Value) string

ToString converts a Value to String. When the Value type implements String(), it is used. Otherwise Repr(NoPretty) is used.

func WrapFn

func WrapFn(inner interface{}) func(*EvalCtx, []Value)

WrapFn wraps an inner function into one suitable as a builtin function. It generates argument checking and conversion code according to the signature of the inner function. The inner function must accept evalCtx* as the first argument and return an exitus.

Types

type Bool

type Bool bool

Bool represents truthness.

func (Bool) Bool

func (b Bool) Bool() bool

func (Bool) Kind

func (Bool) Kind() string

func (Bool) Repr

func (b Bool) Repr(int) string

type Booler

type Booler interface {
	Bool() bool
}

Booler is anything that can be converted to a bool.

type BuiltinFn

type BuiltinFn struct {
	Name string
	Impl func(*EvalCtx, []Value)
}

BuiltinFn is a builtin function.

func (*BuiltinFn) Call

func (b *BuiltinFn) Call(ec *EvalCtx, args []Value)

Call calls a builtin function.

func (*BuiltinFn) Kind

func (*BuiltinFn) Kind() string

func (*BuiltinFn) Repr

func (b *BuiltinFn) Repr(int) string

type Closure

type Closure struct {
	ArgNames []string
	// The name for the rest argument. If empty, the function has fixed arity.
	// If equal to unnamedRestArg, the rest argument is unnamed but can be
	// accessed via $args.
	RestArg  string
	Op       Op
	Captured map[string]Variable
}

Closure is a closure defined in elvish script.

func (*Closure) Call

func (c *Closure) Call(ec *EvalCtx, args []Value)

Call calls a closure.

func (*Closure) Kind

func (*Closure) Kind() string

func (*Closure) Repr

func (c *Closure) Repr(int) string

type EnvPathList

type EnvPathList struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

EnvPathList is a variable whose value is constructed from an environment variable by splitting at colons. Changes to it are also propagated to the corresponding environment variable. Its elements cannot contain colons or \0; attempting to put colon or \0 in its elements will result in an error.

EnvPathList implements both Value and Variable interfaces. It also satisfied ListLike.

func (*EnvPathList) Elems

func (epl *EnvPathList) Elems() <-chan Value

func (*EnvPathList) Get

func (epl *EnvPathList) Get() Value

func (*EnvPathList) IndexOne

func (epl *EnvPathList) IndexOne(idx Value) Value

func (*EnvPathList) IndexSet

func (epl *EnvPathList) IndexSet(idx, v Value)

func (*EnvPathList) Iterate

func (epl *EnvPathList) Iterate(f func(Value) bool)

func (*EnvPathList) Kind

func (epl *EnvPathList) Kind() string

func (*EnvPathList) Len

func (epl *EnvPathList) Len() int

func (*EnvPathList) Repr

func (epl *EnvPathList) Repr(indent int) string

func (*EnvPathList) Set

func (epl *EnvPathList) Set(v Value)

type Error

type Error struct {
	Inner error
}

Error represents runtime errors in elvish constructs.

func (Error) Bool

func (e Error) Bool() bool

func (Error) Kind

func (Error) Kind() string

func (Error) Repr

func (e Error) Repr(indent int) string

type EvalCtx

type EvalCtx struct {
	*Evaler
	// contains filtered or unexported fields
}

EvalCtx maintains an Evaler along with its runtime context. After creation an EvalCtx is not modified, and new instances are created when needed.

func NewTopEvalCtx

func NewTopEvalCtx(ev *Evaler, name, text string, ports []*Port) *EvalCtx

NewTopEvalCtx creates a top-level evalCtx.

func (*EvalCtx) IterateInputs

func (ec *EvalCtx) IterateInputs(f func(Value))

IterateInput calls the passed function for each input element.

func (*EvalCtx) OutputChan

func (ec *EvalCtx) OutputChan() chan<- Value

OutputChan returns a channel onto which output can be written.

func (*EvalCtx) PCall

func (ec *EvalCtx) PCall(f Fn, args []Value) (err error)

func (*EvalCtx) PCaptureOutput

func (ec *EvalCtx) PCaptureOutput(f Fn, args []Value) (vs []Value, err error)

func (*EvalCtx) PEval

func (ec *EvalCtx) PEval(op Op) (err error)

PEval evaluates an op in a protected environment so that calls to errorf are wrapped in an Error.

func (*EvalCtx) ResolveVar

func (ec *EvalCtx) ResolveVar(ns, name string) Variable

ResolveVar resolves a variable. When the variable cannot be found, nil is returned.

type Evaler

type Evaler struct {
	Global  Namespace
	Modules map[string]Namespace

	Stub *stub.Stub
	// contains filtered or unexported fields
}

Evaler is used to evaluate elvish sources. It maintains runtime context shared among all evalCtx instances.

func NewEvaler

func NewEvaler(st *store.Store) *Evaler

NewEvaler creates a new Evaler.

func (*Evaler) AllExecutables

func (ev *Evaler) AllExecutables(names chan<- string)

AllExecutables writes the names of all executable files in the search path to a channel.

func (*Evaler) Compile

func (ev *Evaler) Compile(n *parse.Chunk) (Op, error)

Compile compiles elvish code in the global scope.

func (*Evaler) Eval

func (ev *Evaler) Eval(name, text string, n *parse.Chunk, ports []*Port) error

Eval evaluates a chunk node n. The supplied name and text are used in diagnostic messages.

func (*Evaler) EvalInteractive

func (ev *Evaler) EvalInteractive(text string, n *parse.Chunk) error

func (*Evaler) Search

func (ev *Evaler) Search(exe string) (string, error)

Search tries to resolve an external command and return the full (possibly relative) path.

func (*Evaler) Source

func (ev *Evaler) Source(fname string) error

Source evaluates the content of a file.

func (*Evaler) SourceText

func (ev *Evaler) SourceText(src string) error

SourceText evaluates a chunk of elvish source.

type ExternalCmd

type ExternalCmd struct {
	Name string
}

ExternalCmd is an external command.

func (ExternalCmd) Call

func (e ExternalCmd) Call(ec *EvalCtx, argVals []Value)

Call calls an external command.

func (ExternalCmd) Kind

func (ExternalCmd) Kind() string

func (ExternalCmd) Repr

func (e ExternalCmd) Repr(int) string

type ExternalCmdExit

type ExternalCmdExit struct {
	syscall.WaitStatus
	CmdName string
	Pid     int
}

ExternalCmdExit contains the exit status of external commands. If the command was stopped rather than terminated, the Pid field contains the pid of the process.

func FakeExternalCmdExit

func FakeExternalCmdExit(name string, exit int, sig syscall.Signal) ExternalCmdExit

func (ExternalCmdExit) Error

func (exit ExternalCmdExit) Error() string

type File

type File struct {
	// contains filtered or unexported fields
}

func (File) Kind

func (File) Kind() string

func (File) Repr

func (f File) Repr(int) string

type Fn

type Fn interface {
	Call(ec *EvalCtx, args []Value)
}

Fn is anything may be called on an evalCtx with a list of Value's.

type FnAsIndexer

type FnAsIndexer struct {
	Fn
	// contains filtered or unexported fields
}

FnAsIndexer adapts a Fn to an Indexer.

func (FnAsIndexer) Index

func (ci FnAsIndexer) Index(idx []Value) []Value

type FnValue

type FnValue interface {
	Value
	Fn
}

type GlobPattern

type GlobPattern glob.Pattern

GlobPattern is en ephemeral Value generated when evaluating tilde and wildcards.

func (GlobPattern) Index

func (gp GlobPattern) Index(modifiers []Value) []Value

func (GlobPattern) Kind

func (GlobPattern) Kind() string

func (GlobPattern) Repr

func (gp GlobPattern) Repr(int) string

type HasKeyer

type HasKeyer interface {
	HasKey(k Value) bool
}

type IndexOneer

type IndexOneer interface {
	IndexOne(idx Value) Value
}

IndexOneer is anything that can be indexed by one Value and yields one Value.

type IndexOneerIndexer

type IndexOneerIndexer struct {
	IndexOneer
}

IndexOneerIndexer adapts an IndexOneer to an Indexer by calling all the indicies on the IndexOner and collect the results.

func (IndexOneerIndexer) Index

func (ioi IndexOneerIndexer) Index(vs []Value) []Value

type IndexSetter

type IndexSetter interface {
	IndexOneer
	IndexSet(idx Value, v Value)
}

IndexSetter is a Value whose elements can be get as well as set.

type Indexer

type Indexer interface {
	Index(idx []Value) []Value
}

Indexer is anything that can be indexed by Values and yields Values.

type IndexerAsFn

type IndexerAsFn struct {
	Indexer
}

IndexerAsFn adapts an Indexer to a Fn.

func (IndexerAsFn) Call

func (ic IndexerAsFn) Call(ec *EvalCtx, args []Value)

type Iterator

type Iterator interface {
	Iterate(func(Value) bool)
}

Iterator is anything that can be iterated.

type IteratorValue

type IteratorValue interface {
	Iterator
	Value
}

type Kinder

type Kinder interface {
	Kind() string
}

Kinder is anything with kind string.

type LValuesOp

type LValuesOp struct {
	Func       LValuesOpFunc
	Begin, End int
}

VariablesOp is an operation on an EvalCtx that produce Variable's.

func (LValuesOp) Exec

func (op LValuesOp) Exec(ec *EvalCtx) []Variable

type LValuesOpFunc

type LValuesOpFunc func(*EvalCtx) []Variable

type Lener

type Lener interface {
	Len() int
}

Lener is anything with a length.

type List

type List struct {
	// contains filtered or unexported fields
}

List is a list of Value's.

func NewList

func NewList(vs ...Value) List

NewList creates a new List.

func (List) IndexOne

func (l List) IndexOne(idx Value) Value

func (List) IndexSet

func (l List) IndexSet(idx Value, v Value)

func (List) Iterate

func (l List) Iterate(f func(Value) bool)

func (List) Kind

func (List) Kind() string

func (List) Len

func (l List) Len() int

func (List) MarshalJSON

func (l List) MarshalJSON() ([]byte, error)

func (List) Repr

func (l List) Repr(indent int) string

type ListLike

type ListLike interface {
	Lener
	Iterator
	IndexOneer
}

type ListReprBuilder

type ListReprBuilder struct {
	Indent int
	// contains filtered or unexported fields
}

ListReprBuilder helps to build Repr of list-like Values.

func (*ListReprBuilder) String

func (b *ListReprBuilder) String() string

func (*ListReprBuilder) WriteElem

func (b *ListReprBuilder) WriteElem(v string)

type Map

type Map struct {
	// contains filtered or unexported fields
}

Map is a map from string to Value.

func NewMap

func NewMap(inner map[Value]Value) Map

NewMap creates a new Map.

func (Map) HasKey

func (m Map) HasKey(k Value) bool

func (Map) IndexOne

func (m Map) IndexOne(idx Value) Value

func (Map) IndexSet

func (m Map) IndexSet(idx Value, v Value)

func (Map) Kind

func (Map) Kind() string

func (Map) Len

func (m Map) Len() int

func (Map) MarshalJSON

func (m Map) MarshalJSON() ([]byte, error)

func (Map) Repr

func (m Map) Repr(indent int) string

type MapLike

type MapLike interface {
	Lener
	IndexOneer
	HasKeyer
}

type MapReprBuilder

type MapReprBuilder struct {
	ListReprBuilder
}

MapReprBuilder helps building the Repr of a Map. It is also useful for implementing other Map-like values. The zero value of a MapReprBuilder is ready to use.

func (*MapReprBuilder) String

func (b *MapReprBuilder) String() string

func (*MapReprBuilder) WritePair

func (b *MapReprBuilder) WritePair(k, v string)

type MapStringString

type MapStringString map[string]string

MapStringString implements MapLike for map[string]string.

func (MapStringString) HasKey

func (m MapStringString) HasKey(idx Value) bool

func (MapStringString) IndexOne

func (m MapStringString) IndexOne(idx Value) Value

func (MapStringString) IndexSet

func (m MapStringString) IndexSet(idx Value, val Value)

func (MapStringString) Kind

func (MapStringString) Kind() string

func (MapStringString) Len

func (m MapStringString) Len() int

func (MapStringString) Repr

func (m MapStringString) Repr(indent int) string

type MultiError

type MultiError struct {
	Errors []Error
}

multiError is multiple errors packed into one. It is used for reporting errors of pipelines, in which multiple forms may error.

func (MultiError) Error

func (me MultiError) Error() string

func (MultiError) Repr

func (me MultiError) Repr(indent int) string

type Namespace

type Namespace map[string]Variable

Namespace is a map from name to variables.

func Builtin

func Builtin() Namespace

Builtin returns the builtin namespace.

type Op

type Op struct {
	Func       OpFunc
	Begin, End int
}

Op is an operation on an EvalCtx.

func (Op) Exec

func (op Op) Exec(ec *EvalCtx)

type OpFunc

type OpFunc func(*EvalCtx)

type Pipe

type Pipe struct {
	// contains filtered or unexported fields
}

func (Pipe) Kind

func (Pipe) Kind() string

func (Pipe) Repr

func (p Pipe) Repr(int) string

type Port

type Port struct {
	File      *os.File
	Chan      chan Value
	CloseFile bool
	CloseChan bool
}

Port conveys data stream. It always consists of a byte band and a channel band.

func (*Port) Close

func (p *Port) Close()

Close closes a Port.

func (*Port) Fork

func (p *Port) Fork() *Port

Fork returns a copy of a Port with the Close* flags unset.

type PwdVariable

type PwdVariable struct{}

PwdVariable is a variable whose value always reflects the current working directory. Setting it changes the current working directory.

func (PwdVariable) Get

func (PwdVariable) Get() Value

func (PwdVariable) Set

func (PwdVariable) Set(v Value)

type Rat

type Rat struct {
	// contains filtered or unexported fields
}

Rat is a rational number.

func ToRat

func ToRat(v Value) (Rat, error)

ToRat converts a Value to rat. A str can be converted to a rat if it can be parsed. A rat is returned as-is. Other types of values cannot be converted.

func (Rat) Kind

func (Rat) Kind() string

func (Rat) Repr

func (r Rat) Repr(int) string

func (Rat) String

func (r Rat) String() string

type Reprer

type Reprer interface {
	// Repr returns a string that represents a Value. The string either be a
	// literal of that Value that is preferably deep-equal to it (like `[a b c]`
	// for a list), or a string enclosed in "<>" containing the kind and
	// identity of the Value(like `<fn 0xdeadcafe>`).
	//
	// If indent is at least 0, it should be pretty-printed with the current
	// indentation level of indent; the indent of the first line has already
	// been written and shall not be written in Repr. The returned string
	// should never contain a trailing newline.
	Repr(indent int) string
}

Reprer is anything with a Repr method.

type String

type String string

String is just a string.

func (String) Call

func (s String) Call(ec *EvalCtx, args []Value)

Call resolves a command name to either a Fn variable or external command and calls it.

func (String) Kind

func (String) Kind() string

func (String) Len

func (s String) Len() int

func (String) Repr

func (s String) Repr(int) string

func (String) String

func (s String) String() string

type Stringer

type Stringer interface {
	String() string
}

Stringer is anything that can be converted to a string.

type Struct

type Struct struct {
	FieldNames []string
	Fields     []Variable
}

Struct is like a Map with fixed keys.

func (*Struct) HasKey

func (s *Struct) HasKey(k Value) bool

func (*Struct) IndexOne

func (s *Struct) IndexOne(idx Value) Value

func (*Struct) IndexSet

func (s *Struct) IndexSet(idx Value, v Value)

func (*Struct) Kind

func (*Struct) Kind() string

func (*Struct) Len

func (s *Struct) Len() int

func (*Struct) Repr

func (s *Struct) Repr(indent int) string

type Value

type Value interface {
	Kinder
	Reprer
}

Value is an elvish value.

func FromJSONInterface

func FromJSONInterface(v interface{}) Value

FromJSONInterface converts a interface{} that results from json.Unmarshal to a Value.

type ValuesOp

type ValuesOp struct {
	Func       ValuesOpFunc
	Begin, End int
}

ValuesOp is an operation on an EvalCtx that produce Value's.

func (ValuesOp) Exec

func (op ValuesOp) Exec(ec *EvalCtx) []Value

type ValuesOpFunc

type ValuesOpFunc func(*EvalCtx) []Value

type Variable

type Variable interface {
	Set(v Value)
	Get() Value
}

Variable represents an elvish variable.

func NewPtrVariable

func NewPtrVariable(v Value) Variable

func NewPtrVariableWithValidator

func NewPtrVariableWithValidator(v Value, vld func(Value) error) Variable

func NewRoVariable

func NewRoVariable(v Value) Variable

Notes

Bugs

  • We rely on the fact that os.Unsetenv always returns nil.

  • When evaluating closures, async access to global variables and ports can be problematic.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL