Documentation ¶
Overview ¶
Package goal provides an API to goal's interpreter.
In order to evaluate code in the goal programming language, first a new context has to be created.
ctx := goal.NewContext()
This context can then be used to Compile some code, and then Run it. It is possible to customize the context by registering new unary and binary operators using the RegisterMonad and RegisterDyad methods.
See tests in context_test.go, as well as cmd/goal/main.go, for usage examples.
Index ¶
- type A
- type AB
- func (x *AB) Append(ctx *Context, dst []byte, compact bool) []byte
- func (x *AB) At(i int) V
- func (x *AB) IsBoolean() bool
- func (x *AB) Len() int
- func (x *AB) Less(i, j int) bool
- func (x *AB) LessT(y BV) bool
- func (x *AB) MarkImmutable()
- func (x *AB) MarshalJSON() ([]byte, error)
- func (x *AB) Matches(y BV) bool
- func (x *AB) Reusable() bool
- func (x *AB) Swap(i, j int)
- func (x *AB) Type() string
- type AF
- func (x *AF) Append(ctx *Context, dst []byte, compact bool) []byte
- func (x *AF) At(i int) V
- func (x *AF) Len() int
- func (x *AF) Less(i, j int) bool
- func (x *AF) LessT(y BV) bool
- func (x *AF) MarkImmutable()
- func (x *AF) MarshalJSON() ([]byte, error)
- func (x *AF) Matches(y BV) bool
- func (x *AF) Reusable() bool
- func (x *AF) Swap(i, j int)
- func (x *AF) Type() string
- type AI
- func (x *AI) Append(ctx *Context, dst []byte, compact bool) []byte
- func (x *AI) At(i int) V
- func (x *AI) Len() int
- func (x *AI) Less(i, j int) bool
- func (x *AI) LessT(y BV) bool
- func (x *AI) MarkImmutable()
- func (x *AI) MarshalJSON() ([]byte, error)
- func (x *AI) Matches(y BV) bool
- func (x *AI) Reusable() bool
- func (x *AI) Swap(i, j int)
- func (x *AI) Type() string
- type AS
- func (x *AS) Append(ctx *Context, dst []byte, compact bool) []byte
- func (x *AS) At(i int) V
- func (x *AS) Len() int
- func (x *AS) Less(i, j int) bool
- func (x *AS) LessT(y BV) bool
- func (x *AS) MarkImmutable()
- func (x *AS) MarshalJSON() ([]byte, error)
- func (x *AS) Matches(y BV) bool
- func (x *AS) Reusable() bool
- func (x *AS) Swap(i, j int)
- func (x *AS) Type() string
- type AV
- func (x *AV) Append(ctx *Context, dst []byte, compact bool) []byte
- func (x *AV) At(i int) V
- func (x *AV) Len() int
- func (x *AV) Less(i, j int) bool
- func (x *AV) LessT(y BV) bool
- func (x *AV) MarkImmutable()
- func (x *AV) MarshalJSON() ([]byte, error)
- func (x *AV) Matches(y BV) bool
- func (x *AV) Reusable() bool
- func (x *AV) Swap(i, j int)
- func (x *AV) Type() string
- type Array
- type BV
- type Callable
- type Context
- func (ctx *Context) AssignGlobal(name string, x V)
- func (ctx *Context) AssignedLast() bool
- func (ctx *Context) Compile(s, loc string) error
- func (ctx *Context) Eval(s string) (V, error)
- func (ctx *Context) EvalPackage(s, loc, pfx string) (V, error)
- func (ctx *Context) Get(key string) any
- func (ctx *Context) GetGlobal(name string) (V, bool)
- func (ctx *Context) GetVariadic(name string) (V, VariadicFun)
- func (ctx *Context) RegisterDyad(name string, vf VariadicFun) V
- func (ctx *Context) RegisterMonad(name string, vf VariadicFun) V
- func (ctx *Context) Run() (V, error)
- func (ctx *Context) Set(key string, value any)
- func (ctx *Context) String() string
- type D
- func (d *D) Append(ctx *Context, dst []byte, compact bool) []byte
- func (d *D) KeyArray() Array
- func (d *D) Keys() V
- func (d *D) Len() int
- func (d *D) LessT(y BV) bool
- func (d *D) MarkImmutable()
- func (x *D) MarshalJSON() ([]byte, error)
- func (d *D) Matches(y BV) bool
- func (d *D) Type() string
- func (d *D) ValueArray() Array
- func (d *D) Values() V
- type ErrPackageImported
- type Panic
- func (e *Panic) Append(ctx *Context, dst []byte, compact bool) []byte
- func (e *Panic) Error() string
- func (e *Panic) ErrorStack() string
- func (e *Panic) LessT(y BV) bool
- func (e *Panic) Matches(y BV) bool
- func (e *Panic) Type() string
- func (e *Panic) Unwrap() error
- func (e *Panic) WithPrefix(pfx string) *Panic
- type S
- type V
- func Errorf(format string, a ...any) V
- func NewAB(x []byte) V
- func NewAF(x []float64) V
- func NewAI(x []int64) V
- func NewAS(x []string) V
- func NewAV(x []V) V
- func NewD(keys, values V) V
- func NewError(x V) V
- func NewF(f float64) V
- func NewI(i int64) V
- func NewPanic(msg string) V
- func NewPanicError(err error) V
- func NewPanicV(x *Panic) V
- func NewS(s string) V
- func NewV(x BV) V
- func Panicf(format string, a ...any) V
- func (x V) Append(ctx *Context, dst []byte, compact bool) []byte
- func (x V) Apply(ctx *Context, args []V) V
- func (x V) Apply2(ctx *Context, y, z V) V
- func (x V) ApplyAt(ctx *Context, y V) V
- func (x V) BV() BV
- func (x V) Error() V
- func (x V) F() float64
- func (x V) I() int64
- func (x V) IsBV() bool
- func (x V) IsCallable() bool
- func (x V) IsError() bool
- func (x V) IsF() bool
- func (x V) IsFalse() bool
- func (x V) IsFunction() bool
- func (x V) IsI() bool
- func (x V) IsPanic() bool
- func (x V) IsTrue() bool
- func (x V) Len() int
- func (x V) LessT(y V) bool
- func (x V) MarkImmutable()
- func (x V) MarshalJSON() ([]byte, error)
- func (x V) Matches(y V) bool
- func (x V) Panic() *Panic
- func (x V) Rank(ctx *Context) int
- func (x V) Sprint(ctx *Context, compact bool) string
- func (x V) Type() string
- type VariadicFun
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type A ¶ added in v0.19.0
type A[T any] struct { // Slice is the underlying immutable slice of values. It should not be // modified unless Reusable returns true, and in such a case, you should mark // any new stored values with MarkImmutable (except for values that are // always immutable, like strings or unboxed values). Slice []T // contains filtered or unexported fields }
A is a generic type used to represent arrays. Only specific instantiations implement the BV and Array interfaces.
type AB ¶
AB represents an array of bytes. From Goal's perspective, it's the same as AI. It's used as an optimization to save space for small-integers, in particular for arrays of booleans (0s and 1s).
func (*AB) Append ¶ added in v0.6.0
Append appends a unique program representation of the value to dst, and returns the extended buffer.
func (*AB) IsBoolean ¶ added in v0.16.0
IsBoolean returns true when the array of bytes is known to contain only 1s and 0s.
func (*AB) MarkImmutable ¶ added in v0.19.0
func (x *AB) MarkImmutable()
MarkImmutable marks the value as definitively non-reusable. You can use this method to tell the optimizer that it cannot reuse its memory anymore. In particular, you should call this method before storing a value within an user-defined boxed value type.
func (*AB) MarshalJSON ¶ added in v0.25.0
MarshalJSON implements json.Marshaler.
func (*AB) Reusable ¶ added in v0.24.0
Reusable returns true if the array value and its underlying slice are reusable. Note that reusable values can be modified in-place by some operations, so use MarkImmutable if you want to avoid any such mutations. Always check Reusable before modifying an Array.
type AF ¶
AF represents an array of float64 values.
func (*AF) Append ¶ added in v0.6.0
Append appends a unique program representation of the value to dst, and returns the extended buffer.
func (*AF) MarkImmutable ¶ added in v0.19.0
func (x *AF) MarkImmutable()
MarkImmutable marks the value as definitively non-reusable. You can use this method to tell the optimizer that it cannot reuse its memory anymore. In particular, you should call this method before storing a value within an user-defined boxed value type.
func (*AF) MarshalJSON ¶ added in v0.25.0
MarshalJSON implements json.Marshaler.
func (*AF) Reusable ¶ added in v0.24.0
Reusable returns true if the array value and its underlying slice are reusable. Note that reusable values can be modified in-place by some operations, so use MarkImmutable if you want to avoid any such mutations. Always check Reusable before modifying an Array.
type AI ¶
AI represents an array of int64 values.
func (*AI) Append ¶ added in v0.6.0
Append appends a unique program representation of the value to dst, and returns the extended buffer.
func (*AI) MarkImmutable ¶ added in v0.19.0
func (x *AI) MarkImmutable()
MarkImmutable marks the value as definitively non-reusable. You can use this method to tell the optimizer that it cannot reuse its memory anymore. In particular, you should call this method before storing a value within an user-defined boxed value type.
func (*AI) MarshalJSON ¶ added in v0.25.0
MarshalJSON implements json.Marshaler.
func (*AI) Reusable ¶ added in v0.24.0
Reusable returns true if the array value and its underlying slice are reusable. Note that reusable values can be modified in-place by some operations, so use MarkImmutable if you want to avoid any such mutations. Always check Reusable before modifying an Array.
type AS ¶
AS represents an array of strings.
func (*AS) Append ¶ added in v0.6.0
Append appends a unique program representation of the value to dst, and returns the extended buffer.
func (*AS) MarkImmutable ¶ added in v0.19.0
func (x *AS) MarkImmutable()
MarkImmutable marks the value as definitively non-reusable. You can use this method to tell the optimizer that it cannot reuse its memory anymore. In particular, you should call this method before storing a value within an user-defined boxed value type.
func (*AS) MarshalJSON ¶ added in v0.25.0
MarshalJSON implements json.Marshaler.
func (*AS) Reusable ¶ added in v0.24.0
Reusable returns true if the array value and its underlying slice are reusable. Note that reusable values can be modified in-place by some operations, so use MarkImmutable if you want to avoid any such mutations. Always check Reusable before modifying an Array.
type AV ¶
AV represents a generic array. The elements of a generic array are marked as immutable, and they should not be representable together in a specialized array. In other words, it should be the canonical form of the array.
func (*AV) Append ¶ added in v0.6.0
Append appends a unique program representation of the value to dst, and returns the extended buffer.
func (*AV) MarkImmutable ¶ added in v0.19.0
func (x *AV) MarkImmutable()
MarkImmutable marks the value as definitively non-reusable. You can use this method to tell the optimizer that it cannot reuse its memory anymore. In particular, you should call this method before storing a value within an user-defined boxed value type.
func (*AV) MarshalJSON ¶ added in v0.25.0
MarshalJSON implements json.Marshaler.
func (*AV) Reusable ¶ added in v0.24.0
Reusable returns true if the array value and its underlying slice are reusable. Note that reusable values can be modified in-place by some operations, so use MarkImmutable if you want to avoid any such mutations. Always check Reusable before modifying an Array.
type Array ¶ added in v0.19.0
type Array interface { BV sort.Interface // Len returns the value's length. Len() int // Reusable returns true if the array value and its underlying slice are // reusable. Note that reusable values can be modified in-place by some // operations, so use MarkImmutable if you want to avoid any such mutations. // Always check Reusable before modifying an Array. Reusable() bool // At returns the value at index i, assuming it's not out of bounds. At(i int) V // contains filtered or unexported methods }
Array interface is satisfied by the different kinds of supported builtin array values.
func NewArray ¶ added in v0.24.0
NewArray returns a new array from a slice of generic values. The result value will be an array in canonical form. If the values are all of the same specialized type, like integers, floats, or strings, the underlying array will use a specialized representation, instead of a generic one.
It is the same as NewAV, but returns an Array value instead of a generic value.
type BV ¶ added in v0.19.0
type BV interface { // Matches returns true if the value matches another (in the sense of // the ~ operator). Matches(BV) bool // Append appends a unique program representation of the value to dst, // and returns the extended buffer. It should not store the returned // buffer elsewhere, so that it's possible to safely convert it to // string without allocations. The compact boolean determines whether // insignificant whitespace should be removed or not. Append(ctx *Context, dst []byte, compact bool) []byte // Type returns the name of the value's type. It may be used by LessT to // sort non-comparable values using lexicographic order. This means // Type should return different values for non-comparable values. Type() string // LessT returns true if the value should be orderer before the given // one. It is used for sorting values, but not for element-wise // comparison with < and >. It should produce a strict total order, // that is, irreflexive (~x<x), asymmetric (if x<y then ~y<x), // transitive, connected (different values are comparable, except // NaNs). LessT(BV) bool }
BV is the interface satisfied by all boxed values. It can be satisfied by user-defined types.
type Callable ¶ added in v0.24.0
type Callable interface { BV // Apply calls the value with one or more arguments. The arguments are // provided in stack order, as in the right to left semantics used by // the language: the first argument is the last element. Apply(*Context, []V) V }
Callable represents user-defined boxed values that can be applied. To check if any kind of value (builtin or user-defined) is callable, use the IsCallable method for type V.
type Context ¶
type Context struct { // Log is the output writer for logging with \expr and rt.log. Log io.Writer // OFS is the output field separator (default: " "). OFS string // contains filtered or unexported fields }
Context holds the state of the interpreter. Context values have to be created with NewContext.
func NewContext ¶
func NewContext() *Context
NewContext returns a new context for compiling and interpreting code, with default parameters.
func (*Context) AssignGlobal ¶
AssignGlobal assigns a value to a global variable name.
func (*Context) AssignedLast ¶
AssignedLast returns true if the last compiled expression was an assignment.
func (*Context) Compile ¶
Compile parses and compiles code from the given source string in the current context. The loc argument is the location used for error reporting and represents usually a filename. For non-empty locations, Compile handles and skips shebang line (if any).
func (*Context) Eval ¶
Eval calls Compile with the given string and an empty location, and then Run. You cannot call it within a variadic function, as the evaluation is done on the current context, so it would interrupt compilation of current file. Use EvalPackage for that.
func (*Context) EvalPackage ¶
EvalPackage calls Compile with the string s as source, loc as error location (used for caching too, usually a filename), pfx as prefix for global variables (usually a filename without the extension), and then Run. If a package with same location and prefix has already been evaluated, it returns ErrPackageImported. This means that even though Goal allows to evaluate (also via import) with the same location and prefix several times (which can be useful if separate files using the same package can be used together or alone), only the first one counts. The package is evaluated in a derived context that is then merged on successful completion, so this function can be called within a variadic function.
func (*Context) Get ¶ added in v0.24.0
Get returns the value corresponding to the given key, as previously set with the Set method.
func (*Context) GetGlobal ¶
GetGlobal returns the value attached to a global variable with the given name.
func (*Context) GetVariadic ¶ added in v0.10.0
func (ctx *Context) GetVariadic(name string) (V, VariadicFun)
GetVariadic returns the variadic value registered with a given keyword or symbol, along its associated variadic function. It returns a zero value and nil function if there is no registered variadic with such name.
func (*Context) RegisterDyad ¶
func (ctx *Context) RegisterDyad(name string, vf VariadicFun) V
RegisterDyad adds a variadic function to the context, and generates a new dyadic keyword or operator for that variadic (parsing will search for a left argument). The variadic is also returned as a value.
func (*Context) RegisterMonad ¶
func (ctx *Context) RegisterMonad(name string, vf VariadicFun) V
RegisterMonad adds a variadic function to the context, and generates a new monadic keyword or operator for that variadic (parsing will not search for a left argument). The variadic is also returned as a value. Note that while that a keyword defined in such a way will not take a left argument, it is still possible to pass several arguments to it with bracket indexing, like for any value. Also, this function cannot be used to change the dyadic nature of builtin symbols.
func (*Context) Run ¶
Run runs compiled code in the current context, if not already done, and returns the result value.
type D ¶ added in v0.19.0
type D struct {
// contains filtered or unexported fields
}
D represents a dictionary.
func (*D) Append ¶ added in v0.19.0
Append appends a unique program representation of the value to dst, and returns the extended buffer.
func (*D) KeyArray ¶ added in v0.24.0
KeyArray returns the keys of the dictionary as an Array value.
func (*D) Len ¶ added in v0.19.0
Len returns the length of the dictionary, that is the common length to its key and value arrays.
func (*D) MarkImmutable ¶ added in v0.19.0
func (d *D) MarkImmutable()
MarkImmutable marks the value as definitively non-reusable. You can use this method to tell the optimizer that it cannot reuse its memory anymore. In particular, you should call this method before storing a value within an user-defined boxed value type.
func (*D) MarshalJSON ¶ added in v0.25.0
MarshalJSON implements json.Marshaler. Note that not all generic values can be marshalled, only unboxed integers and floats, as well as boxed values implementing json.Marshaler. Also, nested lists are not supported for keys. The json builtin in Goal is more tolerant and stringifies others kinds of values before encoding.
func (*D) ValueArray ¶ added in v0.24.0
ValueArray returns the values of the dictionary as an Array value.
type ErrPackageImported ¶
type ErrPackageImported struct{}
ErrPackageImported is returned by EvalPackage for packages that have already been processed (same location).
func (ErrPackageImported) Error ¶
func (e ErrPackageImported) Error() string
type Panic ¶ added in v0.26.0
type Panic struct { Err error // error message (without location) // contains filtered or unexported fields }
Panic represents a fatal error returned by any Context method.
While Panic also satisfies the BV interface, you shouldn't create generic panic values from a Panic using NewV but NewPanicV instead. Panic is a special kind of boxed value that has to be marked specially so that checking for panics can efficiently be handled by the runtime.
func (*Panic) Append ¶ added in v0.26.0
Append appends a unique program representation of the value to dst, and returns the extended buffer.
func (*Panic) Error ¶ added in v0.26.0
Error returns the panic message without location information.
func (*Panic) ErrorStack ¶ added in v0.26.0
ErrorStack returns the full panic message with locations and source information obtained from its running context.
func (*Panic) LessT ¶ added in v0.26.0
LessT implements BV interface. It is not used in practice for panics.
func (*Panic) Matches ¶ added in v0.26.0
Matches implements BV interface. It is not used in practice for panics.
func (*Panic) Type ¶ added in v0.26.0
Type implements BV interface. It is not used in practice for panics.
func (*Panic) WithPrefix ¶ added in v0.26.0
WithPrefix adds a prefix to the panic message and returns the modified Panic value.
type S ¶
type S string
S represents (immutable) strings of bytes.
func (S) Append ¶ added in v0.6.0
Append appends a unique program representation of the value to dst, and returns the extended buffer.
func (S) MarshalJSON ¶ added in v0.25.0
MarshalJSON implements json.Marshaler.
type V ¶
type V struct {
// contains filtered or unexported fields
}
V contains a generic boxed or unboxed value.
func NewAV ¶
NewAV returns a new array from a slice of generic values. The result value will be an array in canonical form. If the values are all of the same specialized type, like integers, floats, or strings, the underlying array will use a specialized representation, instead of a generic one.
It is the same as NewArray, but returns a generic value instead of an Array value.
func NewD ¶ added in v0.19.0
NewD returns a dictionary. Both keys and values should be arrays, and they should have the same length.
func NewPanicError ¶ added in v0.26.0
NewPanicError returns a new panic value from given error. If the error is already of type Panic the underlying location information is preserved.
func (V) Append ¶ added in v0.6.0
Append appends a unique program representation of the value to dst, and returns the extended buffer.
func (V) Apply ¶ added in v0.24.0
Apply calls a value with one or more arguments. The arguments should be provided in stack order, as in the right to left semantics used by the language: the first argument is the last element.
func (V) BV ¶ added in v0.19.0
BV retrieves the boxed value, or nil if the value is not boxed. You can check whether the value is boxed with x.IsBV().
func (V) IsBV ¶ added in v0.19.0
IsBV returns true if the value is a boxed value satisfying the BV interface. You can then get the value with the BV method.
func (V) IsCallable ¶ added in v0.10.0
IsCallable returns true if the value can be called with one or more arguments. This is true for most values, including non-function ones.
func (V) IsFalse ¶ added in v0.10.0
IsFalse returns true for false values, that is zero numbers, empty strings, zero-length values, and errors.
func (V) IsFunction ¶
IsFunction returns true if the value is some kind of builtin function type, like verbs, adverbs, lambdas and projections. Type returns "f" for such values.
func (V) IsTrue ¶ added in v0.10.0
IsTrue returns true for true values, that is non-zero numbers, non-empty strings, and non-zero length values that are not errors.
func (V) LessT ¶ added in v0.10.0
LessT returns true if x is ordered before y. It represents a strict total order (except non-strict for NaNs). Values are ordered as follows: unboxed atoms first (numbers, variadics, then lambdas), then boxed values. Otherwise, values are compared with < and > when comparable, and otherwise using their Type string value. As a special case, comparable arrays are compared first by length, or lexicographically if they are of equal length.
func (V) MarkImmutable ¶ added in v0.19.0
func (x V) MarkImmutable()
MarkImmutable marks the value as definitively non-reusable. You can use this method to tell the optimizer that it cannot reuse its memory anymore. In particular, you should call this method before storing a value within an user-defined boxed value type.
func (V) MarshalJSON ¶ added in v0.25.0
MarshalJSON implements json.Marshaler. Note that not all generic values can be marshalled, only unboxed integers and floats, as well as boxed values implementing json.Marshaler. The json builtin in Goal is more tolerant and stringifies others kinds of values before encoding.
func (V) Rank ¶
Rank returns the default rank of the value, that is the number of arguments it normally takes. It returns 0 for non-function values. This default rank is used in adverbial expressions that have different semantics depending on the modified function arity. Currently, ranks are as follows:
variadic 2 lambda number of arguments projections number of gaps derived verb depends on the verb and adverb
type VariadicFun ¶
VariadicFun represents a variadic function. The array of arguments is in stack order: the first argument is its last element.
Source Files ¶
- adverbs.go
- adverbspecial.go
- amend.go
- amendspecial.go
- apply.go
- arithd.go
- arithm.go
- arrays.go
- ast.go
- clone.go
- cmpsearch.go
- compiler.go
- context.go
- csv.go
- dicts.go
- encdec.go
- errors.go
- flip.go
- fns.go
- group.go
- join.go
- json.go
- less.go
- math.go
- mathm.go
- opcode.go
- parser.go
- parsev.go
- radix.go
- rand.go
- refcount.go
- regexp.go
- sfns.go
- sort.go
- stringer.go
- strings.go
- time.go
- utf8.go
- utils.go
- valstring.go
- value.go
- variadics.go
- vm.go
Directories ¶
Path | Synopsis |
---|---|
Package cmd provides a quick way to create derived interpreters.
|
Package cmd provides a quick way to create derived interpreters. |
Package os provides variadic function definitions for IO/OS builtins.
|
Package os provides variadic function definitions for IO/OS builtins. |
Package scan implements a scanner for Goal source text.
|
Package scan implements a scanner for Goal source text. |