value

package
v0.3.4 Latest Latest
Warning

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

Go to latest
Published: Jan 17, 2024 License: BSD-3-Clause Imports: 15 Imported by: 17

Documentation

Index

Constants

This section is empty.

Variables

View Source
var BinaryOps = make(map[string]BinaryOp)
View Source
var IvyEval func(context Context, s string) Value

Implemented in package run, handled as a func to avoid a dependency loop.

View Source
var (
	MaxBigInt63 = big.NewInt(int64(^uint64(0) >> 1)) // Used in ../parse/special.go

)
View Source
var UnaryOps = make(map[string]UnaryOp)

Functions

func Errorf

func Errorf(format string, args ...interface{})

Errorf panics with the formatted string, with type Error.

func IndexAssign added in v0.1.12

func IndexAssign(context Context, top, left Expr, index []Expr, right Expr, rhs Value)

IndexAssign handles general assignment to indexed expressions on the LHS. Left and index will be evaluated (right to left), while top is only for its ProgString method. The caller must check that left is a variable expression, so that the assignment is not being written into a temporary.

func IsScalarType added in v0.3.0

func IsScalarType(v Value) bool

IsScalarType reports whether u is an actual scalar, an int or float etc.

func MaxParallelismForTesting added in v0.1.12

func MaxParallelismForTesting()

func OrderedCompare added in v0.3.0

func OrderedCompare(c Context, u, v Value) int

OrderedCompare returns -1, 0, or 1 according to whether u is less than, equal to, or greater than v, according to total ordering rules. Total ordering is not the usual mathematical definition, as we honor things like 1.0 == 1, comparison of int and char is forbidden, and complex numbers do not implement <. Plus other than for scalars we don't need to follow any particular rules at all, just what works for sorting sets.

Thus we amend the usual orderings: - Char is below all other types - All other scalars are compared directly, except... - ...Complex is above all other scalars, unless on the real line: 1j0 == 1. - Vector is above all other types except... - ...Matrix, which is above all other types.

When comparing identically-typed values:

  • Complex is ordered first by real component, then by imaginary.
  • Vector and Matrix are ordered first by number of elements, then in lexical order of elements.

These are unusual rules, but they are provide a unique ordering of elements sufficient for set membership. // Exported for testing, which is done by the parent directory to avoid a dependency cycle.

func ParseString

func ParseString(s string) string

ParseString parses a string. Single quotes and double quotes are both allowed (but must be consistent.) The result must contain only valid Unicode code points.

Types

type BigFloat

type BigFloat struct {
	*big.Float
}

func Consts

func Consts(c Context) (e, pi BigFloat)

func (BigFloat) Copy added in v0.3.0

func (f BigFloat) Copy() Value

func (BigFloat) Eval

func (f BigFloat) Eval(Context) Value

func (BigFloat) Format

func (f BigFloat) Format()

The fmt package looks for Formatter before Stringer, but we want to use Stringer only. big.Float implements Formatter, and we embed it in our BigFloat type. To make sure that our String gets called rather than the inner Format, we put a non-matching stub Format method into this interface. This is ugly but very simple and cheap.

func (BigFloat) Inner

func (f BigFloat) Inner() Value

func (BigFloat) ProgString

func (f BigFloat) ProgString() string

func (BigFloat) Rank

func (f BigFloat) Rank() int

func (BigFloat) Sprint

func (f BigFloat) Sprint(conf *config.Config) string

func (BigFloat) String

func (f BigFloat) String() string

type BigInt

type BigInt struct {
	*big.Int
}

func (BigInt) BitLen

func (i BigInt) BitLen() int64

func (BigInt) Copy added in v0.3.0

func (i BigInt) Copy() Value

func (BigInt) Eval

func (i BigInt) Eval(Context) Value

func (BigInt) Format

func (i BigInt) Format()

The fmt package looks for Formatter before Stringer, but we want to use Stringer only. big.Int and big.Rat implement Formatter, and we embed them in our BigInt and BigRat types. To make sure that our String gets called rather than the inner Format, we put a non-matching stub Format method into this interface. This is ugly but very simple and cheap.

func (BigInt) Inner

func (i BigInt) Inner() Value

func (BigInt) ProgString

func (i BigInt) ProgString() string

func (BigInt) Rank

func (i BigInt) Rank() int

func (BigInt) Sprint

func (i BigInt) Sprint(conf *config.Config) string

func (BigInt) String

func (i BigInt) String() string

type BigRat

type BigRat struct {
	*big.Rat
}

func (BigRat) Copy added in v0.3.0

func (r BigRat) Copy() Value

func (BigRat) Eval

func (r BigRat) Eval(Context) Value

func (BigRat) Inner

func (r BigRat) Inner() Value

