Documentation ¶
Overview ¶
Package sabre provides data structures, reader for reading LISP source into data structures and functions for evluating forms against a context.
Index ¶
- Constants
- Variables
- func ClearStack(scope Scope)
- func Compare(v1, v2 Value) bool
- func RemovePrefix(str string) string
- type Any
- type ArgumentError
- type Assoc
- type Atom
- type Bool
- type Call
- type Character
- type Class
- func (c Class) Eval(_ Scope) (Value, error)
- func (c Class) Exists(name Keyword) bool
- func (c Class) GetMember(name Keyword) (Value, bool)
- func (c Class) GetMembers() map[string]Value
- func (c Class) GetMethod(name Keyword) (Invokable, bool)
- func (c Class) GetMethods() map[string]Invokable
- func (c Class) GetStaticMethod(name Keyword) (Invokable, bool)
- func (c *Class) Inherit(parent *Class)
- func (c Class) Invoke(scope Scope, args ...Value) (Value, error)
- func (c Class) PrettyPrint(indent int) string
- func (c Class) String() string
- type Comparable
- type EvalError
- type Fn
- type Future
- type HashMap
- func (hm *HashMap) Compare(other Value) bool
- func (hm *HashMap) Conj(vals ...Value) Seq
- func (hm *HashMap) Cons(v Value) Seq
- func (hm *HashMap) Delete(k Value) *HashMap
- func (hm *HashMap) Eval(scope Scope) (Value, error)
- func (hm *HashMap) First() Value
- func (hm *HashMap) Get(key Value) Value
- func (hm *HashMap) Invoke(scope Scope, args ...Value) (Value, error)
- func (hm *HashMap) Next() Seq
- func (hm HashMap) PrettyPrint(indent int) string
- func (hm *HashMap) Set(k, v Value) Value
- func (hm *HashMap) Size() int
- func (hm HashMap) String() string
- type ImplementError
- type ImportError
- type Invokable
- type Keyword
- type LazySeq
- type List
- type MapScope
- type Module
- type MultiFn
- type Nil
- type Number
- type OSError
- type Object
- func (o Object) Eval(_ Scope) (Value, error)
- func (o Object) Get(key Value) Value
- func (o Object) GetMember(name Keyword) (Value, bool)
- func (o Object) GetMethod(name Keyword) (Invokable, bool)
- func (o Object) PrettyPrint(indent int) string
- func (o Object) Set(key, value Value) Value
- func (o Object) String() string
- type Position
- type PrettyPrinter
- type ReadError
- type Reader
- func (rd *Reader) All() (Value, error)
- func (rd *Reader) IsTerminal(r rune) bool
- func (rd *Reader) NextRune() (rune, error)
- func (rd *Reader) One() (Value, error)
- func (rd Reader) Position() Position
- func (rd *Reader) SetMacro(init rune, macro ReaderMacro, isDispatch bool)
- func (rd *Reader) SkipSpaces() error
- func (rd *Reader) Unread(runes ...rune)
- type ReaderMacro
- type ResolveError
- type Scope
- type Seq
- type Set
- type SpecialForm
- type Spirit
- func (s *Spirit) AddFile(file string)
- func (spirit *Spirit) Bind(symbol string, v Value) error
- func (spirit *Spirit) BindGo(symbol string, v interface{}) error
- func (spirit *Spirit) CurrentNS() string
- func (spirit *Spirit) Eval(v Value) (Value, error)
- func (s *Spirit) FileImported(file string) bool
- func (spirit *Spirit) Parent() Scope
- func (spirit *Spirit) ReadEval(r io.Reader) (Value, error)
- func (spirit *Spirit) ReadEvalStr(src string) (Value, error)
- func (spirit *Spirit) ReadFile(filePath string) (Value, error)
- func (spirit *Spirit) Resolve(symbol string) (Value, error)
- func (spirit *Spirit) SwitchNS(sym Symbol) error
- type Stack
- type String
- type Symbol
- type Type
- type TypeError
- type Value
- func Eval(scope Scope, form Value) (Value, error)
- func EvalValueLast(scope Scope, vals []Value) (Value, error)
- func EvalValueList(scope Scope, vals []Value) ([]Value, error)
- func MacroExpand(scope Scope, form Value) (Value, bool, error)
- func ReadEval(scope Scope, r io.Reader) (Value, error)
- func ReadEvalStr(scope Scope, src string) (Value, error)
- func ValueOf(v interface{}) Value
- type Values
- func (vals Values) Compare(v Value) bool
- func (vals Values) Conj(args ...Value) Seq
- func (vals Values) Cons(v Value) Seq
- func (vals Values) Eval(_ Scope) (Value, error)
- func (vals Values) First() Value
- func (vals Values) Next() Seq
- func (vals Values) Size() int
- func (vals Values) String() string
- func (vals Values) Uniq() []Value
- type Vector
- func (p *Vector) Compare(other Value) bool
- func (p *Vector) Conj(vals ...Value) Seq
- func (p *Vector) Cons(v Value) Seq
- func (p *Vector) Eval(scope Scope) (Value, error)
- func (p *Vector) First() Value
- func (p *Vector) Get(i Value) Value
- func (p *Vector) GetValues() []Value
- func (p *Vector) Index(i int) Value
- func (p *Vector) Invoke(scope Scope, args ...Value) (Value, error)
- func (p *Vector) Next() Seq
- func (p *Vector) PrettyPrint(indent int) string
- func (p *Vector) Set(i Value, v Value) Value
- func (p *Vector) SetPosition(pos Position) *Vector
- func (p *Vector) Size() int
- func (p *Vector) String() string
- func (p *Vector) SubVector(i, j int) Seq
Constants ¶
const (
IndentLevel = 4
)
const MAX_STACK_CALL = 20
maximum stack to be stored
Variables ¶
var ( // ErrSkip can be returned by reader macro to indicate a no-op form which // should be discarded (e.g., Comments). ErrSkip = errors.New("skip expr") // ErrEOF is returned when stream ends prematurely to indicate that more // data is needed to complete the current form. ErrEOF = errors.New("unexpected EOF") )
var ( // Def implements (def symbol value) form for defining bindings. Def = SpecialForm{ Name: "def", Parse: parseDef, } // Lambda defines an anonymous function and returns. Must have the form // (fn* name? [arg*] expr*) or (fn* name? ([arg]* expr*)+) Lambda = SpecialForm{ Name: "fn*", Parse: fnParser(false), } // Macro defines an anonymous function and returns. Must have the form // (macro* name? [arg*] expr*) or (fn* name? ([arg]* expr*)+) Macro = SpecialForm{ Name: "macro*", Parse: fnParser(true), } // Let implements the (let [binding*] expr*) form. expr are evaluated // with given local bindings. Let = SpecialForm{ Name: "let", Parse: parseLet, } // Do special form evaluates args one by one and returns the result of // the last expr. Do = SpecialForm{ Name: "do", Parse: parseDo, } // If implements if-conditional flow using (if test then else?) form. If = SpecialForm{ Name: "if", Parse: parseIf, } // SimpleQuote prevents a form from being evaluated. SimpleQuote = SpecialForm{ Name: "quote", Parse: parseSimpleQuote, } // SyntaxQuote recursively applies the quoting to the form. SyntaxQuote = SpecialForm{ Name: "syntax-quote", Parse: parseSyntaxQuote, } )
var ErrResolving = errors.New("unable to resolve symbol")
ErrResolving is returned when a scope implementation fails to resolve a binding for given symbol.
Functions ¶
func ClearStack ¶ added in v0.9.0
func ClearStack(scope Scope)
func Compare ¶
Compare compares two values in an identity independent manner. If v1 has `Compare(Value) bool` method, the comparison is delegated to it as `v1.Compare(v2)`.
func RemovePrefix ¶ added in v0.9.0
Types ¶
type ArgumentError ¶ added in v0.9.0
func (ArgumentError) Error ¶ added in v0.9.0
func (a ArgumentError) Error() string
type Assoc ¶ added in v0.8.1
type Assoc interface { Value // Set should set the value and returns new structure with updated value Set(Value, Value) Value // Get should get a value mapped under passed argument Get(Value) Value }
Assoc represents value that can be mapped
type Atom ¶ added in v0.8.1
type Atom struct { Val Value // contains filtered or unexported fields }
Atom is a thread-safe reference type
type Character ¶
type Character rune
Character represents a character literal. For example, \a, \b, \1, \∂ etc are valid character literals. In addition, special literals like \newline, \space etc are supported by the reader.
type Class ¶ added in v0.8.1
type Class struct { Name string Parent *Class Members *HashMap Methods *HashMap StaticsMethod *HashMap }
func (Class) GetMembers ¶ added in v0.8.1
func (Class) GetMethods ¶ added in v0.8.1
func (Class) GetStaticMethod ¶ added in v0.9.0
func (Class) PrettyPrint ¶ added in v0.8.1
type Comparable ¶ added in v0.8.1
Comparable can be implemented by Value types to support comparison. See Compare().
type Fn ¶
type Fn struct { Args []string Variadic bool Body Value Scope Scope Func func(scope Scope, args []Value) (Value, error) }
Fn represents a function or macro definition.
func (*Fn) Compare ¶
Compare returns true if 'other' is also a function and has the same signature and body.
type HashMap ¶
HashMap is persistant and does not mutate on change under the hood, it uses structural sharing to reduce the cost of copying
func NewHashMap ¶ added in v0.9.0
func NewHashMap() *HashMap
func (*HashMap) Compare ¶ added in v0.9.0
Compare implements Comparable. It compares each key and value recursively, note that order is not important when comparing
func (HashMap) PrettyPrint ¶ added in v0.9.0
type ImplementError ¶ added in v0.9.0
func (ImplementError) Error ¶ added in v0.9.0
func (i ImplementError) Error() string
type ImportError ¶ added in v0.9.0
type ImportError struct {
// contains filtered or unexported fields
}
func (ImportError) Error ¶ added in v0.9.0
func (i ImportError) Error() string
type Invokable ¶
Invokable represents any value that supports invocation. Vector, Fn etc support invocation.
type Keyword ¶
type Keyword string
Keyword represents a keyword literal.
type List ¶
List represents an list of forms/vals. Evaluating a list leads to a function invocation.
type MapScope ¶
type MapScope struct { Stack // contains filtered or unexported fields }
MapScope implements Scope using a Go native hash-map.
func NewScope ¶
NewScope returns an instance of MapScope with no bindings. If you need builtin special forms, pass result of New() as argument.
func (*MapScope) BindGo ¶
BindGo is similar to Bind but handles conversion of Go value 'v' to
Value type. See `ValueOf()`
type Module ¶
type Module []Value
Module represents a group of forms. Evaluating a module leads to evaluation of each form in order and result will be the result of last evaluation.
func (Module) Compare ¶
Compare returns true if the 'v' is also a module and all forms in the module are equivalent.
type MultiFn ¶
MultiFn represents a multi-arity function or macro definition.
func (MultiFn) Compare ¶
Compare returns true if 'v' is also a MultiFn and all methods are equivalent.
type Number ¶ added in v0.8.1
type Number float64
Number represents double precision floating point numbers
type Object ¶ added in v0.8.1
func (Object) PrettyPrint ¶ added in v0.8.1
type Position ¶
Position represents the positional information about a value read by reader.
type PrettyPrinter ¶ added in v0.9.0
type Reader ¶
type Reader struct { File string // contains filtered or unexported fields }
Reader provides functions to parse characters from a stream into symbolic expressions or forms.
func NewReader ¶
NewReader returns a lisp reader instance which can read forms from rs. Reader behavior can be customized by using SetMacro to override or remove from the default read table. File name will be inferred from the reader value and type information or can be set manually on the Reader.
func (*Reader) All ¶
All consumes characters from stream until EOF and returns a list of all the forms parsed. Any no-op forms (e.g., comment) returned will not be included in the result.
func (*Reader) IsTerminal ¶
IsTerminal returns true if the rune should terminate a form. ReaderMacro trigger runes defined in the read table and all space characters including "," are considered terminal.
func (*Reader) One ¶
One consumes characters from underlying stream until a complete form is parsed and returns the form while ignoring the no-op forms like comments. Except EOF, all errors will be wrapped with ReaderError type along with the positional information obtained using Position().
func (Reader) Position ¶
Position returns information about the stream including file name and the position of the reader.
func (*Reader) SetMacro ¶
func (rd *Reader) SetMacro(init rune, macro ReaderMacro, isDispatch bool)
SetMacro sets the given reader macro as the handler for init rune in the read table. Overwrites if a macro is already present. If the macro value given is nil, entry for the init rune will be removed from the read table. isDispatch decides if the macro is a dispatch macro and takes effect only after a '#' sign.
func (*Reader) SkipSpaces ¶
SkipSpaces consumes and discards runes from stream repeatedly until a character that is not a whitespace is identified. Along with standard unicode white-space characters "," is also considered a white-space and discarded.
type ReaderMacro ¶
ReaderMacro implementations can be plugged into the Reader to extend, override or customize behavior of the reader.
type ResolveError ¶ added in v0.9.0
type ResolveError struct {
Sym Symbol
}
func (ResolveError) Error ¶ added in v0.9.0
func (r ResolveError) Error() string
type Scope ¶
type Scope interface { Push(Call) Pop() Call StackTrace() string Parent() Scope Bind(symbol string, v Value) error Resolve(symbol string) (Value, error) }
Scope implementation is responsible for managing value bindings.
type Seq ¶
type Seq interface { Value // First should return first value of the sequence or nil if the // sequence is empty. First() Value // Next should return the remaining sequence when the first value // is excluded. Next() Seq // Cons should add the value to the beginning of the sequence and // return the new sequence. Cons(v Value) Seq // Conj should join the given values to the sequence and return a // new sequence. Conj(vals ...Value) Seq Size() int }
Seq implementations represent a sequence/list of values.
type Set ¶
Set represents a list of unique values. (Experimental)
type SpecialForm ¶
SpecialForm is a Value type for representing special forms that will be subjected to an intermediate Parsing stage before evaluation.
func (SpecialForm) Eval ¶
func (sf SpecialForm) Eval(_ Scope) (Value, error)
Eval always returns error since it is not allowed to directly evaluate a special form.
func (SpecialForm) String ¶
func (sf SpecialForm) String() string
type Spirit ¶ added in v0.9.0
type Spirit struct { Stack Bindings map[nsSymbol]Value Files []string // contains filtered or unexported fields }
Spirit instance
func (*Spirit) AddFile ¶ added in v0.9.0
AddFile adds file to slice of imported files to prevent circular dependency.
func (*Spirit) Bind ¶ added in v0.9.0
Bind binds the given name to the given Value into the spirit interpreter context.
func (*Spirit) BindGo ¶ added in v0.9.0
BindGo is similar to Bind but handles conversion of Go value 'v' to internal Value type.
func (*Spirit) FileImported ¶ added in v0.9.0
func (*Spirit) Parent ¶ added in v0.9.0
Parent always returns nil to represent this is the root scope.
func (*Spirit) ReadEval ¶ added in v0.9.0
ReadEval reads from the given reader and evaluates all the forms obtained in spirit context.
func (*Spirit) ReadEvalStr ¶ added in v0.9.0
ReadEvalStr reads the source and evaluates it in spirit context.
func (*Spirit) ReadFile ¶ added in v0.9.0
ReadFile reads the content of the filename given. Use this to prevent recursive source
type Stack ¶ added in v0.8.1
type Stack []Call
Stack contains function call. When fn is called, Call will be pushed in Stack, when the fn exits, the stack is popped
func (*Stack) StackTrace ¶ added in v0.8.1
StackTrace returns string representing current stack trace
type String ¶
type String string
String represents double-quoted string literals. String Form represents the true string value obtained from the reader. Escape sequences are not applicable at this level.
func (String) Conj ¶
Conj joins the given values to list of characters of the string and returns the new sequence.
func (String) Cons ¶
Cons converts the string to character sequence and adds the given value to the beginning of the list.
type Symbol ¶
Symbol represents a name given to a value in memory.
func (Symbol) Compare ¶
Compare compares this symbol to the given value. Returns true if the given value is a symbol with same data.
type Type ¶
Type represents the type value of a given value. Type also implements Value type.
type Value ¶
type Value interface { // String should return the LISP representation of the value. String() string // Eval should evaluate this value against the scope and return // the resultant value or an evaluation error. Eval(scope Scope) (Value, error) }
Value represents data/forms in spirit. This includes those emitted by Reader, values obtained as result of an evaluation etc.
func EvalValueLast ¶ added in v0.8.1
evaluates list and only returns the last expression
func EvalValueList ¶ added in v0.8.1
evaluates list and returns the evaluated list
func MacroExpand ¶
MacroExpand expands the macro invocation form.
func ReadEval ¶
ReadEval consumes data from reader 'r' till EOF, parses into forms and evaluates all the forms obtained and returns the result.
func ReadEvalStr ¶
ReadEvalStr is a convenience wrapper for Eval that reads forms from string and evaluates for result.
func ValueOf ¶
func ValueOf(v interface{}) Value
ValueOf converts a Go value to spirit Value type. If 'v' is already a Value type, it is returned as is. Primitive Go values like string, rune, int, float, bool are converted to the right spirit Value types. Functions are converted to the wrapper 'Fn' type. Value of type 'reflect.Type' will be wrapped as 'Type' which enables initializing a value of that type when invoked. All other types will be wrapped using 'Any' type.
type Values ¶
type Values []Value
Values represents a list of values and implements the Seq interface.
func (Values) Compare ¶
Compare compares the values in this sequence to the other sequence. other sequence will be realized for comparison.
func (Values) First ¶
First returns the first value in the list if the list is not empty. Returns Nil{} otherwise.
type Vector ¶
func (*Vector) Compare ¶ added in v0.9.0
Compare implements Comparable which recursively compare values between other value. Order is important