func (BigRat) ProgString

func (r BigRat) ProgString() string

func (BigRat) Rank

func (r BigRat) Rank() int

func (BigRat) Sprint

func (r BigRat) Sprint(conf *config.Config) string

func (BigRat) String

func (r BigRat) String() string

type BinaryOp

type BinaryOp interface {
	EvalBinary(c Context, right, left Value) Value
}

BinaryOp is the interface implemented by a simple binary operator.

type Char

type Char rune

func (Char) Copy added in v0.3.0

func (c Char) Copy() Value

func (Char) Eval

func (c Char) Eval(Context) Value

func (Char) Inner

func (c Char) Inner() Value

func (Char) ProgString

func (c Char) ProgString() string

func (Char) Rank

func (c Char) Rank() int

func (Char) Sprint

func (c Char) Sprint(conf *config.Config) string

func (Char) String

func (c Char) String() string

type Complex added in v0.2.0

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

func NewComplex added in v0.3.0

func NewComplex(u, v Value) Complex

func (Complex) Components added in v0.2.0

func (c Complex) Components() (Value, Value)

func (Complex) Copy added in v0.3.0

func (c Complex) Copy() Value

func (Complex) Eval added in v0.2.0

func (c Complex) Eval(Context) Value

func (Complex) Inner added in v0.2.0

func (c Complex) Inner() Value

func (Complex) ProgString added in v0.2.0

func (c Complex) ProgString() string

func (Complex) Rank added in v0.2.0

func (c Complex) Rank() int

func (Complex) Signum added in v0.3.1

func (c Complex) Signum(ctx Context) Complex

Signum returns:

0j0      if c == 0
c/abs c  if c != 0

func (Complex) Sprint added in v0.2.0

func (c Complex) Sprint(conf *config.Config) string

func (Complex) String added in v0.2.0

func (c Complex) String() string

type Context

type Context interface {
	// Lookup returns the configuration state for evaluation.
	Config() *config.Config

	// Local returns the value of the i'th local variable.
	Local(i int) Value

	// AssignLocal assigns to the i'th local variable.
	AssignLocal(i int, value Value)

	// Global returns the value of the named global variable.
	Global(name string) Value

	// AssignGlobal assigns to the named global variable.
	AssignGlobal(name string, value Value)

	// Eval evaluates a list of expressions.
	Eval(exprs []Expr) []Value

	// EvalUnaryFn evaluates a unary operator.
	EvalUnary(op string, right Value) Value

	// EvalBinary evaluates a binary operator.
	EvalBinary(left Value, op string, right Value) Value

	// UserDefined reports whether the specified op is user-defined.
	UserDefined(op string, isBinary bool) bool
}

Context is the execution context for evaluation. The only implementation is ../exec/Context, but the interface is defined separately, here, because of the dependence on Expr and the import cycle that would otherwise result.

type Decomposable added in v0.1.1

type Decomposable interface {
	// Operator returns the operator, or "" for a singleton.
	Operator() string

	// Operands returns the left and right operands, or nil if absent.
	// For singletons, both will be nil, but ProgString can
	// give the underlying name or value.
	Operands() (left, right Expr)
}

Decomposable allows one to pull apart a parsed expression. Only implemented by Expr types that need to be decomposed in function evaluation.

type Error

type Error string

Error is the type we recognize as a recoverable run-time error.

func (Error) Error

func (err Error) Error() string

type Expr

type Expr interface {
	// ProgString returns the unambiguous representation of the
	// expression to be used in program source.
	ProgString() string

	Eval(Context) Value
}

Expr is the interface for a parsed expression. Also implemented by Value.

type Int

type Int int64

func (Int) Copy added in v0.3.0

func (i Int) Copy() Value

func (Int) Eval

func (i Int) Eval(Context) Value

func (Int) Inner

func (i Int) Inner() Value

func (Int) ProgString

func (i Int) ProgString() string

func (Int) Rank

func (i Int) Rank() int

func (Int) Sprint

func (i Int) Sprint(conf *config.Config) string

func (Int) String

func (i Int) String() string

func (Int) ToBool

func (i Int) ToBool() bool

type Matrix

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

func NewMatrix

func NewMatrix(shape []int, data []Value) *Matrix

NewMatrix makes a new matrix. The number of elements must fit in an Int.

func (*Matrix) Copy

func (m *Matrix) Copy() Value

func (*Matrix) Data

func (m *Matrix) Data() Vector

Data returns the data of the matrix as a vector.

func (*Matrix) ElemSize

func (m *Matrix) ElemSize() int

ElemSize returns the size of each top-level element of the matrix. Given shape [a, b, c, ...] it is b*c*....

func (*Matrix) Eval

func (m *Matrix) Eval(Context) Value

func (*Matrix) Inner

func (m *Matrix) Inner() Value

func (*Matrix) ProgString

func (m *Matrix) ProgString() string

func (*Matrix) Rank

func (m *Matrix) Rank() int

func (*Matrix) Shape

func (m *Matrix) Shape() []int

Shape returns the shape of the matrix.

func (*Matrix) Size

func (m *Matrix) Size() int

Size returns number of elements of the matrix. Given shape [a, b, c, ...] it is a*b*c*....

func (*Matrix) Sprint

func (m *Matrix) Sprint(conf *config.Config) string

func (*Matrix) String

func (m *Matrix) String() string

type UnaryOp

type UnaryOp interface {
	EvalUnary(c Context, right Value) Value
}

UnaryOp is the interface implemented by a simple unary operator.

type Value

type Value interface {
	// String is for internal debugging only. It uses default configuration
	// and puts parentheses around every value so it's clear when it is used.
	// All user output should call Sprint instead.
	String() string
	Sprint(*config.Config) string

	// Eval evaluates (simplifies) the Value.
	Eval(Context) Value

	// Copy returns a copy of the Value.
	Copy() Value

	// Inner retrieves the value, without evaluation. But for Assignments,
	// it returns the right-hand side.
	Inner() Value

	// Rank returns the rank of the value: 0 for scalar, 1 for vector, etc.
	Rank() int

	// ProgString is like String, but suitable for program listing.
	// For instance, it ignores the user format for numbers and
	// puts quotes on chars, guaranteeing a correct representation.
	ProgString() string
	// contains filtered or unexported methods
}

func EvalCharEqual added in v0.3.0

func EvalCharEqual(u Value, isEqualOp bool, v Value) (Value, bool)

EvalCharEqual handles == and != in a special case: If comparing a scalar against a Char, avoid the conversion. The logic of type promotion in EvalBinary otherwise interferes with comparison because it tries to force scalar types to be the same, and char doesn't convert to any other type.

func EvalFunctionBody added in v0.1.1

func EvalFunctionBody(context Context, fnName string, body []Expr) Value

EvalFunctionBody evaluates the list of expressions inside a function, possibly with conditionals that generate an early return.

func Index added in v0.1.12

func Index(context Context, top, left Expr, index []Expr) Value

Index returns left[index]. Left and index will be evaluated (right to left), while top is only for its ProgString method.

func Parse

func Parse(conf *config.Config, s string) (Value, error)

func Product

func Product(c Context, u Value, op string, v Value) Value

Product computes a compound product, such as an inner product "+.*" or outer product "o.*". The op is known to contain a period. The operands are all at least vectors, and for inner product they must both be vectors.

func QuoRem added in v0.3.0

func QuoRem(op string, c Context, a, b Value) (div, rem Value)

QuoRem uses Euclidean division to return the quotient and remainder for a/b. The quotient will be an integer, possibly negative; the remainder is always positive and may be fractional. Returned values satisfy the identity that

quo = a div b  such that
rem = a - b*quo  with 0 <= rem < |y|

See comment for math/big.Int.DivMod for details. Exported for testing.

func Reduce

func Reduce(c Context, op string, v Value) Value

Reduce computes a reduction such as +/. The slash has been removed.

func ReduceFirst added in v0.3.0

func ReduceFirst(c Context, op string, v Value) Value

ReduceFirst computes a reduction such as +/% along the first axis. The slash-percent has been removed.

func Scan

func Scan(c Context, op string, v Value) Value

Scan computes a scan of the op; the \ has been removed. It gives the successive values of reducing op through v. We must be right associative; that is the grammar.

func ScanFirst added in v0.3.0

func ScanFirst(c Context, op string, v Value) Value

ScanFirst computes a scan of the op along the first axis. The backslash-percent has been removed. It gives the successive values of reducing op through v. We must be right associative; that is the grammar.

type Vector

type Vector []Value

func NewIntVector

func NewIntVector(elems ...int) Vector

func NewVector

func NewVector(elems []Value) Vector

func (Vector) AllChars

func (v Vector) AllChars() bool

AllChars reports whether the vector contains only Chars.

func (Vector) AllInts added in v0.1.6

func (v Vector) AllInts() bool

AllInts reports whether the vector contains only Ints.

func (Vector) Copy

func (v Vector) Copy() Value

func (Vector) Eval

func (v Vector) Eval(Context) Value

func (Vector) Inner

func (v Vector) Inner() Value

func (Vector) ProgString

func (v Vector) ProgString() string

func (Vector) Rank

func (v Vector) Rank() int

func (Vector) Sprint

func (v Vector) Sprint(conf *config.Config) string

func (Vector) String

func (v Vector) String() string

Jump to

Keyboard shortcuts

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