Documentation
¶
Overview ¶
Package values implements all Scheme runtime value types.
The package provides the complete R7RS value system:
Numeric Tower (R7RS 6.2.1) ¶
- Integer, BigInteger: exact integers (int64 and arbitrary precision)
- Rational: exact rationals via math/big.Rat
- Float, BigFloat: inexact reals (float64 and arbitrary precision)
- Complex, BigComplex: complex numbers
All numeric types implement the Number interface for uniform arithmetic.
Core Types ¶
- Boolean: #t and #f singletons (TrueValue, FalseValue)
- Character: Unicode rune wrapper
- String: immutable and mutable string values
- Symbol: identifiers compared by string key
- Pair: cons cells as [2]Value arrays
- Vector: fixed-size mutable value arrays
- ByteVector: byte arrays for binary data
- Hashtable: bucket-chaining hash maps with Hashable keys
I/O Ports (R7RS 6.13) ¶
Port types implement Port, [InputPort], [OutputPort], and related interfaces:
- [CharacterInputPort], [CharacterOutputPort]: textual I/O
- [BinaryInputPort], [BinaryOutputPort]: binary I/O
- [StringInputPort], [StringOutputPort]: in-memory string ports
- [ByteVectorInputPort], [ByteVectorOutputPort]: in-memory byte ports
Concurrency (SRFI-18+) ¶
- Thread, Mutex, ConditionVariable: SRFI-18 threading
- Channel, WaitGroup, RWMutex, Once: Go concurrency wrappers
- AtomicBox, AtomicInt64: atomic operations
Singletons ¶
Use Void for the absence of a value and EOFObject for end-of-file. EmptyList is the empty list sentinel.
Package values provides Scheme runtime value types.
Index ¶
- Constants
- Variables
- func BigIntegerEqualsFloat(bi *BigInteger, f *Float) bool
- func BooleanToBool(b *Boolean) bool
- func CarAs[T any](t Tuple, headSentinel error, name, role string) (T, error)
- func DisplayValueToString(v Value) string
- func EqIdentity(a, b Value) bool
- func EqualTo(a, b Value) bool
- func ExactInteger(v Value) (int64, bool)
- func ForEachProperList(ctx context.Context, t Tuple, name string, fn ForEachFunc) error
- func FormatOriginChain(origin *OriginInfo, maxDepth int) string
- func HasScope(scopes []*Scope, target *Scope) bool
- func IntegerEqualsFloat(i *Integer, f *Float) bool
- func IsEmptyList(v Value) bool
- func IsList(v Value) bool
- func IsVoid(v Value) bool
- func Must(v Value, err error)
- func NumberToComplex128Lossy(n Number) complex128
- func NumberToFloat64(n Number) float64
- func NumericEquals(a, b Number) bool
- func SchemeTypeName(v Value) string
- func ScopesCompatible(bindingScopes, useScopes []*Scope) bool
- func ScopesMatch(useScopes, bindingScopes []*Scope) bool
- func Spine(p *Pair, improperTail *Value) iter.Seq2[*Pair, struct{}]
- func SpineWithCycleCheck(p *Pair, cycled *bool) iter.Seq2[*Pair, struct{}]
- func ToComplex128Lossless(n Number) (complex128, error)
- func ToFloat64Lossless(n Number) (float64, error)
- func ToFloat64WithAccuracy(n Number) (float64, big.Accuracy, bool, error)
- func Uncons(v Value, name, role string) (Value, Value, error)
- func ValidateByteValue(v *Integer, name string, desc string) error
- func ValueToBool(b Value) bool
- func WriteSharedValueToString(v Value) string
- func WriteValueToString(v Value) string
- type AbandonedMutexException
- type AtomicBox
- func (p *AtomicBox) CompareAndSwap(ol, nw Value) bool
- func (p *AtomicBox) EqualTo(v Value) bool
- func (p *AtomicBox) ID() uint64
- func (p *AtomicBox) IsVoid() bool
- func (p *AtomicBox) Load() Value
- func (p *AtomicBox) SchemeString() string
- func (p *AtomicBox) Store(v Value)
- func (p *AtomicBox) Swap(v Value) Value
- type AtomicInt64
- func (p *AtomicInt64) Add(delta int64) int64
- func (p *AtomicInt64) CompareAndSwap(ol, nw int64) bool
- func (p *AtomicInt64) EqualTo(v Value) bool
- func (p *AtomicInt64) ID() uint64
- func (p *AtomicInt64) IsVoid() bool
- func (p *AtomicInt64) Load() int64
- func (p *AtomicInt64) SchemeString() string
- func (p *AtomicInt64) Store(v int64)
- func (p *AtomicInt64) Swap(nw int64) int64
- type BigComplex
- func (p *BigComplex) Abs() Number
- func (p *BigComplex) Add(o Number) Number
- func (p *BigComplex) Compare(o Number) int
- func (p *BigComplex) Conjugate() *BigComplex
- func (p *BigComplex) Divide(o Number) (Number, error)
- func (p *BigComplex) EqualTo(o Value) bool
- func (p *BigComplex) HashCode() uint64
- func (p *BigComplex) Imag() Number
- func (p *BigComplex) ImagAsBigFloat() *BigFloat
- func (p *BigComplex) ImagPart() Number
- func (p *BigComplex) IsExact() bool
- func (p *BigComplex) IsFinite() bool
- func (p *BigComplex) IsInteger() bool
- func (p *BigComplex) IsNaN() bool
- func (p *BigComplex) IsRational() bool
- func (p *BigComplex) IsReal() bool
- func (p *BigComplex) IsVoid() bool
- func (p *BigComplex) IsZero() bool
- func (p *BigComplex) Kind() NumericKind
- func (p *BigComplex) LessThan(o Number) bool
- func (p *BigComplex) Magnitude() *BigFloat
- func (p *BigComplex) Multiply(o Number) Number
- func (p *BigComplex) Negate() Number
- func (p *BigComplex) Phase() *BigFloat
- func (p *BigComplex) Real() Number
- func (p *BigComplex) RealAsBigFloat() *BigFloat
- func (p *BigComplex) RealPart() Number
- func (p *BigComplex) SchemeString() string
- func (p *BigComplex) Subtract(o Number) Number
- func (p *BigComplex) ToExact() (Number, error)
- func (p *BigComplex) ToInexact() Number
- type BigFloat
- func (p *BigFloat) Abs() Number
- func (p *BigFloat) Add(o Number) Number
- func (p *BigFloat) BigFloatValue() *big.Float
- func (p *BigFloat) Compare(o Number) int
- func (p *BigFloat) Divide(o Number) (Number, error)
- func (p *BigFloat) EqualTo(o Value) bool
- func (p *BigFloat) Float64Truncated() float64
- func (p *BigFloat) Float64WithAccuracy() (float64, big.Accuracy)
- func (p *BigFloat) HashCode() uint64
- func (p *BigFloat) IsExact() bool
- func (p *BigFloat) IsFinite() bool
- func (p *BigFloat) IsInteger() bool
- func (p *BigFloat) IsNaN() bool
- func (p *BigFloat) IsNegative() bool
- func (p *BigFloat) IsPositive() bool
- func (p *BigFloat) IsRational() bool
- func (p *BigFloat) IsVoid() bool
- func (p *BigFloat) IsZero() bool
- func (p *BigFloat) Kind() NumericKind
- func (p *BigFloat) LessThan(o Number) bool
- func (p *BigFloat) Multiply(o Number) Number
- func (p *BigFloat) Negate() Number
- func (p *BigFloat) SchemeString() string
- func (p *BigFloat) Sign() int
- func (p *BigFloat) Subtract(o Number) Number
- func (p *BigFloat) ToExact() (Number, error)
- func (p *BigFloat) ToInexact() Number
- type BigInteger
- func (p *BigInteger) Abs() Number
- func (p *BigInteger) Add(o Number) Number
- func (p *BigInteger) BigInt() *big.Int
- func (p *BigInteger) Compare(o Number) int
- func (p *BigInteger) Divide(o Number) (Number, error)
- func (p *BigInteger) EqualTo(o Value) bool
- func (p *BigInteger) HashCode() uint64
- func (p *BigInteger) Int64() int64
- func (p *BigInteger) IsExact() bool
- func (p *BigInteger) IsFinite() bool
- func (p *BigInteger) IsInteger() bool
- func (p *BigInteger) IsNaN() bool
- func (p *BigInteger) IsNegative() bool
- func (p *BigInteger) IsPositive() bool
- func (p *BigInteger) IsRational() bool
- func (p *BigInteger) IsVoid() bool
- func (p *BigInteger) IsZero() bool
- func (p *BigInteger) Kind() NumericKind
- func (p *BigInteger) LessThan(o Number) bool
- func (p *BigInteger) Multiply(o Number) Number
- func (p *BigInteger) Negate() Number
- func (p *BigInteger) SchemeString() string
- func (p *BigInteger) Sign() int
- func (p *BigInteger) Subtract(o Number) Number
- func (p *BigInteger) ToExact() (Number, error)
- func (p *BigInteger) ToInexact() Number
- type Boolean
- type Box
- type Byte
- type ByteUnreader
- type ByteVector
- func (p *ByteVector) AsBytes(is ...int) []byte
- func (p *ByteVector) AsList() Tuple
- func (p *ByteVector) EqualTo(v Value) bool
- func (p *ByteVector) Get(i int) Value
- func (p *ByteVector) IsVoid() bool
- func (p *ByteVector) Length() int
- func (p *ByteVector) SchemeString() string
- func (p *ByteVector) Set(i int, value Value) error
- type ByteVectorExtractor
- type Callable
- type Channel
- func (p *Channel) BufferSize() int
- func (p *Channel) Cap() int
- func (p *Channel) Chan() chan Value
- func (p *Channel) Close() error
- func (p *Channel) EqualTo(v Value) bool
- func (p *Channel) ID() uint64
- func (p *Channel) IsClosed() bool
- func (p *Channel) IsVoid() bool
- func (p *Channel) Len() int
- func (p *Channel) Receive() (Value, bool)
- func (p *Channel) SchemeString() string
- func (p *Channel) Send(v Value) error
- func (p *Channel) TryReceive() (Value, bool, bool)
- func (p *Channel) TrySend(v Value) (bool, error)
- type CharSet
- func (p *CharSet) All() iter.Seq[CharSetRange]
- func (p *CharSet) Codepoints() iter.Seq[rune]
- func (p *CharSet) Contains(ch rune) bool
- func (p *CharSet) EqualTo(v Value) bool
- func (p *CharSet) IsVoid() bool
- func (p *CharSet) Ranges() []CharSetRange
- func (p *CharSet) SchemeString() string
- func (p *CharSet) Size() int
- type CharSetRange
- type Character
- type CompileTimeValue
- type Complex
- func (p *Complex) Abs() Number
- func (p *Complex) Add(o Number) Number
- func (p *Complex) Compare(o Number) int
- func (p *Complex) Divide(o Number) (Number, error)
- func (p *Complex) EqualTo(v Value) bool
- func (p *Complex) HashCode() uint64
- func (p *Complex) Imag() float64
- func (p *Complex) ImagPart() Number
- func (p *Complex) IsExact() bool
- func (p *Complex) IsFinite() bool
- func (p *Complex) IsInteger() bool
- func (p *Complex) IsNaN() bool
- func (p *Complex) IsRational() bool
- func (p *Complex) IsReal() bool
- func (p *Complex) IsVoid() bool
- func (p *Complex) IsZero() bool
- func (p *Complex) Kind() NumericKind
- func (p *Complex) LessThan(o Number) bool
- func (p *Complex) Magnitude() float64
- func (p *Complex) Multiply(o Number) Number
- func (p *Complex) Negate() Number
- func (p *Complex) Phase() float64
- func (p *Complex) Real() float64
- func (p *Complex) RealPart() Number
- func (p *Complex) SchemeString() string
- func (p *Complex) Subtract(o Number) Number
- func (p *Complex) ToExact() (Number, error)
- func (p *Complex) ToInexact() Number
- type Complex128Result
- type ComplexNumber
- type ConditionVariable
- func (p *ConditionVariable) Broadcast()
- func (p *ConditionVariable) EqualTo(v Value) bool
- func (p *ConditionVariable) ID() uint64
- func (p *ConditionVariable) IsVoid() bool
- func (p *ConditionVariable) Name() string
- func (p *ConditionVariable) SchemeString() string
- func (p *ConditionVariable) SetSpecific(v Value)
- func (p *ConditionVariable) Signal()
- func (p *ConditionVariable) Specific() Value
- func (p *ConditionVariable) Wait(_ *Mutex, timeout *time.Duration) bool
- func (p *ConditionVariable) WaiterCount() int
- type DebugLocation
- type DebugState
- type Exactness
- type Float
- func (p *Float) Abs() Number
- func (p *Float) Add(o Number) Number
- func (p *Float) Compare(o Number) int
- func (p *Float) Divide(o Number) (Number, error)
- func (p *Float) EqualTo(v Value) bool
- func (p *Float) HashCode() uint64
- func (p *Float) IsExact() bool
- func (p *Float) IsFinite() bool
- func (p *Float) IsInteger() bool
- func (p *Float) IsNaN() bool
- func (p *Float) IsNegative() bool
- func (p *Float) IsPositive() bool
- func (p *Float) IsRational() bool
- func (p *Float) IsVoid() bool
- func (p *Float) IsZero() bool
- func (p *Float) Kind() NumericKind
- func (p *Float) LessThan(o Number) bool
- func (p *Float) Multiply(o Number) Number
- func (p *Float) Negate() Number
- func (p *Float) SchemeString() string
- func (p *Float) Sign() int
- func (p *Float) String() string
- func (p *Float) Subtract(o Number) Number
- func (p *Float) ToExact() (Number, error)
- func (p *Float) ToInexact() Number
- type Flusher
- type ForEachFunc
- type Hashable
- type Hashtable
- func (p *Hashtable) Clear()
- func (p *Hashtable) Copy() *Hashtable
- func (p *Hashtable) Delete(key Value) error
- func (p *Hashtable) Entries(fn func(key Hashable, value Value) error) error
- func (p *Hashtable) EqualTo(o Value) bool
- func (p *Hashtable) Get(key Value) (Value, bool, error)
- func (p *Hashtable) HasKey(key Value) (bool, error)
- func (p *Hashtable) IsVoid() bool
- func (p *Hashtable) Keys() Tuple
- func (p *Hashtable) SchemeString() string
- func (p *Hashtable) Set(key Value, val Value) error
- func (p *Hashtable) Size() int
- func (p *Hashtable) Values() Tuple
- type Immutable
- type Integer
- func (p *Integer) Abs() Number
- func (p *Integer) Add(o Number) Number
- func (p *Integer) Compare(o Number) int
- func (p *Integer) Divide(o Number) (Number, error)
- func (p *Integer) EqualTo(v Value) bool
- func (p *Integer) HashCode() uint64
- func (p *Integer) IsExact() bool
- func (p *Integer) IsFinite() bool
- func (p *Integer) IsInteger() bool
- func (p *Integer) IsNaN() bool
- func (p *Integer) IsNegative() bool
- func (p *Integer) IsPositive() bool
- func (p *Integer) IsRational() bool
- func (p *Integer) IsVoid() bool
- func (p *Integer) IsZero() bool
- func (p *Integer) Kind() NumericKind
- func (p *Integer) LessThan(o Number) bool
- func (p *Integer) Multiply(o Number) Number
- func (p *Integer) Negate() Number
- func (p *Integer) SchemeString() string
- func (p *Integer) Sign() int
- func (p *Integer) Subtract(o Number) Number
- func (p *Integer) ToExact() (Number, error)
- func (p *Integer) ToInexact() Number
- type JoinTimeoutException
- type Mutex
- func (p *Mutex) EqualTo(v Value) bool
- func (p *Mutex) ID() uint64
- func (p *Mutex) IsVoid() bool
- func (p *Mutex) Lock(timeout *time.Duration, owner *Thread) (bool, error)
- func (p *Mutex) MarkAbandoned()
- func (p *Mutex) Name() string
- func (p *Mutex) Owner() *Thread
- func (p *Mutex) SchemeString() string
- func (p *Mutex) SetSpecific(v Value)
- func (p *Mutex) Specific() Value
- func (p *Mutex) State() MutexState
- func (p *Mutex) StateValue() Value
- func (p *Mutex) Unlock(cv *ConditionVariable, timeout *time.Duration) bool
- type MutexState
- type NamedTypeConstraint
- type NativeError
- func NewErrorObject(message string, irritants ...Value) *NativeError
- func NewErrorObjectWithCause(message string, cause error, irritants ...Value) *NativeError
- func NewErrorObjectWithCauseAndKind(message string, cause error, kind NativeErrorKind, irritants ...Value) *NativeError
- func NewFileError(message string, irritants ...Value) *NativeError
- func NewNativeError(msg string) *NativeError
- func NewReadError(message string, irritants ...Value) *NativeError
- func (p *NativeError) EqualTo(v Value) bool
- func (p *NativeError) Error() string
- func (p *NativeError) Irritants() Value
- func (p *NativeError) IsFileError() bool
- func (p *NativeError) IsReadError() bool
- func (p *NativeError) IsVoid() bool
- func (p *NativeError) Kind() NativeErrorKind
- func (p *NativeError) Message() *String
- func (p *NativeError) SchemeString() string
- func (p *NativeError) SetSourceLocation(loc string)
- func (p *NativeError) SetStackTraceValue(v Value)
- func (p *NativeError) SourceLocation() string
- func (p *NativeError) StackTraceValue() Value
- func (p *NativeError) Unwrap() error
- type NativeErrorKind
- type Number
- type NumericKind
- type NumericTypeSpec
- func (p *NumericTypeSpec) IsAlwaysExact() bool
- func (p *NumericTypeSpec) SchemeName() string
- func (p *NumericTypeSpec) SimplifyDown(n Number) Number
- func (p *NumericTypeSpec) ToComplex128WithAccuracy(n Number) Complex128Result
- func (p *NumericTypeSpec) ToFloat64WithAccuracy(n Number) (float64, big.Accuracy, bool)
- type Once
- type OpaqueValue
- type OriginInfo
- type Pair
- func (p *Pair) Append(vs Value) Value
- func (p *Pair) AsVector() *Vector
- func (p *Pair) Car() Value
- func (p *Pair) Cdr() Value
- func (p *Pair) EqualTo(o Value) bool
- func (p *Pair) ForEach(ctx context.Context, fn ForEachFunc) (Value, error)
- func (p *Pair) IsEmptyList() bool
- func (p *Pair) IsList() bool
- func (p *Pair) IsVoid() bool
- func (p *Pair) Length() int
- func (p *Pair) SchemeString() string
- func (p *Pair) SetCar(v Value)
- func (p *Pair) SetCdr(v Value)
- func (p *Pair) String() string
- type PairBlock
- type Port
- type PortObject
- func NewBinaryInputPort(rdr *bufio.Reader) *PortObject
- func NewBinaryInputPortFromReader(reader io.Reader) *PortObject
- func NewBinaryOutputPortFromWriter(writer io.Writer) *PortObject
- func NewByteVectorBufferedOutputPort() *PortObject
- func NewByteVectorBufferedOutputPortFromBuffer(buf *bytes.Buffer) *PortObject
- func NewByteVectorInputOutputPort() *PortObject
- func NewByteVectorInputOutputPortFromBuffer(buf *bytes.Buffer) *PortObject
- func NewByteVectorInputPortFromReader(reader io.Reader) *PortObject
- func NewByteVectorOutputPortFromWriter(wrt io.Writer) *PortObject
- func NewCharacterInputPort(rdr *bufio.Reader) *PortObject
- func NewCharacterInputPortFromReader(rdr io.Reader) *PortObject
- func NewCharacterOutputPortFromWriter(wrt io.Writer) *PortObject
- func NewStringInputPortWithBuffer(buffer *bytes.Buffer) *PortObject
- func NewStringInputPortWithReaders(rdr io.Reader, rr io.RuneReader, urr RuneUnreader) *PortObject
- func NewStringOutputPort() *PortObject
- func NewStringOutputPortWithBuffer(buffer *bytes.Buffer) *PortObject
- func (p *PortObject) AsByteReader() (io.ByteReader, bool)
- func (p *PortObject) AsByteUnreader() (ByteUnreader, bool)
- func (p *PortObject) AsByteVectorExtractor() (ByteVectorExtractor, bool)
- func (p *PortObject) AsByteWriter() (io.ByteWriter, bool)
- func (p *PortObject) AsFlusher() (Flusher, bool)
- func (p *PortObject) AsReader() (io.Reader, bool)
- func (p *PortObject) AsRuneReader() (io.RuneReader, bool)
- func (p *PortObject) AsRuneUnreader() (RuneUnreader, bool)
- func (p *PortObject) AsRuneWriter() (RuneWriter, bool)
- func (p *PortObject) AsStringWriter() (io.StringWriter, bool)
- func (p *PortObject) AsWriter() (io.Writer, bool)
- func (p *PortObject) Close() error
- func (p *PortObject) EqualTo(v Value) bool
- func (p *PortObject) IsClosed() bool
- func (p *PortObject) IsVoid() bool
- func (p *PortObject) PortKind() string
- func (p *PortObject) SchemeString() string
- func (p *PortObject) StringContent() (string, bool)
- func (p *PortObject) Validate() error
- type Process
- type Promise
- type RWMutex
- func (p *RWMutex) EqualTo(v Value) bool
- func (p *RWMutex) ID() uint64
- func (p *RWMutex) IsVoid() bool
- func (p *RWMutex) Lock()
- func (p *RWMutex) Name() string
- func (p *RWMutex) RLock()
- func (p *RWMutex) RUnlock()
- func (p *RWMutex) SchemeString() string
- func (p *RWMutex) TryLock() bool
- func (p *RWMutex) TryRLock() bool
- func (p *RWMutex) Unlock()
- type Rational
- func (p *Rational) Abs() Number
- func (p *Rational) Add(o Number) Number
- func (p *Rational) Compare(o Number) int
- func (p *Rational) Denom() *big.Int
- func (p *Rational) DenomInt64() int64
- func (p *Rational) Divide(o Number) (Number, error)
- func (p *Rational) EqualTo(v Value) bool
- func (p *Rational) Float64Truncated() float64
- func (p *Rational) Float64WithAccuracy() (float64, big.Accuracy)
- func (p *Rational) HashCode() uint64
- func (p *Rational) IsExact() bool
- func (p *Rational) IsFinite() bool
- func (p *Rational) IsInteger() bool
- func (p *Rational) IsNaN() bool
- func (p *Rational) IsNegative() bool
- func (p *Rational) IsPositive() bool
- func (p *Rational) IsRational() bool
- func (p *Rational) IsVoid() bool
- func (p *Rational) IsZero() bool
- func (p *Rational) Kind() NumericKind
- func (p *Rational) LessThan(o Number) bool
- func (p *Rational) Multiply(o Number) Number
- func (p *Rational) Negate() Number
- func (p *Rational) Num() *big.Int
- func (p *Rational) NumInt64() int64
- func (p *Rational) Rat() *big.Rat
- func (p *Rational) SchemeString() string
- func (p *Rational) Sign() int
- func (p *Rational) Subtract(o Number) Number
- func (p *Rational) ToExact() (Number, error)
- func (p *Rational) ToInexact() Number
- type RealNumber
- type Record
- func (p *Record) EqualTo(v Value) bool
- func (p *Record) Field(index int) Value
- func (p *Record) FieldByName(name *Symbol) Value
- func (p *Record) IsVoid() bool
- func (p *Record) RecordType() *RecordType
- func (p *Record) SchemeString() string
- func (p *Record) SetField(index int, value Value)
- func (p *Record) SetFieldByName(name *Symbol, value Value)
- type RecordType
- func (p *RecordType) EqualTo(v Value) bool
- func (p *RecordType) FieldCount() int
- func (p *RecordType) FieldIndex(name *Symbol) int
- func (p *RecordType) FieldNames() []*Symbol
- func (p *RecordType) IsOpaque() bool
- func (p *RecordType) IsVoid() bool
- func (p *RecordType) Name() *Symbol
- func (p *RecordType) Parent() *RecordType
- func (p *RecordType) SchemeString() string
- type RecordTypeConstraint
- type RuneUnreader
- type RuneWriter
- type SchemeWriter
- type Scope
- func AddScopeToSet(scopes []*Scope, newScope *Scope) []*Scope
- func FlipScopeInSet(scopes []*Scope, target *Scope) []*Scope
- func NewRebindingScope() *Scope
- func NewRebindingScopeWithLabel(label string) *Scope
- func NewScope() *Scope
- func NewScopeWithLabel(label string) *Scope
- func RemoveScopeFromSet(scopes []*Scope, target *Scope) []*Scope
- type SelectCase
- type SelectCaseKind
- type SourceContext
- func (p *SourceContext) Clone() *SourceContext
- func (p *SourceContext) EqualTo(value Value) bool
- func (p *SourceContext) IsVoid() bool
- func (p *SourceContext) Location() string
- func (p *SourceContext) SchemeString() string
- func (p *SourceContext) WithOrigin(origin *OriginInfo) *SourceContext
- func (p *SourceContext) WithScope(scope *Scope) *SourceContext
- func (p *SourceContext) WithScopes(scopes []*Scope) *SourceContext
- func (p *SourceContext) WithoutScopes() *SourceContext
- type SourceIndexes
- func (p SourceIndexes) Column() int
- func (p SourceIndexes) EqualTo(o Value) bool
- func (p *SourceIndexes) Inc(n int) int
- func (p SourceIndexes) Index() int
- func (p SourceIndexes) IsVoid() bool
- func (p SourceIndexes) Line() int
- func (p *SourceIndexes) NewLine() int
- func (p SourceIndexes) SchemeString() string
- func (p *SourceIndexes) Tab() int
- type SourceLocation
- type String
- func (p *String) EqualTo(v Value) bool
- func (p *String) Fill(char rune, start, end int) error
- func (p *String) Get(i int) Value
- func (p *String) HashCode() uint64
- func (p *String) IsImmutable() bool
- func (p *String) IsVoid() bool
- func (p *String) Len() int
- func (p *String) Length() int
- func (p *String) Runes() []rune
- func (p *String) SchemeString() string
- func (p *String) Set(i int, v Value) error
- func (p *String) SetChar(k int, char rune) error
- func (p *String) SetValue(s string) error
- func (p *String) String() string
- type StringExtractor
- type Symbol
- type SyntaxBase
- type SyntaxForEachFunc
- type SyntaxTuple
- type SyntaxValue
- type SyntaxVector
- func (p *SyntaxVector) AddScope(scope *Scope) SyntaxValue
- func (p *SyntaxVector) EqualTo(o Value) bool
- func (p *SyntaxVector) ForEach(ctx context.Context, fn ForEachFunc) (Value, error)
- func (p *SyntaxVector) IsVoid() bool
- func (p *SyntaxVector) SchemeString() string
- func (p *SyntaxVector) SyntaxForEach(ctx context.Context, fn SyntaxForEachFunc) (SyntaxValue, error)
- func (p *SyntaxVector) Unwrap() Value
- func (p *SyntaxVector) UnwrapAll() Value
- type TerminatedThreadException
- type Thread
- func (p *Thread) AbandonOwnedMutexes()
- func (p *Thread) Context() context.Context
- func (p *Thread) Done() <-chan struct{}
- func (p *Thread) EqualTo(v Value) bool
- func (p *Thread) ID() uint64
- func (p *Thread) IsVoid() bool
- func (p *Thread) Join(timeout *time.Duration) (Value, error)
- func (p *Thread) Name() string
- func (p *Thread) SchemeString() string
- func (p *Thread) SetSpecific(v Value)
- func (p *Thread) Sleep(d time.Duration)
- func (p *Thread) Specific() Value
- func (p *Thread) Start(parentCtx context.Context) error
- func (p *Thread) State() ThreadState
- func (p *Thread) StateSymbol() *Symbol
- func (p *Thread) Terminate()
- func (p *Thread) TrackMutex(m *Mutex)
- func (p *Thread) UntrackMutex(m *Mutex)
- func (p *Thread) Yield()
- type ThreadState
- type Time
- func (p *Time) Add(d time.Duration) *Time
- func (p *Time) After(other *Time) bool
- func (p *Time) Before(other *Time) bool
- func (p *Time) DurationFromNow() time.Duration
- func (p *Time) EqualTo(v Value) bool
- func (p *Time) GoTime() time.Time
- func (p *Time) IsVoid() bool
- func (p *Time) SchemeString() string
- func (p *Time) Seconds() float64
- func (p *Time) Sub(other *Time) time.Duration
- type Tuple
- type TypeConstraint
- type UncaughtThreadException
- type Value
- func ChannelSelect(cases []SelectCase) (idx int, val Value, ok bool)
- func ForEach(ctx context.Context, o Value, fn ForEachFunc) (Value, error)
- func NthCons(lst Value, n int64, name string) (Value, error)
- func Single(t Tuple) (Value, bool)
- func StringOrFalse(s string) Value
- func UnconsTyped[T any](v Value, headSentinel error, name, role string) (T, Value, error)
- func ValueOrVoid(v Value) Value
- type ValueType
- type Vector
- type WaitGroup
- type WriteMode
Constants ¶
const ( PrefixCharacter = `#\` PrefixSyntax = `#'` PrefixDirective = `#!` PrefixBox = `#&` PrefixPrimitive = `#%` PrefixBlockComment = `#|` PrefixLineComment = `;` SpecialEOF = PrefixDirective + `eof` SpecialVoid = PrefixDirective + `void` )
Prefix constants for Scheme value representations.
const DefaultBigFloatPrecision = 256
DefaultBigFloatPrecision is the default precision for BigFloat values.
const MaxCodepoint rune = 0x10FFFF
MaxCodepoint is the largest valid Unicode codepoint (U+10FFFF).
Variables ¶
var ( // FalseValue is the singleton false boolean. FalseValue = newBoolean(false) // TrueValue is the singleton true boolean. TrueValue = newBoolean(true) )
var ( SymbolMutexNotOwned = NewSymbol("not-owned") SymbolMutexAbandoned = NewSymbol("abandoned") )
Mutex state symbol singletons.
StateValue() returns these instead of allocating fresh symbols on each call. Same process-global vs per-VM identity subtlety as the thread state symbols — see the doc comment on SymbolThreadNew in thread.go for details.
var ( // EmptyList is the singleton empty list (). // It implements Tuple but is not *Pair, enforcing (pair? '()) -> #f // at the type level per R7RS 6.4. // // It also satisfies SyntaxValue and SyntaxTuple — the empty list has // no symbols, scopes, or source-attachable hygiene content, so the // value-level singleton serves as the syntax-level singleton too // (matching Chez's `(equal? (syntax ()) '()) → #t`). For callers that // need the SyntaxTuple-typed view (e.g. so a SyntaxValue-returning // function can return the empty list directly), use SyntaxEmptyList // below — it refers to the same singleton. // // EmptyList is statically typed as Tuple (not SyntaxTuple) because the // common pattern `list := EmptyList; list = NewCons(...)` builds a // value-level list via type inference, and *Pair only implements // Tuple. Promoting EmptyList to SyntaxTuple would break that pattern. EmptyList Tuple = emptyListType{} // SyntaxEmptyList is the empty-list singleton typed as SyntaxTuple, // for use in contexts that build syntax-level lists or return // SyntaxValue. It is the same struct value as EmptyList; the package // `internal/syntax` re-exports this name for backward compatibility. SyntaxEmptyList SyntaxTuple = emptyListType{} )
var ( SymbolAccuracyBelow = NewSymbol("below") SymbolAccuracyExact = NewSymbol("exact") SymbolAccuracyAbove = NewSymbol("above") )
Accuracy singleton symbols — paraphrase big.Accuracy at the Scheme level. Returned by primitives like inexact-accuracy and inexact-with-accuracy.
'below — result < true value (rounded down) 'exact — result == true value (lossless) 'above — result > true value (rounded up)
var ( SymbolThreadNew = NewSymbol("new") SymbolThreadRunnable = NewSymbol("runnable") SymbolThreadBlocked = NewSymbol("blocked") SymbolThreadTerminated = NewSymbol("terminated") SymbolThreadUnknown = NewSymbol("unknown") SymbolPrimordial = NewSymbol("primordial") )
Thread state symbol singletons.
StateSymbol() and PrimCurrentThread return these package-level singletons instead of allocating fresh symbols on each call. This guarantees self-consistency: (eq? (thread-state t) (thread-state t)) → #t.
However, these are process-global pointers, not per-VM interned symbols. Reader-interned 'new (created via the parser gate) lives in the per-VM Namespace intern table and is a different pointer. Therefore:
(eq? (thread-state t) (thread-state t)) → #t (same singleton) (eq? (thread-state t) 'new) → #f (singleton ≠ interned) (equal? (thread-state t) 'new) → #t (string comparison)
SRFI-18 defines thread states as symbols but does not mandate eq? identity against reader-interned symbols, so this is conformant. The equal? path works because Symbol.EqualTo compares .Key strings.
To make eq? work against reader-interned symbols, these singletons would need to participate in the per-VM intern table. That requires either:
- Lazily interning on first use (needs access to an environment)
- Registering these symbols during Engine initialization
The values/ package cannot import environment/ (it's lower in the dependency graph), so this would need to be driven from engine.go or registry/. This is deferred until there is a concrete need.
var SyntaxValueUnwrapAllFunc func(SyntaxValue, map[SyntaxValue]Value) Value
SyntaxValueUnwrapAllFunc is the cycle-aware recursive unwrapper.
The full recursive unwrap traverses concrete syntax types (SyntaxPair, SyntaxObject, SyntaxSymbol, etc.) defined in internal/syntax. Since values cannot import internal/syntax (layering), the syntax package registers its UnwrapAllShared implementation here at init time.
MUST be non-nil before any SyntaxVector method that depends on it is called. internal/syntax/syntax_vector.go init() sets this. A nil hook at call time indicates an init-order or import-graph violation; the methods that depend on it panic rather than silently degrade — silent degradation would corrupt hygiene or stack-overflow on cyclic data.
var SyntaxVectorAddScopeFunc func(*SyntaxVector, *Scope) SyntaxValue
SyntaxVectorAddScopeFunc implements recursive scope propagation across nested syntax types. The implementation lives in internal/syntax (where the concrete syntax types are) and is registered here at init time.
MUST be non-nil. See SyntaxValueUnwrapAllFunc for the rationale.
Functions ¶
func BigIntegerEqualsFloat ¶ added in v1.3.0
func BigIntegerEqualsFloat(bi *BigInteger, f *Float) bool
BigIntegerEqualsFloat compares a BigInteger to a Float. Returns true only if the float exactly represents the BigInteger value.
func BooleanToBool ¶ added in v1.4.0
BooleanToBool converts a Scheme *Boolean to a Go bool value.
func CarAs ¶ added in v1.17.0
CarAs asserts t.Car() has concrete type T. Use this when the caller already holds a Tuple in hand and only needs a typed head — the tail is left implicit. For typed head + tail in one call, use UnconsTyped.
func DisplayValueToString ¶
DisplayValueToString writes a Scheme value to a string for display with cycle detection. Unlike WriteValueToString, strings are printed without quotes and characters without #\.
func EqIdentity ¶ added in v1.17.0
EqIdentity implements R7RS eq? semantics: pointer identity for all types except symbols, which compare by name/key (R7RS §6.1, §6.5). It is the single source of truth for eq?-identity — machine (the VM's promoted OpEqQ and continuation-mark scans) and registry/helpers both route through it. Living in values/ dissolves the machine↛registry import barrier that previously forced a duplicate copy. Kept small and branch-light so it inlines into the hot callers.
func ExactInteger ¶
ExactInteger extracts an exact integer from a Scheme value. Returns the int64 value and true if the value is an exact integer that fits in int64. Returns 0 and false otherwise.
Accepts:
- *Integer: direct int64 value
- *BigInteger: if it fits in int64
- *Rational: if denominator is 1 and numerator fits in int64
R7RS defines exact integers to include rationals like 2/1 that are mathematically integers. Call sites should check for non-negativity if required (e.g., for indexes).
func ForEachProperList ¶ added in v1.17.0
ForEachProperList calls fn on each element of t and returns ErrNotAList if the tail is not the empty list (i.e., t is an improper list). If fn returns an error, that error is returned unchanged.
This is the canonical proper-list eliminator — every site that walks a list and rejects improper tails should funnel through this function so the rejection logic is defined exactly once. registry/helpers.ForEachList delegates here; new code in any layer should call ForEachProperList directly when it cannot import the helpers package (e.g., machine/).
func FormatOriginChain ¶ added in v1.16.0
func FormatOriginChain(origin *OriginInfo, maxDepth int) string
FormatOriginChain returns a formatted string showing the macro expansion chain. maxDepth limits how many expansions to show (0 = unlimited).
func IntegerEqualsFloat ¶ added in v1.3.0
IntegerEqualsFloat compares an exact integer to an inexact float. Returns true only if the float exactly represents the integer value.
R7RS §6.2.5: Numeric equality must not lose precision. An exact integer and an inexact float are equal only if the float exactly represents the integer's value.
func IsEmptyList ¶
IsEmptyList returns true if the value is the empty list. Returns false for nil values. For Tuple types, delegates to their IsEmptyList method.
func IsList ¶
IsList returns true if the value is a proper list. A proper list is either EmptyList or a chain of pairs ending with EmptyList. Returns false for nil, improper lists (dotted pairs), and non-list values.
func IsVoid ¶
IsVoid returns true if the value represents the absence of a meaningful result.
Void, EmptyList, and nil Semantics ¶
The value system distinguishes three "absence/empty" concepts:
Void (voidType{} singleton): no meaningful result (e.g., set!, display). Canonical check: values.IsVoid(v) — handles both nil and the Void singleton.
EmptyList (emptyListType{} singleton): the empty list () — a valid first-class Scheme value. Implements Tuple but not *Pair. Canonical check: values.IsEmptyList(v) — handles nil safely (returns false).
Go nil (nil interface): uninitialized / absent in Go — not a Scheme value. IsVoid(nil) returns true; IsEmptyList(nil) returns false.
Anti-patterns to avoid:
- v == values.EmptyList or v != values.EmptyList → use values.IsEmptyList(v)
- v == values.Void → use values.IsVoid(v)
- v == nil || values.IsVoid(v) → redundant; values.IsVoid(v) handles nil
Note: typed nil pointers (e.g., var p *Pair = nil) are handled by the type's IsVoid() method, which checks for nil receiver.
func Must ¶ added in v1.1.0
Must panics if err is non-nil or v is not EmptyList. Designed for use with ForEach on lists guaranteed to be proper:
Must(p.ForEach(ctx, func(...) error { ... }))
func NumberToComplex128Lossy ¶ added in v1.16.0
func NumberToComplex128Lossy(n Number) complex128
NumberToComplex128Lossy converts any Number to complex128, discarding per-component precision-loss signals. BigFloat and BigComplex values are reduced to float64/complex128 precision. Intended for paths where precision loss is acceptable, such as IEEE 754 Inf/NaN guards and inexact complex arithmetic in extensions. Callers needing loss signals should use ToComplex128WithAccuracy directly.
func NumberToFloat64 ¶ added in v1.5.0
NumberToFloat64 converts any Number to a best-effort float64 approximation.
Behavior across kinds:
- Integer/BigInteger/Float/BigFloat/Rational: silent precision loss is possible (BigInteger > 2^53, BigFloat with extra precision, Rational like 1/3). Use ToFloat64WithAccuracy via the spec for loss signals.
- Complex/BigComplex with imag == 0: returns the real part (lossless since no information is discarded).
- Complex/BigComplex with imag != 0: panics with ErrNotAReal; the imaginary component cannot be carried in a float64. Callers in extensions/math should Simplify() the value first if they want zero-imag complex inputs to flow through transparently.
func NumericEquals ¶ added in v1.17.0
NumericEquals implements R7RS = semantics for two numbers.
R7RS §6.2.5: The = procedure returns #t if its arguments are numerically equal. For IEEE 754 floats: infinities of the same sign are equal, NaN is not equal to anything (including itself). Cross-type Integer/BigInteger vs Float comparisons go through the exact-precision helpers above so no precision is lost; all other type pairs fall back to subtraction.
func SchemeTypeName ¶ added in v1.10.3
SchemeTypeName returns the Scheme-facing type name for a value. Used in error messages so users see "integer" instead of "*values.Integer".
Resolution proceeds in three layers:
- The goTypeToValueType reverse map covers concrete types backed by a ValueType constant — one lookup, no per-type case.
- A small explicit switch covers types whose Scheme name has no ValueType counterpart (records, boxes, promises).
- IsEmptyList catches the empty-list singleton.
Unrecognized types fall through to fmt.Sprintf("%T", v) as a debugging-grade name. Adding a new Value type with a ValueType constant means adding one row to goTypeToValueType, not editing this function.
func ScopesCompatible ¶ added in v1.16.0
ScopesCompatible checks whether a binding with bindingScopes can match a reference with useScopes. A binding with no scopes (top-level / pre-hygiene) matches any reference.
Both the environment's resolveLocal and the validator's duplicate-binding detection use this single function so scope resolution cannot diverge.
Note: nil useScopes does NOT mean "match any" here. A nil reference scope set means "this reference has no scopes" and behaves like an empty set — only bindings with no scopes match. Callers that want "match any" (replacing the old checkScopes=false pattern) guard with an explicit nil check before calling this function.
func ScopesMatch ¶ added in v1.16.0
ScopesMatch checks if two sets of scopes are compatible for binding resolution. This implements the core hygiene check using Flatt's "sets of scopes" model: A reference matches a binding if the binding's scope set is a SUBSET of the reference's scope set.
Powerset lattice P(S) (Flatt 2016, §3.2). Binding resolution is a subset test on finite scope sets.
match(ref, bind) ⟺ bind.scopes ⊆ ref.scopes
resolve(ref) = argmax { |s| : s ⊆ ref.scopes } over all bindings
where ref = useScopes, bind = bindingScopes,
s = a candidate binding's scope set, |s| = scope count.
Operations on P(S):
AddScopeToSet = join (union)
RemoveScopeFromSet = relative complement
FlipScopeInSet = symmetric difference (XOR in Z/2Z^S)
Invariant: {} ⊆ X for all X — top-level bindings (empty scope set)
match every reference. The argmax selects the most specific binding.
Constrains: GetLocalIndex (implements resolve/argmax),
GetBinding (maximal resolution for scoped lookups),
CompileSymbol (dispatches scoped vs unscoped lookup),
scopesCompatibleForSubstitution (bidirectional subset = set equality).
Constrained by: NewScope (each macro invocation creates a fresh scope),
FlipScopeInSet (syntax-local-introduce toggles scope membership).
See BIBLIOGRAPHY.md "Binding as Sets of Scopes".
This ensures: - Top-level bindings (empty scope set) match any reference: {} ⊆ X for all X - A macro-introduced binding only matches references with that macro's intro scope - User bindings don't capture macro-introduced identifiers (different scope sets)
Implementation note: Linear scan with pointer equality is intentionally used here. Scope sets are typically 0-4 elements (one per lexical form: macro invocation, lambda, let-syntax, with-binding-scope). For sets this small, linear scan is faster than hash-based or bitmap approaches due to cache locality and zero allocation overhead.
func Spine ¶ added in v1.17.0
Spine yields each *Pair along p's cdr chain. If the list terminates in EmptyList, *improperTail is set to EmptyList. If it terminates in a non-list cdr (improper list), *improperTail is set to that value. improperTail may be nil if the caller does not care about the tail.
Spine is the catamorphism for the initial list algebra
List = μX. 1 + Value × X
and is the irreducible spine-walk consumed by Pair.IsList, Length, AsVector, EqualTo, and SchemeString. It does NOT detect cycles — for cyclic input, use SpineWithCycleCheck.
The yielded value pair (*Pair, struct{}) uses struct{} so consumers can write either `for cell := range Spine(p, &tail)` (preferred) or `for cell, _ := range Spine(p, &tail)`.
func SpineWithCycleCheck ¶ added in v1.17.0
SpineWithCycleCheck is Spine with Floyd's tortoise-and-hare cycle detection. *cycled is set to true if a cycle is detected, false otherwise. cycled may be nil if the caller does not care.
The iterator yields every cell up to (but not necessarily including) the point of cycle detection, and yields every cell of a proper or improper list before terminating. It does NOT report the improper tail — Floyd's algorithm cannot distinguish improper-tail termination from cycle detection in a single pass without an extra O(n) visited set. Callers that need both should use Spine with an external visited map.
func ToComplex128Lossless ¶ added in v1.16.0
func ToComplex128Lossless(n Number) (complex128, error)
ToComplex128Lossless returns the raw complex128, or ErrLossyConversion if either component's accuracy is non-Exact.
func ToFloat64Lossless ¶ added in v1.16.0
ToFloat64Lossless is the FFI-strict convenience wrapper. Returns the raw float64 (callers in strict mode don't need the accuracy slot — they just want the value or an error). Returns ErrLossyConversion (wrapped, with direction info) if the conversion would lose precision OR drop the imaginary part.
func ToFloat64WithAccuracy ¶ added in v1.16.0
ToFloat64WithAccuracy is the primary loss-signal-aware conversion helper. ToFloat64Lossless wraps it.
Returns 4-tuple positional:
- f: the float64 representation, saturated to ±Inf for overflow per Go (*big.Float).Float64() semantics
- acc: Below/Exact/Above per Go big.Accuracy semantics, describing *only the real-axis rounding direction* of the returned float64 against the original real-axis value: Below: f < real-axis true value (rounded down) Exact: f == real-axis true value (lossless) Above: f > real-axis true value (rounded up) For Complex/BigComplex with non-zero imag, acc describes the real component only; the imaginary-drop signal is carried solely by isReal. The two channels (acc, isReal) are orthogonal — never collapse a non-real input's loss into acc.
- isReal: false iff n was Complex/BigComplex with non-zero imaginary part (the imaginary information is dropped — caller should use ToComplex128WithAccuracy for full complex semantics)
- err: ErrNotANumber (wrapped) on a defensive nil-Number input. The signature is `n Number`, so a non-Number value cannot be passed — the nil case is the only reachable error path.
No information loss from the Go big package is introduced by this helper — every signal Go's stdlib surfaces is exposed through the four positional slots.
NaN/Inf contract (per design Q-6 resolution): NaN inputs return (NaN, Exact, true, nil) — NaN→NaN is bit-pattern identity in IEEE 754, so accuracy is Exact mechanically. A *true* infinite input (*Float(math.Inf(1))) returns (+Inf, Exact, true, nil). Finite values that overflow during conversion return (±Inf, Above|Below, true, nil). Callers checking "is this a meaningful real number?" must screen finiteness independently via math.IsNaN(f) and math.IsInf.
FFI lossy-allowed callers use this directly via the discard pattern `f, _, _, _ := ToFloat64WithAccuracy(n)`; FFI strict callers use ToFloat64Lossless.
func Uncons ¶ added in v1.17.0
Uncons asserts v is a non-empty Tuple and projects (car, cdr). On empty list or non-Tuple input, returns a wrapped ErrNotAList with the canonical "<name>: <role>" message format. The cdr may be any Value — improper lists are accepted here; callers that need a proper-list tail should follow up with ForEachProperList.
Uncons is the eliminator for the Tuple algebra: every site that needs to peel one element off the front of a list and continue with the remainder should funnel through here so the empty-list / non-Tuple rejection is defined exactly once. registry/helpers.Uncons delegates here.
func ValidateByteValue ¶ added in v1.3.0
ValidateByteValue checks that an integer is in the byte range [0, 255]. Returns a wrapped werr.ErrNotAByte error if the value is out of range.
func ValueToBool ¶ added in v1.4.0
ValueToBool converts a value into a Go bool using Scheme semantics. In Scheme, only #f is false; everything else (including 0, "", '()) is true.
func WriteSharedValueToString ¶
WriteSharedValueToString writes a Scheme value to a string with shared structure detection. Uses WriteModeWriteShared: datum labels for all multiply-referenced objects. R7RS §6.13.3: write-shared outputs datum labels for all shared structure.
func WriteValueToString ¶
WriteValueToString writes a Scheme value to a string with cycle detection. Uses WriteModeWrite: datum labels only for circular references. R7RS §6.13.3: write outputs datum labels only for objects that are part of a cycle.
Types ¶
type AbandonedMutexException ¶
type AbandonedMutexException struct {
Mutex Value // *Mutex, but avoid circular import
}
AbandonedMutexException is raised when a mutex owner terminates
func (*AbandonedMutexException) Error ¶
func (p *AbandonedMutexException) Error() string
type AtomicBox ¶
type AtomicBox struct {
// contains filtered or unexported fields
}
AtomicBox provides atomic operations on a Value This uses atomic.Value from the standard library
func NewAtomicBox ¶
NewAtomicBox creates a new AtomicBox with the given initial value
func (*AtomicBox) CompareAndSwap ¶
CompareAndSwap atomically compares and swaps if current equals old Returns true if the swap was performed
func (*AtomicBox) SchemeString ¶
SchemeString returns the Scheme representation of the atomic.
type AtomicInt64 ¶
type AtomicInt64 struct {
// contains filtered or unexported fields
}
AtomicInt64 provides atomic operations on int64 values This is more efficient than AtomicBox for integer operations
func NewAtomicInt64 ¶
func NewAtomicInt64(initial int64) *AtomicInt64
NewAtomicInt64 creates a new AtomicInt64 with the given initial value
func (*AtomicInt64) Add ¶
func (p *AtomicInt64) Add(delta int64) int64
Add atomically adds delta and returns the new value
func (*AtomicInt64) CompareAndSwap ¶
func (p *AtomicInt64) CompareAndSwap(ol, nw int64) bool
CompareAndSwap atomically compares and swaps Returns true if the swap was performed
func (*AtomicInt64) EqualTo ¶
func (p *AtomicInt64) EqualTo(v Value) bool
EqualTo returns true if the atomics are the same object.
func (*AtomicInt64) ID ¶
func (p *AtomicInt64) ID() uint64
ID returns the AtomicInt64's unique identifier
func (*AtomicInt64) IsVoid ¶
func (p *AtomicInt64) IsVoid() bool
IsVoid returns true if the atomic int64 is nil.
func (*AtomicInt64) Load ¶
func (p *AtomicInt64) Load() int64
Load atomically loads and returns the value
func (*AtomicInt64) SchemeString ¶
func (p *AtomicInt64) SchemeString() string
SchemeString returns the Scheme representation of the atomic int64.
func (*AtomicInt64) Swap ¶
func (p *AtomicInt64) Swap(nw int64) int64
Swap atomically stores new and returns the old value
type BigComplex ¶
type BigComplex struct {
// contains filtered or unexported fields
}
BigComplex represents an arbitrary-precision complex number. The real and imaginary parts can be *BigInteger, *Rational (exact), or *BigFloat (inexact).
R7RS §6.2.1: Complex numbers are part of the numeric tower hierarchy:
number ⊃ complex ⊃ real ⊃ rational ⊃ integer
R7RS §6.2.2: BigComplex is exact if both parts are BigInteger or Rational, inexact if either part is BigFloat. Operations follow exactness contagion rules.
func NewBigComplex ¶
func NewBigComplex(rel, iam Number) *BigComplex
NewBigComplex creates a new BigComplex from real and imaginary parts. Parts must be *BigInteger, *Rational, or *BigFloat. Other types will panic.
func NewBigComplexFromBigFloats ¶
func NewBigComplexFromBigFloats(rel, iam *BigFloat) *BigComplex
NewBigComplexFromBigFloats creates an inexact BigComplex from BigFloat parts.
func NewBigComplexFromBigIntegers ¶
func NewBigComplexFromBigIntegers(rel, iam *BigInteger) *BigComplex
NewBigComplexFromBigIntegers creates an exact BigComplex from BigInteger parts.
func (*BigComplex) Abs ¶ added in v1.1.0
func (p *BigComplex) Abs() Number
Abs returns the magnitude of this BigComplex as a Number.
R7RS §6.2.6: For complex numbers, abs returns the magnitude.
func (*BigComplex) Add ¶
func (p *BigComplex) Add(o Number) Number
R7RS §6.2.6: The + procedure returns the sum of its arguments. R7RS §6.2.2 Exactness: exact + exact = exact, exact + inexact = inexact. Inexactness is contagious per R7RS §6.2.2.
func (*BigComplex) Compare ¶
func (p *BigComplex) Compare(o Number) int
Compare compares this BigComplex with another number by real parts.
R7RS §6.2.6: Numeric comparisons use mathematical value. For complex numbers, we compare real parts only (matching Complex behavior).
func (*BigComplex) Conjugate ¶
func (p *BigComplex) Conjugate() *BigComplex
Conjugate returns the complex conjugate (a-bi for a+bi).
func (*BigComplex) Divide ¶
func (p *BigComplex) Divide(o Number) (Number, error)
Divide returns the quotient of this BigComplex and another number. Complex division: (a+bi)/(c+di) = ((ac+bd) + (bc-ad)i) / (c²+d²)
R7RS §6.2.6: The / procedure returns the quotient of its arguments. R7RS §6.2.2 Exactness: exact / exact = exact, exact / inexact = inexact.
func (*BigComplex) EqualTo ¶
func (p *BigComplex) EqualTo(o Value) bool
EqualTo returns true if both complex numbers have equal real and imaginary parts.
R7RS §6.2.6: The = procedure compares numerical values for equality.
func (*BigComplex) HashCode ¶ added in v1.5.0
func (p *BigComplex) HashCode() uint64
HashCode returns a hash of the complex value. Hashes real and imaginary parts independently via hashInexactNumeric and combines them with a multiplicative mixing constant. Uses the same combining formula as Complex.HashCode for cross-type consistency: when BigComplex.EqualTo(*Complex) holds, both produce equal hashes.
func (*BigComplex) Imag ¶
func (p *BigComplex) Imag() Number
Imag returns the imaginary part of the complex number.
func (*BigComplex) ImagAsBigFloat ¶
func (p *BigComplex) ImagAsBigFloat() *BigFloat
ImagAsBigFloat returns the imaginary part converted to BigFloat for calculations.
func (*BigComplex) ImagPart ¶ added in v1.1.0
func (p *BigComplex) ImagPart() Number
ImagPart returns the imaginary part of this complex number as a Number.
R7RS §6.2.6: imag-part returns the imaginary part of a complex number.
func (*BigComplex) IsExact ¶
func (p *BigComplex) IsExact() bool
IsExact returns true if both parts are exact (BigInteger or Rational).
R7RS §6.2.2: A complex number is exact if both real and imaginary parts are exact.
func (*BigComplex) IsFinite ¶ added in v1.1.0
func (p *BigComplex) IsFinite() bool
IsFinite returns true if both real and imaginary parts are finite.
R7RS §6.2.6: finite? returns #t if neither part is Inf or NaN.
func (*BigComplex) IsInteger ¶ added in v1.1.0
func (p *BigComplex) IsInteger() bool
IsInteger returns true if the imaginary part is zero and the real part is an integer.
R7RS §6.2.6: integer? returns #t for complex numbers with zero imaginary part whose real part is an integer.
func (*BigComplex) IsNaN ¶ added in v1.1.0
func (p *BigComplex) IsNaN() bool
IsNaN returns true if either real or imaginary part is NaN.
R7RS §6.2.6: nan? returns #t for complex numbers with a NaN component.
func (*BigComplex) IsRational ¶ added in v1.1.0
func (p *BigComplex) IsRational() bool
IsRational returns true if this BigComplex is a real, finite number.
R7RS §6.2.6: rational? returns #t for finite real numbers. Inf and NaN are not rational, even when the imaginary part is zero.
func (*BigComplex) IsReal ¶
func (p *BigComplex) IsReal() bool
IsReal returns true if the imaginary part is zero.
func (*BigComplex) IsVoid ¶
func (p *BigComplex) IsVoid() bool
IsVoid returns true if this BigComplex is nil.
func (*BigComplex) IsZero ¶
func (p *BigComplex) IsZero() bool
IsZero returns true if both real and imaginary parts are zero.
func (*BigComplex) Kind ¶ added in v1.5.0
func (p *BigComplex) Kind() NumericKind
Kind returns the numeric kind for dispatch table indexing.
func (*BigComplex) LessThan ¶
func (p *BigComplex) LessThan(o Number) bool
LessThan compares the real parts of complex numbers. Following R7RS, < is not mathematically defined for complex numbers, but we follow the existing Complex.LessThan pattern of comparing real parts.
func (*BigComplex) Magnitude ¶
func (p *BigComplex) Magnitude() *BigFloat
Magnitude returns the absolute value (modulus) of the complex number. |a+bi| = sqrt(a² + b²)
func (*BigComplex) Multiply ¶
func (p *BigComplex) Multiply(o Number) Number
Multiply returns the product of this BigComplex and another number. Complex multiplication: (a+bi)(c+di) = (ac-bd) + (ad+bc)i
R7RS §6.2.6: The * procedure returns the product of its arguments. R7RS §6.2.2 Exactness: exact * exact = exact, exact * inexact = inexact.
func (*BigComplex) Negate ¶
func (p *BigComplex) Negate() Number
Negate returns the negation of this BigComplex.
func (*BigComplex) Phase ¶
func (p *BigComplex) Phase() *BigFloat
Phase returns the phase (argument) of the complex number in radians. Uses atan2(imag, real).
func (*BigComplex) Real ¶
func (p *BigComplex) Real() Number
Real returns the real part of the complex number.
func (*BigComplex) RealAsBigFloat ¶
func (p *BigComplex) RealAsBigFloat() *BigFloat
RealAsBigFloat returns the real part converted to BigFloat for calculations.
func (*BigComplex) RealPart ¶ added in v1.1.0
func (p *BigComplex) RealPart() Number
RealPart returns the real part of this complex number as a Number.
R7RS §6.2.6: real-part returns the real part of a complex number.
func (*BigComplex) SchemeString ¶
func (p *BigComplex) SchemeString() string
SchemeString returns the Scheme representation of this BigComplex.
func (*BigComplex) Subtract ¶
func (p *BigComplex) Subtract(o Number) Number
Subtract returns the difference of this BigComplex and another number.
R7RS §6.2.6: The - procedure returns the difference of its arguments. R7RS §6.2.2 Exactness: exact - exact = exact, exact - inexact = inexact.
func (*BigComplex) ToExact ¶
func (p *BigComplex) ToExact() (Number, error)
ToExact converts this BigComplex to an exact representation.
R7RS §6.2.6: exact returns an exact representation of its argument. If already exact, returns itself. Otherwise converts BigFloat parts to BigInteger by truncating (may lose precision).
func (*BigComplex) ToInexact ¶
func (p *BigComplex) ToInexact() Number
ToInexact converts this BigComplex to an inexact representation.
R7RS §6.2.6: inexact returns an inexact representation of its argument. Converts BigInteger parts to BigFloat.
type BigFloat ¶
type BigFloat struct {
// contains filtered or unexported fields
}
BigFloat represents an arbitrary-precision floating-point number. Created with the #m prefix in Scheme (e.g., #m3.14159265358979323846).
big.Float natively supports ±Inf via SetInf/IsInf. NaN has no native big.Float representation (operations that produce NaN under IEEE 754 panic with big.ErrNaN instead), so NaN is tracked via an out-of-band flag.
Invariant: when nan is true, value MUST be a valid (zero-valued) *big.Float, never nil, to prevent nil-pointer panics.
func NewBigFloat ¶
NewBigFloat creates a new BigFloat from a big.Float.
func NewBigFloatFromFloat64 ¶
NewBigFloatFromFloat64 creates a new BigFloat from a float64.
func NewBigFloatFromString ¶
NewBigFloatFromString creates a new BigFloat from a string. Returns nil if the string is not a valid number.
func NewBigFloatNaN ¶ added in v1.5.0
func NewBigFloatNaN() *BigFloat
NewBigFloatNaN creates a new BigFloat representing NaN.
func (*BigFloat) Add ¶
R7RS §6.2.6: The + procedure returns the sum of its arguments. R7RS §6.2.2 Exactness: inexact + inexact = inexact, exact + inexact = inexact. Inexactness is contagious per R7RS §6.2.2.
func (*BigFloat) BigFloatValue ¶
BigFloatValue returns the underlying big.Float value.
func (*BigFloat) Compare ¶
Compare compares this BigFloat with another number. Returns 0 for NaN operands (NaN has no valid ordering).
func (*BigFloat) EqualTo ¶
EqualTo returns true if this BigFloat equals another value. NaN is not equal to anything, including itself (IEEE 754).
func (*BigFloat) Float64Truncated ¶ added in v1.16.0
Float64Truncated returns the value as float64, silently rounding when the magnitude exceeds float64 precision. Use only when downstream code inherently cannot use the accuracy bit (math.Sin/Cos inputs, FNV hash seeds, transcendental coercions).
For loss-signal-aware conversion, use Float64WithAccuracy() instead.
NaN handling: a BigFloat with the NaN flag set returns math.NaN().
func (*BigFloat) Float64WithAccuracy ¶ added in v1.16.0
Float64WithAccuracy returns the value as float64 along with Go's big.Accuracy indicator (Below / Exact / Above). Mirrors the stdlib (*big.Float).Float64() signature directly; the NaN flag is surfaced as (math.NaN(), big.Exact) since NaN→NaN is bit-pattern identity.
Use this whenever the caller can reasonably act on the accuracy bit (precision-aware conversions, the ToFloat64WithAccuracy public helper).
func (*BigFloat) HashCode ¶ added in v1.3.0
HashCode returns a hash code for this BigFloat. For Inf and NaN, delegates to float64 bit pattern matching Float.HashCode, ensuring Float and BigFloat produce identical hashes for equal values.
Note: NaN != NaN (IEEE 754), so two NaN BigFloats are never EqualTo each other. A NaN key stored in a hashtable is therefore unretrievable — the Hashable contract is not violated, but NaN is not a useful hashtable key.
func (*BigFloat) IsFinite ¶ added in v1.1.0
IsFinite returns true if this BigFloat holds a finite value.
R7RS §6.2.6: finite? returns #t for finite numbers.
func (*BigFloat) IsInteger ¶ added in v1.1.0
IsInteger returns true if this BigFloat represents an integer value.
R7RS §6.2.6: integer? returns #t for inexact integers.
func (*BigFloat) IsNaN ¶ added in v1.1.0
IsNaN returns true if this BigFloat holds NaN.
R7RS §6.2.6: nan? returns #t for NaN values.
func (*BigFloat) IsNegative ¶
IsNegative returns true if this BigFloat is negative. NaN has no sign and returns false.
func (*BigFloat) IsPositive ¶
IsPositive returns true if this BigFloat is positive. NaN has no sign and returns false.
func (*BigFloat) IsRational ¶ added in v1.1.0
IsRational returns true if this BigFloat holds a finite value.
R7RS §6.2.6: rational? returns #t for all finite real numbers. Inf and NaN are not rational.
func (*BigFloat) Kind ¶ added in v1.5.0
func (p *BigFloat) Kind() NumericKind
Kind returns the numeric kind for dispatch table indexing.
func (*BigFloat) SchemeString ¶
SchemeString returns the Scheme representation of this BigFloat.
R7RS §6.2.6: Inexact integers must include a decimal point to distinguish them from exact integers. big.Float.Text('g', -1) drops ".0" for integer values, so we append it when neither '.' nor 'e'/'E' is present.
func (*BigFloat) Sign ¶ added in v1.1.0
Sign returns -1 if negative, 0 if zero, or 1 if positive. NaN returns 0 (NaN has no sign).
func (*BigFloat) Subtract ¶
Subtract returns the difference of this BigFloat and another number.
R7RS §6.2.6: The - procedure returns the difference of its arguments. R7RS §6.2.2 Exactness: inexact - inexact = inexact, exact - inexact = inexact.
type BigInteger ¶
type BigInteger struct {
// contains filtered or unexported fields
}
BigInteger represents an arbitrary-precision integer. Created with the #z prefix in Scheme (e.g., #z12345678901234567890).
R7RS §6.2.1: Integers are exact numbers in the numeric tower hierarchy:
number ⊃ complex ⊃ real ⊃ rational ⊃ integer
R7RS §6.2.2: BigInteger is always exact. Operations on exact numbers produce exact results when mathematically well-defined.
R7RS §6.2.3: Implementations may support arbitrarily large exact integers. BigInteger provides this capability using Go's math/big.Int.
Precision Preservation ¶
BigInteger operations with Float preserve precision by promoting to BigFloat for comparison and arithmetic. This avoids precision loss from converting large BigIntegers to float64 (which has only 53 bits of mantissa precision).
Prior to M5 fix, BigIntegers with >53 significant bits would be truncated when compared with Float, causing incorrect comparison results. For example, comparing 2^53+1 with 2^53.0 would incorrectly report equality after both were converted to the same float64 value.
The fix promotes both operands to BigFloat (arbitrary precision), ensuring correct comparisons and arithmetic while preserving R7RS exactness contagion (exact + inexact → inexact).
func NewBigInteger ¶
func NewBigInteger(v *big.Int) *BigInteger
NewBigInteger creates a new BigInteger from a big.Int.
func NewBigIntegerFromInt64 ¶
func NewBigIntegerFromInt64(v int64) *BigInteger
NewBigIntegerFromInt64 creates a new BigInteger from an int64.
func NewBigIntegerFromString ¶
func NewBigIntegerFromString(s string, base int) *BigInteger
NewBigIntegerFromString creates a new BigInteger from a string. Returns nil if the string is not a valid integer.
func (*BigInteger) Abs ¶
func (p *BigInteger) Abs() Number
Abs returns the absolute value of this BigInteger.
func (*BigInteger) Add ¶
func (p *BigInteger) Add(o Number) Number
R7RS §6.2.6: The + procedure returns the sum of its arguments. R7RS §6.2.2 Exactness: exact + exact = exact (BigInteger), exact + inexact = inexact (Float/Complex). Inexactness is contagious per R7RS §6.2.2.
func (*BigInteger) BigInt ¶
func (p *BigInteger) BigInt() *big.Int
BigInt returns the underlying big.Int value.
func (*BigInteger) Compare ¶
func (p *BigInteger) Compare(o Number) int
Compare compares this BigInteger with another number.
R7RS §6.2.6: Numeric comparisons use mathematical value regardless of exactness. Returns -1, 0, or 1 for less than, equal, or greater than.
func (*BigInteger) Divide ¶
func (p *BigInteger) Divide(o Number) (Number, error)
Divide returns the quotient of this BigInteger and another number.
R7RS §6.2.6: The / procedure returns the quotient of its arguments. For exact arguments, / may return a non-integer (Rational) when the mathematical result is not an integer. Returns BigInteger only when the division is exact (remainder is zero).
R7RS §6.2.2 Exactness: exact / exact = exact (BigInteger or Rational), exact / inexact = inexact (Float or Complex).
func (*BigInteger) EqualTo ¶
func (p *BigInteger) EqualTo(o Value) bool
EqualTo returns true if this BigInteger equals another value.
R7RS §6.2.6: The = procedure compares numerical values for equality. BigInteger also compares equal to Integer when values match.
func (*BigInteger) HashCode ¶
func (p *BigInteger) HashCode() uint64
HashCode returns a hash of the big integer value. Uses the canonical exact-family hash so that Integer, BigInteger, and Rational produce identical hashes for equal values.
func (*BigInteger) Int64 ¶
func (p *BigInteger) Int64() int64
Int64 returns the value as int64 (may overflow for large values).
func (*BigInteger) IsExact ¶
func (p *BigInteger) IsExact() bool
IsExact returns true as BigInteger is always exact.
R7RS §6.2.2: Integers (including BigInteger) are always exact.
func (*BigInteger) IsFinite ¶ added in v1.1.0
func (p *BigInteger) IsFinite() bool
IsFinite returns true since integers are always finite.
R7RS §6.2.6: finite? returns #t for all exact numbers.
func (*BigInteger) IsInteger ¶ added in v1.1.0
func (p *BigInteger) IsInteger() bool
IsInteger returns true since BigInteger is always an integer.
R7RS §6.2.6: integer? returns #t for exact integers.
func (*BigInteger) IsNaN ¶ added in v1.1.0
func (p *BigInteger) IsNaN() bool
IsNaN returns false since integers are never NaN.
R7RS §6.2.6: nan? returns #f for exact numbers.
func (*BigInteger) IsNegative ¶
func (p *BigInteger) IsNegative() bool
IsNegative returns true if this BigInteger is negative.
func (*BigInteger) IsPositive ¶
func (p *BigInteger) IsPositive() bool
IsPositive returns true if this BigInteger is positive.
func (*BigInteger) IsRational ¶ added in v1.1.0
func (p *BigInteger) IsRational() bool
IsRational returns true since integers are a subset of rationals.
R7RS §6.2.6: rational? returns #t for all real finite numbers.
func (*BigInteger) IsVoid ¶
func (p *BigInteger) IsVoid() bool
IsVoid returns true if this BigInteger is nil.
func (*BigInteger) IsZero ¶
func (p *BigInteger) IsZero() bool
IsZero returns true if this BigInteger is zero.
func (*BigInteger) Kind ¶ added in v1.5.0
func (p *BigInteger) Kind() NumericKind
Add returns the sum of this BigInteger and another number.
Kind returns the numeric kind for dispatch table indexing.
func (*BigInteger) LessThan ¶
func (p *BigInteger) LessThan(o Number) bool
LessThan returns true if this BigInteger is less than another number.
R7RS §6.2.6: The < procedure returns #t if its arguments are monotonically increasing. Comparison across numeric types uses mathematical value.
func (*BigInteger) Multiply ¶
func (p *BigInteger) Multiply(o Number) Number
Multiply returns the product of this BigInteger and another number.
R7RS §6.2.6: The * procedure returns the product of its arguments. R7RS §6.2.2 Exactness: exact * exact = exact, exact * inexact = inexact. Exception: Exact zero dominates—(* 0 x) may return exact 0 even when x is inexact. Zero is an exact value when the result is mathematically unambiguous. This implementation follows Chez Scheme's behavior.
func (*BigInteger) Negate ¶
func (p *BigInteger) Negate() Number
Negate returns the negation of this BigInteger.
func (*BigInteger) SchemeString ¶
func (p *BigInteger) SchemeString() string
SchemeString returns the Scheme representation of this BigInteger.
func (*BigInteger) Sign ¶ added in v1.1.0
func (p *BigInteger) Sign() int
Sign returns -1 if negative, 0 if zero, or 1 if positive.
func (*BigInteger) Subtract ¶
func (p *BigInteger) Subtract(o Number) Number
Subtract returns the difference of this BigInteger and another number.
R7RS §6.2.6: The - procedure returns the difference of its arguments. R7RS §6.2.2 Exactness: exact - exact = exact, exact - inexact = inexact.
func (*BigInteger) ToExact ¶
func (p *BigInteger) ToExact() (Number, error)
ToExact returns this BigInteger as an exact number.
R7RS §6.2.6: exact returns an exact representation of its argument. Since BigInteger is already exact, it returns itself.
func (*BigInteger) ToInexact ¶
func (p *BigInteger) ToInexact() Number
ToInexact returns this BigInteger converted to an inexact float.
R7RS §6.2.6: inexact returns an inexact representation of its argument. Converts to Float (float64), which may lose precision for large values.
R7RS §6.2.3: The inexact representation may have limited precision, but the conversion should be as close as practical.
PRECISION NOTE: For BigIntegers with more than 53 significant bits, precision is lost when converting to float64 (IEEE 754 binary64 has only 53 bits of mantissa precision). This is compliant with R7RS which allows inexact to be approximate.
type Boolean ¶
type Boolean struct {
Value bool
}
Boolean represents a Scheme boolean value.
func BoolToBoolean ¶ added in v1.4.0
BoolToBoolean converts a Go bool to a Scheme boolean value.
func ValueToBoolean ¶ added in v1.4.0
ValueToBoolean converts a value into a Scheme *Boolean using Scheme semantics.
func (*Boolean) SchemeString ¶
SchemeString returns the Scheme representation of the boolean.
type Box ¶
type Box struct {
Value Value
}
Box represents a mutable Scheme box (container).
func (*Box) SchemeString ¶
SchemeString returns the Scheme representation of the box.
type Byte ¶
type Byte struct {
Value uint8
}
Byte represents a Scheme byte value (0-255).
func (*Byte) SchemeString ¶
SchemeString returns the Scheme representation of the byte.
type ByteUnreader ¶ added in v1.16.0
type ByteUnreader interface {
UnreadByte() error
}
ByteUnreader is the interface satisfied by readers that can unread the last byte. Mirrors io.ByteScanner's UnreadByte half.
type ByteVector ¶
type ByteVector []*Byte
ByteVector represents a Scheme bytevector.
func NewByteVector ¶
func NewByteVector(vs ...*Byte) *ByteVector
NewByteVector creates a new bytevector from byte values.
func NewByteVectorFromBytes ¶
func NewByteVectorFromBytes(vs ...byte) *ByteVector
func NewByteVectorFromIntegers ¶
func NewByteVectorFromIntegers(vs ...*Integer) (*ByteVector, error)
NewByteVectorFromIntegers creates a new bytevector from integer values. Each integer must be in the range [0, 255] per R7RS §6.4.
func (*ByteVector) AsBytes ¶
func (p *ByteVector) AsBytes(is ...int) []byte
AsBytes converts the bytevector to a Go byte slice. The starti and endi parameters specify the range of bytes to include. If starti is negative, it is treated as 0. If endi is greater than the length of the bytevector or non-positive, it is treated as the length of the bytevector. If starti is greater than endi, it is treated as equal to endi.
func (*ByteVector) AsList ¶
func (p *ByteVector) AsList() Tuple
AsList converts the vector to a proper list (linked list of pairs). Returns void (nil Pair) if the vector is void. Returns EmptyList if the vector is empty. Otherwise returns a newly constructed list containing the vector's elements.
func (*ByteVector) EqualTo ¶
func (p *ByteVector) EqualTo(v Value) bool
EqualTo returns true if the bytevectors have equal contents.
func (*ByteVector) Get ¶
func (p *ByteVector) Get(i int) Value
func (*ByteVector) IsVoid ¶
func (p *ByteVector) IsVoid() bool
IsVoid returns true if the bytevector is nil.
func (*ByteVector) Length ¶
func (p *ByteVector) Length() int
func (*ByteVector) SchemeString ¶
func (p *ByteVector) SchemeString() string
SchemeString returns the Scheme representation of the bytevector.
type ByteVectorExtractor ¶
type ByteVectorExtractor interface {
ReadByteVector() (*ByteVector, error)
}
ByteVectorExtractor represents a port that can extract its accumulated bytes. Returned by (*PortObject).AsByteVectorExtractor.
type Callable ¶ added in v1.5.0
Callable represents a Scheme procedure — any value that can be applied to arguments.
R7RS §6.1: The procedure? predicate returns #t for all callable types. This includes lambdas, case-lambdas, parameter objects (R7RS §4.2.6), and composable continuations.
AcceptsArity reports whether the procedure can be called with exactly n arguments. This captures arity constraints that are otherwise scattered across per-type checks in the VM apply path.
Implemented by: MachineClosure, CaseLambdaClosure, Parameter, ComposableContinuation.
type Channel ¶
type Channel struct {
// contains filtered or unexported fields
}
Channel represents a Go channel exposed to Scheme
func NewChannel ¶
NewChannel creates a new channel with the given buffer size bufferSize of 0 creates an unbuffered channel
func (*Channel) BufferSize ¶
BufferSize returns the channel's buffer size
func (*Channel) Receive ¶
Receive receives a value from the channel (blocking) Returns the value and true, or nil and false if channel is closed
func (*Channel) SchemeString ¶
SchemeString returns the Scheme representation of this channel.
func (*Channel) TryReceive ¶
TryReceive attempts to receive a value without blocking Returns (value, true, true) if received Returns (nil, false, true) if would block Returns (nil, false, false) if channel is closed
type CharSet ¶ added in v1.15.0
type CharSet struct {
// contains filtered or unexported fields
}
CharSet is an immutable set of Unicode codepoints stored as a sorted inversion list of disjoint, non-adjacent ranges. SRFI-14 char-set type.
Canonical form invariants (enforced by every constructor):
- Sorted: ranges[i].Lo > ranges[i-1].Hi
- Disjoint and non-adjacent: ranges[i].Lo > ranges[i-1].Hi + 1
- Non-empty: Lo <= Hi
- Codepoint-valid: 0 <= Lo, Hi <= MaxCodepoint
func NewCharSetFromRanges ¶ added in v1.15.0
func NewCharSetFromRanges(rs []CharSetRange) *CharSet
NewCharSetFromRanges constructs a CharSet from an already-canonical range slice. The caller asserts the slice is sorted, disjoint, non-adjacent, and codepoint-valid. Used internally by primitives that produce canonical output (set-algebra ops). External callers should prefer NewCharSetFromUnsortedRanges.
Panics on invariant violation — this is an internal contract assertion, wrapped per CLAUDE.md "NEVER panic with raw errors" imperative.
func NewCharSetFromRunes ¶ added in v1.15.0
NewCharSetFromRunes builds a CharSet from a slice of codepoints (no canonicalization assumption). Each rune becomes a unit range, then canonicalized via NewCharSetFromUnsortedRanges.
func NewCharSetFromUnsortedRanges ¶ added in v1.15.0
func NewCharSetFromUnsortedRanges(rs []CharSetRange) *CharSet
NewCharSetFromUnsortedRanges constructs a CharSet from arbitrary range input. Invalid ranges (Lo > Hi or out-of-bounds) are dropped. Overlapping and adjacent ranges are merged. Result is in canonical form.
func (*CharSet) All ¶ added in v1.16.0
func (p *CharSet) All() iter.Seq[CharSetRange]
All returns an iter.Seq that yields each canonical range in codepoint ascending order. Caller breaks the loop with `break` to early-exit.
Cost: one closure allocation per accessor call (the iterator captures p). No O(n) slice copy — yields directly from the internal slice, which is safe because *CharSet is immutable. Strictly cheaper than Ranges() for any non-empty CharSet.
Naming follows Go stdlib convention (slices.All, maps.All).
func (*CharSet) Codepoints ¶ added in v1.16.0
Codepoints returns an iter.Seq that yields every codepoint in the set, in codepoint ascending order. Caller breaks the loop with `break` to early-exit.
func (*CharSet) Contains ¶ added in v1.15.0
Contains reports whether the given codepoint is in the set, via binary search over the inversion list.
func (*CharSet) EqualTo ¶ added in v1.15.0
EqualTo implements Value (R7RS §6.1 equal?).
Two char-sets are equal iff their canonical range slices are equal — the invariants of canonical form make logical equality and structural equality the same thing.
func (*CharSet) Ranges ¶ added in v1.15.0
func (p *CharSet) Ranges() []CharSetRange
Ranges returns a copy of the canonical range slice. Caller may mutate the returned slice without affecting the CharSet.
Most read-only iteration callers should prefer All or Codepoints — those avoid the O(n) defensive slice copy this method performs (they allocate a single iterator closure instead, which is cheaper for any non-empty CharSet). Ranges is retained for callers that genuinely need a slice: dual-cursor merge algorithms (intersect, difference) and the union builder that uses append on the result.
func (*CharSet) SchemeString ¶ added in v1.15.0
SchemeString implements Value (R7RS §6.13.3 write).
type CharSetRange ¶ added in v1.15.0
type CharSetRange struct {
Lo, Hi rune
}
CharSetRange is an inclusive-endpoint codepoint range.
type Character ¶
type Character struct {
Value rune
}
Character represents a Scheme character value.
func NewCharacter ¶
NewCharacter creates a new character from a rune.
func (*Character) SchemeString ¶
SchemeString returns the Scheme representation of the character. Named characters use the R7RS mnemonic form (#\newline). Graphic characters use #\<char>. Non-graphic non-named characters use #\xHEX for round-trip safety.
type CompileTimeValue ¶
type CompileTimeValue struct {
Value Value
}
CompileTimeValue wraps a value that is stored in the expand phase but accessible during macro expansion. This enables compile-time computation via define-for-syntax and begin-for-syntax.
func NewCompileTimeValue ¶
func NewCompileTimeValue(v Value) *CompileTimeValue
NewCompileTimeValue creates a new compile-time value.
func (*CompileTimeValue) EqualTo ¶
func (p *CompileTimeValue) EqualTo(v Value) bool
EqualTo returns true if the compile-time values are equal.
func (*CompileTimeValue) IsVoid ¶
func (p *CompileTimeValue) IsVoid() bool
IsVoid returns true if the compile-time value is nil.
func (*CompileTimeValue) SchemeString ¶
func (p *CompileTimeValue) SchemeString() string
SchemeString returns the Scheme representation of the compile-time value.
func (*CompileTimeValue) Unwrap ¶
func (p *CompileTimeValue) Unwrap() Value
Unwrap returns the underlying value.
type Complex ¶
type Complex struct {
Value complex128
}
Complex represents a Scheme complex number.
func NewComplex ¶
func NewComplex(v complex128) *Complex
NewComplex creates a new complex number from a complex128 value.
func NewComplexFromParts ¶
NewComplexFromParts creates a new complex number from real and imaginary parts.
func (*Complex) Abs ¶ added in v1.1.0
Abs returns the magnitude of this complex number.
R7RS §6.2.6: For complex numbers, abs returns the magnitude.
func (*Complex) Add ¶
Add returns the sum of this complex number and another number. Zero short-circuit: 0+x=x preserves exactness per R7RS §6.2.2.
func (*Complex) Compare ¶
Compare compares this complex number with another number by real parts.
R7RS §6.2.6: Complex comparison compares real parts only. Returns -1 if p < o, 0 if p == o, 1 if p > o.
func (*Complex) EqualTo ¶
EqualTo returns true if both complex numbers have the same value.
The *BigComplex case delegates to BigComplex.EqualTo so the two cross-kind directions share one comparison and cannot disagree — (equal? c bc) and (equal? bc c) must not flip with operand order (R7RS §6.2.6).
func (*Complex) HashCode ¶ added in v1.5.0
HashCode returns a hash of the complex value. Hashes real and imaginary parts independently via hashComplexComponent and combines them with a multiplicative mixing constant. NaN and ±Inf components use bitwise hashing to avoid big.Float panics.
func (*Complex) ImagPart ¶ added in v1.1.0
ImagPart returns the imaginary part of this complex number as a Number.
R7RS §6.2.6: imag-part returns the imaginary part of a complex number.
func (*Complex) IsExact ¶
IsExact returns false since Complex is always inexact.
R7RS §6.2.2: Complex numbers with floating-point components are inexact.
func (*Complex) IsFinite ¶ added in v1.1.0
IsFinite returns true if both real and imaginary parts are finite.
R7RS §6.2.6: finite? returns #t if neither part is Inf or NaN.
func (*Complex) IsInteger ¶ added in v1.1.0
IsInteger returns true if this complex has zero imaginary part and an integer real part.
R7RS §6.2.6: integer? returns #t for complex numbers with zero imaginary part whose real part is an integer.
func (*Complex) IsNaN ¶ added in v1.1.0
IsNaN returns true if either the real or imaginary part is NaN.
R7RS §6.2.6: nan? returns #t if any component is NaN.
func (*Complex) IsRational ¶ added in v1.1.0
IsRational returns true if the imaginary part is zero and the real part is finite.
R7RS §6.2.6: A complex number with zero imaginary part is rational if its real part is a finite real number.
func (*Complex) Kind ¶ added in v1.5.0
func (p *Complex) Kind() NumericKind
Kind returns the numeric kind for dispatch table indexing.
func (*Complex) Negate ¶
Negate returns the negation of this complex number.
R7RS §6.2.6: The - procedure with one argument returns the additive inverse.
func (*Complex) RealPart ¶ added in v1.1.0
RealPart returns the real part of this complex number as a Number.
R7RS §6.2.6: real-part returns the real part of a complex number.
func (*Complex) SchemeString ¶
SchemeString returns the Scheme representation of this complex number. R7RS §6.2.6: Ensures decimal point for inexact values, lowercase inf/nan.
func (*Complex) Subtract ¶
Subtract returns the difference of this complex number and another number.
type Complex128Result ¶ added in v1.16.0
type Complex128Result struct {
Value complex128 // complex128 representation
RealAcc big.Accuracy // Below / Exact / Above for real component
ImagAcc big.Accuracy // Below / Exact / Above for imaginary component
}
Complex128Result captures complex-domain conversion with per-component accuracy. Field-named so RealAcc/ImagAcc swaps are caught at compile time, not surfaced only as wrong output in tests.
Zero value is {Value: 0+0i, RealAcc: Exact, ImagAcc: Exact} since big.Exact == 0 in the stdlib enum. That happens to coincide with the "perfectly converted zero" reading; callers receiving an error should still treat the result as unspecified.
See design plan §"Decision record: return shape — hybrid (positional + struct)".
func ToComplex128WithAccuracy ¶ added in v1.16.0
func ToComplex128WithAccuracy(n Number) (Complex128Result, error)
ToComplex128WithAccuracy is the primary complex-domain helper. Returns a Complex128Result struct (named fields prevent realAcc/imagAcc swap bugs at call sites; same-type adjacency would otherwise admit silent swaps the compiler can't catch).
For real-only inputs (Integer/BigInteger/Float/BigFloat/Rational), res.ImagAcc is always big.Exact.
For nil-Number defensive input, returns ErrNotANumber.
type ComplexNumber ¶ added in v1.1.0
ComplexNumber represents a complex-valued number with accessible parts.
R7RS §6.2.6: Complex numbers have real and imaginary parts accessible via real-part and imag-part.
type ConditionVariable ¶
type ConditionVariable struct {
// contains filtered or unexported fields
}
ConditionVariable represents a Scheme condition variable (SRFI-18)
func NewConditionVariable ¶
func NewConditionVariable(name string) *ConditionVariable
NewConditionVariable creates a new condition variable
func (*ConditionVariable) Broadcast ¶
func (p *ConditionVariable) Broadcast()
Broadcast wakes all waiting threads.
func (*ConditionVariable) EqualTo ¶
func (p *ConditionVariable) EqualTo(v Value) bool
EqualTo returns true if the condition variables are the same object.
func (*ConditionVariable) ID ¶
func (p *ConditionVariable) ID() uint64
ID returns the condition variable's unique identifier
func (*ConditionVariable) IsVoid ¶
func (p *ConditionVariable) IsVoid() bool
IsVoid returns true if the condition variable is nil.
func (*ConditionVariable) Name ¶
func (p *ConditionVariable) Name() string
Name returns the condition variable's name
func (*ConditionVariable) SchemeString ¶
func (p *ConditionVariable) SchemeString() string
SchemeString returns the Scheme representation of this condition variable.
func (*ConditionVariable) SetSpecific ¶
func (p *ConditionVariable) SetSpecific(v Value)
SetSpecific sets the condition variable's specific field
func (*ConditionVariable) Signal ¶
func (p *ConditionVariable) Signal()
Signal wakes one waiting thread (FIFO order).
func (*ConditionVariable) Specific ¶
func (p *ConditionVariable) Specific() Value
Specific returns the condition variable's specific field
func (*ConditionVariable) Wait ¶
func (p *ConditionVariable) Wait(_ *Mutex, timeout *time.Duration) bool
Wait waits on the condition variable. Returns true if signaled, false if timeout.
Each waiter registers a per-waiter channel. Signal/Broadcast close the channel to wake the waiter. Timeouts remove the channel from the queue without disturbing other waiters.
func (*ConditionVariable) WaiterCount ¶
func (p *ConditionVariable) WaiterCount() int
WaiterCount returns the number of threads waiting on this condition variable.
type DebugLocation ¶ added in v1.13.14
DebugLocation holds file/line/column for debug and error display. This is a simple struct for presentation layers (REPL, debugger UI), distinct from the SourceLocation interface which is a full Value type used by procedure-source-location.
type DebugState ¶ added in v1.13.14
type DebugState interface {
// CurrentLocation returns the source location at the current
// execution point, or nil if no source info is available.
CurrentLocation() *DebugLocation
// FormatStackTrace returns a human-readable stack trace string,
// walking at most maxDepth frames.
FormatStackTrace(maxDepth int) string
}
DebugState provides read-only access to VM execution state. Implemented by the VM's MachineContext; consumed by presentation layers (REPL, debugger UI) without importing machine/.
type Exactness ¶
type Exactness int
Exactness represents whether a number is exact or inexact.
R7RS §6.2.2: Numbers are either exact or inexact. A number is exact if it was written as an exact constant or derived from exact numbers using only exact operations. Otherwise, it is inexact.
func ExactnessOf ¶
ExactnessOf returns the exactness of a number.
R7RS §6.2.2: - Integer, BigInteger, Rational are always exact (IsAlwaysExact in spec) - Float, BigFloat, Complex are always inexact (IsAlwaysExact == false) - BigComplex depends on its components (per-instance check via IsExact)
Panics on nil; nil cannot meaningfully classify as Exact or Inexact and indicates a caller bug.
type Float ¶
type Float struct {
Value float64
}
Float represents a Scheme floating-point number.
func (*Float) Add ¶
R7RS §6.2.6: The + procedure returns the sum of its arguments. R7RS §6.2.2 Exactness: inexact + inexact = inexact, exact + inexact = inexact.
func (*Float) Compare ¶
Compare compares this float with another number.
R7RS §6.2.6: Numeric comparisons use mathematical value regardless of exactness. Returns -1 if p < o, 0 if p == o, 1 if p > o.
func (*Float) EqualTo ¶
EqualTo returns true if both floats have the same value. Handles comparison with both Float and BigFloat types for symmetry.
func (*Float) HashCode ¶
HashCode returns a hash of the float value. Uses the canonical inexact-family hash so that Float and BigFloat produce identical hashes for equal values. NaN and Inf use bitwise hashing as a fallback since BigFloat has no Inf/NaN, making cross-type equality impossible for those values.
func (*Float) IsExact ¶
IsExact returns false since Float is always inexact.
R7RS §6.2.2: Floating-point numbers are inexact.
func (*Float) IsFinite ¶ added in v1.1.0
IsFinite returns true if this float is finite (not Inf or NaN).
R7RS §6.2.6: finite? returns #t for finite numbers.
func (*Float) IsInteger ¶ added in v1.1.0
IsInteger returns true if this float represents an integer value.
R7RS §6.2.6: integer? returns #t for inexact integers (e.g., 3.0). Uses math.Trunc to correctly handle large floats outside int64 range.
func (*Float) IsNaN ¶ added in v1.1.0
IsNaN returns true if this float is NaN.
R7RS §6.2.6: nan? returns #t for NaN values.
func (*Float) IsNegative ¶ added in v1.1.0
IsNegative returns true if this float is negative.
func (*Float) IsPositive ¶ added in v1.1.0
IsPositive returns true if this float is positive.
func (*Float) IsRational ¶ added in v1.1.0
IsRational returns true if this float is finite (not NaN or Inf).
R7RS §6.2.6: rational? returns #t for finite inexact reals.
func (*Float) Kind ¶ added in v1.5.0
func (p *Float) Kind() NumericKind
Add returns the sum of two numbers.
Kind returns the numeric kind for dispatch table indexing.
func (*Float) Multiply ¶
Multiply returns the product of two numbers.
R7RS §6.2.6: The * procedure returns the product of its arguments. R7RS §6.2.2: Exact zero dominates—(* 0 x) may return exact 0 even when x is inexact. Zero is an exact value when the result is mathematically unambiguous. This implementation follows Chez Scheme's behavior.
func (*Float) Negate ¶
Negate returns the negation of this float.
R7RS §6.2.6: The - procedure with one argument returns the additive inverse.
func (*Float) SchemeString ¶
SchemeString returns the Scheme representation of the float.
R7RS §6.2.5: +inf.0, -inf.0, and +nan.0 are the written representations for positive infinity, negative infinity, and NaN. R7RS §7.1.1: Inexact real numbers must contain a decimal point to distinguish them from exact integers.
func (*Float) Sign ¶ added in v1.1.0
Sign returns -1 if negative, 0 if zero, or 1 if positive. NaN returns 0.
func (*Float) Subtract ¶
Subtract returns the difference of two numbers.
R7RS §6.2.6: The - procedure returns the difference of its arguments. R7RS §6.2.2 Exactness: inexact - inexact = inexact, exact - inexact = inexact.
type Flusher ¶ added in v1.16.0
type Flusher interface {
Flush() error
}
Flusher is the interface satisfied by buffered writers that can flush pending bytes to the underlying stream.
type ForEachFunc ¶
ForEachFunc is the callback signature for iterating over a Tuple.
Parameters:
- ctx: context for cancellation
- i: zero-based element index
- hasNext: true if more elements follow
- v: the current element value
Return a non-nil error to stop iteration early.
type Hashable ¶
Hashable represents a Value that can be used as a hashtable key.
R7RS §6.10: Hashtables map keys to values. Keys are compared using equal?, and the hash function must be consistent with the equality predicate: if a.EqualTo(b) then a.HashCode() == b.HashCode().
Implemented by: Integer, BigInteger, Float, BigFloat, Rational, Boolean, Character, Symbol, Byte, String.
type Hashtable ¶
type Hashtable struct {
// contains filtered or unexported fields
}
Hashtable represents a Scheme hash table mapping hashable values to values.
Separate chaining (Cormen et al., CLRS Ch. 11): collisions are resolved by storing all entries with the same hash in a linked list (here, a Go slice). O(1) amortized with a good hash function. See BIBLIOGRAPHY.md "Separate Chaining Hash Table".
Keys must implement the Hashable interface (Value + HashCode()). Uses bucket chaining with FNV-1a hashing for O(1) amortized operations and EqualTo() for key comparison within buckets.
func NewEmptyHashtable ¶
func NewEmptyHashtable() *Hashtable
NewEmptyHashtable creates a new empty hash table.
func (*Hashtable) Clear ¶
func (p *Hashtable) Clear()
Clear removes all entries from the hash table.
func (*Hashtable) Delete ¶
Delete removes the entry for key from the hash table. Returns werr.ErrInvalidArgument if the key does not implement Hashable.
func (*Hashtable) Entries ¶ added in v1.1.0
Entries iterates over all entries in the hash table, calling fn for each key-value pair. Iteration stops early if fn returns a non-nil error. This is more efficient than Keys()+Get() as it avoids intermediate allocations.
func (*Hashtable) EqualTo ¶
EqualTo returns true if both hash tables have equal contents. Uses structural equality (EqualTo) for both keys and values.
func (*Hashtable) Get ¶
Get retrieves the value associated with key. Returns the value and whether the key was found. Returns werr.ErrInvalidArgument if the key does not implement Hashable.
func (*Hashtable) HasKey ¶
HasKey returns whether the key exists in the hash table. Returns werr.ErrInvalidArgument if the key does not implement Hashable.
func (*Hashtable) SchemeString ¶
SchemeString returns the Scheme representation of this hash table.
func (*Hashtable) Set ¶
Set associates key with val in the hash table. Returns werr.ErrInvalidArgument if the key does not implement Hashable.
type Immutable ¶ added in v1.17.0
type Immutable interface {
Value
// IsImmutable reports whether in-place mutation of this value is forbidden.
IsImmutable() bool
}
Immutable is implemented by value types that store their immutability as an intrinsic, per-instance property — currently only *String (R7RS §6.7: literal strings and symbol->string results are immutable).
It exists so callers can ask "may this value be mutated in place?" without knowing the storage mechanism. Pair and Vector deliberately do NOT implement it: they are raw [2]Value / []Value types whose immutability is tracked in an engine-scoped side-set (see environment.ImmutableLiterals) to keep the dominant heap objects word-for-word minimal. The uniform query that spans both mechanisms is (*environment.ImmutableLiterals).IsImmutable.
type Integer ¶
type Integer struct {
Value int64
}
Integer represents a Scheme integer value.
R7RS §6.2.1: Integers are exact numbers in the numeric tower hierarchy:
number ⊃ complex ⊃ real ⊃ rational ⊃ integer
R7RS §6.2.2: Integer is always exact. Operations on exact numbers produce exact results when mathematically well-defined.
func NewInteger ¶
NewInteger returns an Integer value. Small integers in the range -32768 to 32767 are cached and return the same pointer for the same value.
func (*Integer) Add ¶
R7RS §6.2.2 Exactness: exact + exact = exact, exact + inexact = inexact. When adding Integer + BigInteger, result is BigInteger (exact). When adding Integer + Float/Complex, result is Float/Complex (inexact).
func (*Integer) Compare ¶
Compare compares this integer with another number.
R7RS §6.2.6: Numeric comparisons use mathematical value regardless of exactness. Returns -1 if p < o, 0 if p == o, 1 if p > o.
func (*Integer) Divide ¶
Divide returns the quotient of this integer and another number.
R7RS §6.2.6: The / procedure returns the quotient of its arguments. For exact arguments, / may return a non-integer (Rational) when the mathematical result is not an integer. Returns Integer only when the division is exact.
R7RS §6.2.2 Exactness: exact / exact = exact (Integer or Rational), exact / inexact = inexact (Float or Complex).
func (*Integer) EqualTo ¶
EqualTo returns true if both integers have the same value.
R7RS §6.2.6: The = procedure compares numerical values for equality. This implements structural equality for the Integer type specifically. Handles comparison with Integer, BigInteger, and Rational types for symmetry.
func (*Integer) HashCode ¶
HashCode returns a hash of the integer value. Uses the canonical exact-family hash so that Integer, BigInteger, and Rational produce identical hashes for equal values.
func (*Integer) IsExact ¶
IsExact returns true since Integer is always exact.
R7RS §6.2.2: Integers are always exact numbers.
func (*Integer) IsFinite ¶ added in v1.1.0
IsFinite returns true since integers are always finite.
R7RS §6.2.6: finite? returns #t for all exact numbers.
func (*Integer) IsInteger ¶ added in v1.1.0
IsInteger returns true since Integer is always an integer.
R7RS §6.2.6: integer? returns #t for exact integers.
func (*Integer) IsNaN ¶ added in v1.1.0
IsNaN returns false since integers are never NaN.
R7RS §6.2.6: nan? returns #f for exact numbers.
func (*Integer) IsNegative ¶ added in v1.1.0
IsNegative returns true if this integer is negative.
R7RS §6.2.6: negative? returns #t if the real number is negative.
func (*Integer) IsPositive ¶ added in v1.1.0
IsPositive returns true if this integer is positive.
R7RS §6.2.6: positive? returns #t if the real number is positive.
func (*Integer) IsRational ¶ added in v1.1.0
IsRational returns true since integers are a subset of rationals.
R7RS §6.2.6: rational? returns #t for all real finite numbers.
func (*Integer) Kind ¶ added in v1.5.0
func (p *Integer) Kind() NumericKind
Add returns the sum of this integer and another number.
R7RS §6.2.6: The + procedure returns the sum of its arguments. Kind returns the numeric kind for dispatch table indexing.
func (*Integer) LessThan ¶
LessThan returns true if this integer is less than another number.
R7RS §6.2.6: The < procedure returns #t if its arguments are monotonically increasing. Comparison across numeric types uses mathematical value.
func (*Integer) Multiply ¶
Multiply returns the product of this integer and another number.
R7RS §6.2.6: The * procedure returns the product of its arguments. R7RS §6.2.2 Exactness: exact * exact = exact, exact * inexact = inexact. Exception: Exact zero dominates—(* 0 x) may return exact 0 even when x is inexact. Zero is an exact value when the result is mathematically unambiguous. This implementation follows Chez Scheme's behavior.
func (*Integer) Negate ¶
Negate returns the negation of this integer.
R7RS §6.2.6: The - procedure with one argument returns the additive inverse.
func (*Integer) SchemeString ¶
SchemeString returns the Scheme representation of this integer.
func (*Integer) Subtract ¶
Subtract returns the difference of this integer and another number.
R7RS §6.2.6: The - procedure returns the difference of its arguments. R7RS §6.2.2 Exactness: exact - exact = exact, exact - inexact = inexact.
type JoinTimeoutException ¶
type JoinTimeoutException struct{}
JoinTimeoutException is raised when thread-join! times out
func (*JoinTimeoutException) Error ¶
func (p *JoinTimeoutException) Error() string
type Mutex ¶
type Mutex struct {
// contains filtered or unexported fields
}
Mutex represents a Scheme mutex (SRFI-18)
func (*Mutex) Lock ¶
Lock acquires the mutex with optional timeout and owner. Returns true if acquired, false if timeout.
When acquired, state becomes MutexLocked and owner is set to whatever the caller supplied (nil produces a "locked-but-unowned" mutex, valid per SRFI-18). Acquiring an abandoned mutex succeeds but returns *AbandonedMutexException so the caller can observe the prior owner's termination.
func (*Mutex) MarkAbandoned ¶
func (p *Mutex) MarkAbandoned()
MarkAbandoned marks the mutex as abandoned (called when owner thread terminates). Only mutexes in MutexLocked state can be abandoned — unlocked and already- abandoned mutexes are no-ops.
func (*Mutex) SchemeString ¶
SchemeString returns the Scheme representation of the mutex.
func (*Mutex) SetSpecific ¶
SetSpecific sets the mutex's specific field
func (*Mutex) State ¶
func (p *Mutex) State() MutexState
State returns the current state of the mutex
func (*Mutex) StateValue ¶
StateValue returns the state as a Scheme value per R7RS SRFI-18. Returns package-level singletons for symbol states so that repeated calls return the same pointer: (eq? (mutex-state m) (mutex-state m)) → #t. See the doc comment on SymbolThreadNew in thread.go for eq? vs equal? caveats. Returns: 'not-owned, 'abandoned, or the owner thread.
SRFI-18 collapses "unlocked" and "locked without owner" into the single 'not-owned symbol — they are indistinguishable to Scheme. The Go-side distinction is preserved by MutexState (Unlocked is acquirable without blocking; Locked-without-owner is held by a non-thread caller).
type MutexState ¶
type MutexState int
MutexState represents the lifecycle state of a mutex.
The owned-vs-not-owned distinction (R7RS SRFI-18) is NOT a state — it's the contents of the owner field. Splitting "locked with owner" and "locked without owner" into separate states would force every site that reads state to also know which states permit owner != nil. Instead, MutexLocked is one state; owner = nil iff acquired without owner.
Invariants enforced by Lock/Unlock/MarkAbandoned:
state == MutexUnlocked ⇒ owner == nil state == MutexLocked — owner is the identity (nil ⇒ "not-owned") state == MutexAbandoned ⇒ owner == nil
const ( MutexUnlocked MutexState = iota // Not locked MutexLocked // Held MutexAbandoned // Owner terminated while holding lock )
MutexState constants. See the invariant block above for state↔owner relations.
func (MutexState) String ¶
func (p MutexState) String() string
type NamedTypeConstraint ¶ added in v1.12.0
type NamedTypeConstraint struct {
// contains filtered or unexported fields
}
NamedTypeConstraint represents an unresolved type name from a docstring (e.g., "point"). It is documentation-only — Check always fails because the constraint has not been resolved to a concrete type.
func NewNamedTypeConstraint ¶ added in v1.12.0
func NewNamedTypeConstraint(name string) *NamedTypeConstraint
NewNamedTypeConstraint creates a NamedTypeConstraint with the given name.
func (*NamedTypeConstraint) Check ¶ added in v1.12.0
func (p *NamedTypeConstraint) Check(v Value) (any, bool, error)
Check always fails — the constraint is unresolved and cannot validate values.
func (*NamedTypeConstraint) Description ¶ added in v1.12.0
func (p *NamedTypeConstraint) Description() string
Description returns the unresolved type name as its description.
func (*NamedTypeConstraint) Name ¶ added in v1.12.0
func (p *NamedTypeConstraint) Name() string
Name returns the unresolved type name.
type NativeError ¶
type NativeError struct {
// contains filtered or unexported fields
}
NativeError represents an R7RS error object created by (error ...). It contains a message string and a list of irritant objects that provide additional context about the error. It can also wrap a Go error.
func NewErrorObject ¶
func NewErrorObject(message string, irritants ...Value) *NativeError
NewErrorObject creates a new error object with the given message and irritants.
func NewErrorObjectWithCause ¶
func NewErrorObjectWithCause(message string, cause error, irritants ...Value) *NativeError
NewErrorObjectWithCause creates a new error object that wraps a Go error. This preserves the original error for debugging while providing R7RS-compliant exception handling. The wrapped error can be retrieved with Datum() or Unwrap().
func NewErrorObjectWithCauseAndKind ¶
func NewErrorObjectWithCauseAndKind(message string, cause error, kind NativeErrorKind, irritants ...Value) *NativeError
NewErrorObjectWithCauseAndKind creates a new error object that wraps a Go error with a specific kind. R7RS §6.11: The kind determines which error predicate (file-error?, read-error?) matches.
func NewFileError ¶
func NewFileError(message string, irritants ...Value) *NativeError
NewFileError creates a new file error object with the given message and irritants. R7RS §6.11: file-error? predicate checks for errors during file operations.
func NewNativeError ¶
func NewNativeError(msg string) *NativeError
NewNativeError creates a new native error with the given message.
func NewReadError ¶
func NewReadError(message string, irritants ...Value) *NativeError
NewReadError creates a new read error object with the given message and irritants. R7RS §6.11: read-error? predicate checks for errors during reading.
func (*NativeError) EqualTo ¶
func (p *NativeError) EqualTo(v Value) bool
EqualTo returns true if this error object is equal to the given value.
func (*NativeError) Error ¶
func (p *NativeError) Error() string
Error implements the error interface.
func (*NativeError) Irritants ¶
func (p *NativeError) Irritants() Value
Irritants returns the list of irritant objects.
func (*NativeError) IsFileError ¶
func (p *NativeError) IsFileError() bool
IsFileError returns true if this is a file error.
func (*NativeError) IsReadError ¶
func (p *NativeError) IsReadError() bool
IsReadError returns true if this is a read error.
func (*NativeError) IsVoid ¶
func (p *NativeError) IsVoid() bool
IsVoid returns true if this error object is nil.
func (*NativeError) Kind ¶
func (p *NativeError) Kind() NativeErrorKind
Kind returns the error kind for R7RS error predicates.
func (*NativeError) Message ¶
func (p *NativeError) Message() *String
Message returns the error message string.
func (*NativeError) SchemeString ¶
func (p *NativeError) SchemeString() string
SchemeString returns the Scheme string representation of this error object.
func (*NativeError) SetSourceLocation ¶ added in v1.14.244
func (p *NativeError) SetSourceLocation(loc string)
SetSourceLocation sets the source location string.
func (*NativeError) SetStackTraceValue ¶ added in v1.14.244
func (p *NativeError) SetStackTraceValue(v Value)
SetStackTraceValue sets the stack trace Scheme value.
func (*NativeError) SourceLocation ¶ added in v1.14.244
func (p *NativeError) SourceLocation() string
SourceLocation returns the formatted source location string, or "".
func (*NativeError) StackTraceValue ¶ added in v1.14.244
func (p *NativeError) StackTraceValue() Value
StackTraceValue returns the stack trace as a Scheme value, or nil.
func (*NativeError) Unwrap ¶
func (p *NativeError) Unwrap() error
Unwrap returns the underlying Go error for errors.Unwrap compatibility.
type NativeErrorKind ¶
type NativeErrorKind int
NativeErrorKind represents the type of an error object for R7RS error predicates.
const ( // NativeErrorKindGeneric is a generic error (default). NativeErrorKindGeneric NativeErrorKind = iota // NativeErrorKindRead is a read error (from reading data). NativeErrorKindRead // NativeErrorKindFile is a file error (from file operations). NativeErrorKindFile )
type Number ¶
type Number interface {
Value
Kind() NumericKind
Add(Number) Number
Subtract(Number) Number
Multiply(Number) Number
Divide(Number) (Number, error)
Negate() Number
Abs() Number
ToExact() (Number, error)
ToInexact() Number
IsZero() bool
IsExact() bool
IsInteger() bool // R7RS §6.2.6: is this an integer value?
IsRational() bool // R7RS §6.2.6: is this a rational value?
IsFinite() bool // R7RS §6.2.6: is this a finite number?
IsNaN() bool // R7RS §6.2.6: is this NaN?
LessThan(Number) bool
Compare(Number) int
}
Number represents a numeric value in the Scheme numeric tower.
R7RS §6.2.1: Numbers form a tower: number ⊃ complex ⊃ real ⊃ rational ⊃ integer. All numeric types implement this interface for uniform arithmetic operations.
Error signaling ¶
Arithmetic methods signal errors by panicking with a static sentinel error (e.g., werr.ErrDivisionByZero, werr.ErrNotANumber). This follows the same convention used by Go's math/big package, where (*big.Int).Div, (*big.Int).QuoRem, and (*big.Float).Quo all panic on division by zero, and mirrors Go's own runtime behavior for built-in integer division.
Divide returns (Number, error) so callers can propagate division-by-zero without panic/recover. All other arithmetic methods remain single-return because they cannot fail.
func Promote ¶ added in v1.5.0
func Promote(n Number, target NumericKind) Number
Promote converts a Number to the target NumericKind using the lossless promoter table. Panics if no promotion path exists (indicates a bug in the promotion table — all reachable paths should be populated).
func Simplify ¶
Simplify attempts to reduce a number to a simpler type without losing information.
Simplification rules:
- BigComplex with zero imaginary → real part (cross-kind; handled here)
- Complex with zero imaginary → Float → possibly Integer (cross-kind; handled here)
- All other per-kind descents are delegated to the NumericTypeSpec.SimplifyDown function registered for each kind (see values/numeric_registry.go).
Returns nil unchanged (callers may pass nil from generic Value paths).
type NumericKind ¶ added in v1.5.0
type NumericKind uint8
NumericKind identifies a concrete numeric type for dispatch table indexing.
Used by the receiver-centric dispatch tables in each numeric type file to replace 7-way type switches with O(1) array lookups.
ADDING A NEW NUMERIC TYPE requires updates in these locations:
- values/numeric_kind.go — add KindXxx constant (this file); bump numKinds implicitly
- values/xxx.go — new type file: implement Number interface, declare [numKinds] dispatch tables, register via init() calling makeXxxDispatch helpers
- values/xxx.go — register a NumericTypeSpec in the same init() via registerNumericSpec(KindXxx, NumericTypeSpec{...}). Provide the per-kind helper functions (xxxSimplifyDown, xxxToFloat64WithAccuracy, and either xxxToComplex128WithAccuracy or set isAlwaysReal=true to have the registry auto-derive the complex helper via liftRealToComplex128). Provide the schemeName + isAlwaysExact metadata. The registry-driven cold-path functions (Simplify, ExactnessOf, NumberToFloat64, NumberToComplex128Lossy) pick up the new kind automatically.
- values/promotion.go — add row/column in promotionTable and promoter
- values/numeric_dispatch_test.go — add new dispatch tables to TestAllDispatchEntriesPopulated
- values/numeric_registry_test.go — add the new kind to equivalenceExemplars()
- registry/helpers/value_conv.go — update ToComplex128, ToFloat64
- extensions/math/prim_conversion.go — update exact->inexact, number->string, etc.
- extensions/math/prim_complex.go — update make-rectangular, make-polar, etc.
- internal/parser/parser_number.go — if the type can be parsed from source
- registry/helpers/equality.go — update Eqv if the type has special eqv? semantics
Several historically-manual cold paths are now derived from the item-3 registry (Simplify, ExactnessOf, NumberToFloat64, NumberToComplex128Lossy), so the registration in item 3 is usually enough — the surviving sites above are the ones the registry does not yet cover.
The dispatch tables (item 2) are tested by TestAllDispatchEntriesPopulated. The NumericTypeSpec registration (item 3) is enforced eagerly at package init: a missing or incomplete registration panics with ErrNumericRegistry at process startup.
const ( KindInteger NumericKind = iota KindBigInteger KindFloat KindBigFloat KindRational KindComplex KindBigComplex )
func PromotionResultKind ¶ added in v1.5.0
func PromotionResultKind(kindA, kindB NumericKind) NumericKind
PromotionResultKind returns the result type when operands of kindA and kindB are combined in an arithmetic operation. The result is the least upper bound (LUB) in the promotion lattice — symmetric and lossless.
type NumericTypeSpec ¶ added in v1.16.0
type NumericTypeSpec struct {
// contains filtered or unexported fields
}
NumericTypeSpec records the cold-path properties of one numeric kind.
Each of the seven concrete numeric types registers exactly one spec via registerNumericSpec() in its init() function. Fields are unexported; callers use the getter methods.
The three function fields are non-nil invariants enforced by registerNumericSpec — bottom-of-chain kinds bind an identity simplifyDown rather than nil. Real-only kinds may omit toComplex128WithAccuracy and set isAlwaysReal=true; registerNumericSpec will auto-derive it from toFloat64WithAccuracy via liftRealToComplex128.
func LookupNumericSpec ¶ added in v1.16.0
func LookupNumericSpec(kind NumericKind) *NumericTypeSpec
LookupNumericSpec returns the NumericTypeSpec for the given kind. Bounds-checked: out-of-range kind panics with ErrNumericRegistry rather than producing a Go runtime "index out of range" panic. Consulted by the cold-path helpers (Simplify, ExactnessOf, NumberToFloat64, NumberToComplex128Lossy). NumberToFloat64/NumberToComplex128Lossy are also reached from the IEEE 754 special-value guard inside the arithmetic dispatch closures; those fire only when a Float operand is Inf/NaN, not on every arithmetic op.
func (*NumericTypeSpec) IsAlwaysExact ¶ added in v1.16.0
func (p *NumericTypeSpec) IsAlwaysExact() bool
IsAlwaysExact reports whether every value of this kind is exact. BigComplex returns false; per-instance exactness is determined by BigComplex.IsExact() (called by ExactnessOf).
func (*NumericTypeSpec) SchemeName ¶ added in v1.16.0
func (p *NumericTypeSpec) SchemeName() string
SchemeName returns the Scheme type name for this numeric kind (e.g. "integer").
func (*NumericTypeSpec) SimplifyDown ¶ added in v1.16.0
func (p *NumericTypeSpec) SimplifyDown(n Number) Number
SimplifyDown reduces n to the simplest in-kind representation in a single call (multi-step descents are inlined per-kind: e.g. BigFloat→BigInteger→Integer). Returns n unchanged if no simpler representation exists. The cross-kind BigComplex/Complex shortcuts live in Simplify() itself, not here.
func (*NumericTypeSpec) ToComplex128WithAccuracy ¶ added in v1.16.0
func (p *NumericTypeSpec) ToComplex128WithAccuracy(n Number) Complex128Result
ToComplex128WithAccuracy dispatches via the registered closure for the kind. Returns a Complex128Result with per-component accuracy. For real-only inputs, res.ImagAcc is big.Exact.
func (*NumericTypeSpec) ToFloat64WithAccuracy ¶ added in v1.16.0
ToFloat64WithAccuracy dispatches via the registered closure for the kind. Returns (value, accuracy, isReal). The accuracy slot is Below/Exact/Above per Go big.Accuracy semantics. isReal is false iff the input was a Complex/BigComplex with non-zero imaginary part (the imaginary component is dropped; callers should use ToComplex128WithAccuracy for full fidelity).
type Once ¶
type Once struct {
// contains filtered or unexported fields
}
Once wraps sync.Once for Scheme
func (*Once) Do ¶
Do calls the function only once Returns true if this call executed the function, false if it was already called
func (*Once) SchemeString ¶
SchemeString returns the Scheme representation of the once.
type OpaqueValue ¶ added in v1.9.1
type OpaqueValue struct {
// contains filtered or unexported fields
}
OpaqueValue wraps an arbitrary Go object as a Scheme value. Construction is Go-only via NewOpaqueValue. The inner value is accessible only from Go via Unwrap.
func NewOpaqueValue ¶ added in v1.9.1
func NewOpaqueValue(tag string, val any) *OpaqueValue
NewOpaqueValue creates a new opaque value with the given tag and inner value.
func (*OpaqueValue) EqualTo ¶ added in v1.9.1
func (p *OpaqueValue) EqualTo(v Value) bool
EqualTo returns true only if both are the same object (identity equality).
func (*OpaqueValue) IsVoid ¶ added in v1.9.1
func (p *OpaqueValue) IsVoid() bool
IsVoid returns true if this opaque value is nil.
func (*OpaqueValue) OpaqueTag ¶ added in v1.9.1
func (p *OpaqueValue) OpaqueTag() string
OpaqueTag returns the tag string identifying this opaque value's kind.
func (*OpaqueValue) SchemeString ¶ added in v1.9.1
func (p *OpaqueValue) SchemeString() string
SchemeString returns the Scheme representation of this opaque value.
func (*OpaqueValue) Unwrap ¶ added in v1.9.1
func (p *OpaqueValue) Unwrap() any
Unwrap returns the inner Go value. Go-only — not exposed to Scheme.
type OriginInfo ¶ added in v1.16.0
type OriginInfo struct {
Identifier string // Macro name that caused expansion (e.g., "let", "my-macro")
ApplicationID uint64 // Unique ID for this macro invocation (from intro scope)
Location *SourceContext // Where the macro was invoked (use-site)
TemplateLocation *SourceContext // Where the macro template was defined (definition-site)
Parent *OriginInfo // Previous link in origin chain (for nested macros)
}
OriginInfo tracks macro expansion chains for debugging and error reporting. Each OriginInfo represents one macro expansion in the chain, enabling:
- Tracing generated code back to the macro that created it
- Identifying which invocation (by unique ID) produced specific code
- Locating the template source that was expanded
func (*OriginInfo) Depth ¶ added in v1.16.0
func (p *OriginInfo) Depth() int
Depth returns the length of the origin chain.
type Pair ¶
type Pair [2]Value
Pair represents a Scheme cons cell.
Initial algebra (Bird & de Moor 1997, Meijer et al. 1991). Proper lists are the initial algebra of a polynomial functor.
List = μX. 1 + Value × X Constructors: nil : 1 → List = EmptyList (emptyListType, not *Pair) cons : Value × List → List = NewCons(car, cdr) Eliminator (catamorphism / fold): ForEach(f) applies f to each car, returns tail Invariant: EmptyList is a separate Go type from *Pair. This encodes the two constructors as distinct injections: (pair? '()) → #f. Constrains: IsList (must terminate — uses Floyd cycle detection), PairBlock (batch allocation optimization, does not change the algebra), all list-processing primitives (must handle both constructors). Constrained by: Tuple interface (read-only view over both constructors).
See BIBLIOGRAPHY.md "Lists as Initial Algebras".
func (*Pair) Append ¶
Append appends the given Value vs to the end of the list represented by the Pair. It panics if the Pair does not represent a proper list.
R7RS §6.4: The resulting list is always newly allocated, except that it shares structure with the last argument. This implementation copies the spine of p and sets the last cdr to vs.
func (*Pair) AsVector ¶
AsVector converts the Pair representing a proper list into a Vector. It panics if the Pair does not represent a proper list.
Consumes Spine. See Length for the circular-list caveat.
func (*Pair) EqualTo ¶
EqualTo checks if the Pair is equal to another Value o. Delegates to the cycle-aware pairEqualToDeep to handle circular lists.
func (*Pair) ForEach ¶
ForEach iterates over each element in the list represented by the Pair. The provided function fn is called for each element with the index i, a boolean hasNext indicating if there are more elements, and the value v. If fn returns an error, the iteration stops and the error is returned. If the list ends with a non-empty cdr, that cdr is returned as the second return value.
Stays open-coded rather than consuming Spine: a Spine-consuming variant was measured ~40–56% slower across 10/100/1000-element lists (BenchmarkPairForEach in pair_bench_test.go) because each iter.Seq2 yield goes through two function pointers, and ForEach is hot enough that the per-step overhead dominates. The C.3/C.4 spine consumers (IsList, Length, AsVector) are called far less often per list, so their regression is invisible.
func (*Pair) IsEmptyList ¶
IsEmptyList returns false. A *Pair is never the empty list; EmptyList is a separate emptyListType value.
func (*Pair) IsList ¶
IsList checks if the Pair represents a proper list. Uses Floyd's cycle detection (tortoise-and-hare) to handle circular lists. Returns false for circular lists per R7RS §6.4. See BIBLIOGRAPHY.md "Floyd's Cycle Detection".
Consumes SpineWithCycleCheck: a cycle short-circuits the spine, and the final cell's cdr is checked for EmptyList to distinguish proper from improper termination.
func (*Pair) Length ¶
Length returns the length of the list represented by the Pair. It panics if the Pair does not represent a proper list.
Consumes Spine. Callers must ensure the receiver is a proper list (e.g., via IsList) — a circular list will hang indefinitely because Spine does not detect cycles.
func (*Pair) SchemeString ¶
SchemeString returns the Scheme representation of the Pair. Handles circular structures (from datum labels or set-cdr!/set-car!) by emitting "..." when a cycle is detected.
type PairBlock ¶ added in v1.5.0
type PairBlock []Pair
PairBlock is a contiguous slice of Pairs that can be linked into a proper list. Block allocation amortizes N heap allocations to 1 for list construction.
type Port ¶
Port represents a Scheme I/O port — the marker interface satisfied by any port value. Concretely implemented by *PortObject (the sole implementer; capability-conditional operations are reached via As*() (T, bool) accessors on *PortObject rather than narrower interfaces).
R7RS §6.13: All port types support close and open-state queries.
type PortObject ¶ added in v1.16.0
type PortObject struct {
// contains filtered or unexported fields
}
PortObject is the single concrete representation of an R7RS port. Capability presence is encoded as nil-checks on the slot fields: a non-nil rdr means the port is readable, a non-nil wb means it supports byte writes, etc. Construction always goes through one of the New*Port factories, which call Validate before returning.
Field-set invariants are documented on Validate. The kind tag and slot configuration are paired by construction (every factory writes both in the same struct literal); Validate enforces only the cross-slot invariants I1–I7.
func NewBinaryInputPort ¶
func NewBinaryInputPort(rdr *bufio.Reader) *PortObject
NewBinaryInputPort wraps an existing *bufio.Reader as a binary input port (R7RS §6.13.2 binary port).
func NewBinaryInputPortFromReader ¶
func NewBinaryInputPortFromReader(reader io.Reader) *PortObject
NewBinaryInputPortFromReader buffers reader and constructs a binary input port. If reader implements io.Closer, Close is propagated.
func NewBinaryOutputPortFromWriter ¶
func NewBinaryOutputPortFromWriter(writer io.Writer) *PortObject
NewBinaryOutputPortFromWriter buffers writer and constructs a binary output port. ws is intentionally nil — R7RS forbids write-string on binary ports even though *bufio.Writer satisfies io.StringWriter. flsh is non-nil so Close flushes before closing.
func NewByteVectorBufferedOutputPort ¶ added in v1.5.0
func NewByteVectorBufferedOutputPort() *PortObject
NewByteVectorBufferedOutputPort creates a fresh in-memory bytevector output port. flsh is nil. ext extracts the accumulated bytevector (returns the bytes verbatim — no EOF on empty, matching the prior ByteVectorBufferedOutputPort semantics).
func NewByteVectorBufferedOutputPortFromBuffer ¶ added in v1.5.0
func NewByteVectorBufferedOutputPortFromBuffer(buf *bytes.Buffer) *PortObject
NewByteVectorBufferedOutputPortFromBuffer wraps the given buffer as a bytevector buffered output port.
func NewByteVectorInputOutputPort ¶
func NewByteVectorInputOutputPort() *PortObject
NewByteVectorInputOutputPort creates a fresh bidirectional bytevector port. Both sides share a *bytes.Buffer.
func NewByteVectorInputOutputPortFromBuffer ¶
func NewByteVectorInputOutputPortFromBuffer(buf *bytes.Buffer) *PortObject
NewByteVectorInputOutputPortFromBuffer wraps the given buffer as a bidirectional bytevector port. ext returns io.EOF when the buffer is empty (preserving the prior ByteVectorInputOutputPort semantics where empty is signalled differently from BufferedOutputPort).
func NewByteVectorInputPortFromReader ¶
func NewByteVectorInputPortFromReader(reader io.Reader) *PortObject
NewByteVectorInputPortFromReader buffers reader and constructs a bytevector input port (R7RS §6.13.2 binary). Same slot set as NewBinaryInputPortFromReader; the kind tag distinguishes them.
func NewByteVectorOutputPortFromWriter ¶
func NewByteVectorOutputPortFromWriter(wrt io.Writer) *PortObject
NewByteVectorOutputPortFromWriter buffers wrt and constructs a bytevector output port. ws is nil (binary). flsh is non-nil so Close flushes before closing.
func NewCharacterInputPort ¶
func NewCharacterInputPort(rdr *bufio.Reader) *PortObject
NewCharacterInputPort wraps an existing *bufio.Reader as a textual input port (R7RS §6.13.2 textual port).
func NewCharacterInputPortFromReader ¶
func NewCharacterInputPortFromReader(rdr io.Reader) *PortObject
NewCharacterInputPortFromReader buffers rdr and constructs a textual input port.
func NewCharacterOutputPortFromWriter ¶
func NewCharacterOutputPortFromWriter(wrt io.Writer) *PortObject
NewCharacterOutputPortFromWriter buffers wrt and constructs a textual output port. wb is intentionally nil — R7RS textual ports do not expose byte-level writes even though *bufio.Writer satisfies io.ByteWriter. flsh is non-nil so Close flushes before closing.
func NewStringInputPortWithBuffer ¶
func NewStringInputPortWithBuffer(buffer *bytes.Buffer) *PortObject
NewStringInputPortWithBuffer wraps a *bytes.Buffer as a string input port (R7RS §6.13.2 textual). bytes.Buffer satisfies io.Reader, io.RuneReader, and RuneUnreader directly — no buffering layer.
func NewStringInputPortWithReaders ¶ added in v1.16.0
func NewStringInputPortWithReaders(rdr io.Reader, rr io.RuneReader, urr RuneUnreader) *PortObject
NewStringInputPortWithReaders constructs a string input port whose rune reader and rune unreader are supplied externally. Used by fault-injecting test infrastructure (e.g., internal/extensions/ iotest) that needs to override read/unread semantics while still producing a *PortObject that production code's type assertions accept. Kind is portKindStringInput — caller is responsible for passing a reader whose semantics match a string-input port.
rdr provides the byte-level Read; rr and urr provide rune-level. They are wrapped in separate guarded* wrappers, so callers must pass consistent semantics (typically rdr and rr both wrap the same underlying *bytes.Buffer-equivalent source).
If rdr also implements io.Closer, Close is propagated. validateOrPanic runs as for any factory.
func NewStringOutputPort ¶
func NewStringOutputPort() *PortObject
NewStringOutputPort creates a fresh string output port backed by an in-memory buffer. flsh is nil (no real flush needed); sext exposes the accumulated string via StringContent.
func NewStringOutputPortWithBuffer ¶
func NewStringOutputPortWithBuffer(buffer *bytes.Buffer) *PortObject
NewStringOutputPortWithBuffer wraps the given buffer as a string output port. wb is intentionally nil — R7RS textual ports do not expose byte-level writes even though *bytes.Buffer satisfies io.ByteWriter. flsh is nil (no real flush needed).
func (*PortObject) AsByteReader ¶ added in v1.16.0
func (p *PortObject) AsByteReader() (io.ByteReader, bool)
AsByteReader returns the port's io.ByteReader and true if byte-readable; nil and false otherwise. Nil-safe.
func (*PortObject) AsByteUnreader ¶ added in v1.16.0
func (p *PortObject) AsByteUnreader() (ByteUnreader, bool)
AsByteUnreader returns the port's ByteUnreader and true if byte-unreadable; nil and false otherwise. Nil-safe.
func (*PortObject) AsByteVectorExtractor ¶ added in v1.16.0
func (p *PortObject) AsByteVectorExtractor() (ByteVectorExtractor, bool)
AsByteVectorExtractor returns the port's ByteVectorExtractor and true if extractable as bytevector; nil and false otherwise. Nil-safe.
func (*PortObject) AsByteWriter ¶ added in v1.16.0
func (p *PortObject) AsByteWriter() (io.ByteWriter, bool)
AsByteWriter returns the port's io.ByteWriter and true if byte-writable; nil and false otherwise. Nil-safe.
func (*PortObject) AsFlusher ¶ added in v1.16.0
func (p *PortObject) AsFlusher() (Flusher, bool)
AsFlusher returns the port's Flusher and true if a real flush is needed before close; nil and false otherwise. Nil-safe.
func (*PortObject) AsReader ¶ added in v1.16.0
func (p *PortObject) AsReader() (io.Reader, bool)
AsReader returns the port's io.Reader and true if readable; nil and false otherwise. Nil-safe.
func (*PortObject) AsRuneReader ¶ added in v1.16.0
func (p *PortObject) AsRuneReader() (io.RuneReader, bool)
AsRuneReader returns the port's io.RuneReader and true if rune-readable; nil and false otherwise. Nil-safe.
func (*PortObject) AsRuneUnreader ¶ added in v1.16.0
func (p *PortObject) AsRuneUnreader() (RuneUnreader, bool)
AsRuneUnreader returns the port's RuneUnreader and true if rune-unreadable; nil and false otherwise. Nil-safe.
func (*PortObject) AsRuneWriter ¶ added in v1.16.0
func (p *PortObject) AsRuneWriter() (RuneWriter, bool)
AsRuneWriter returns the port's RuneWriter and true if rune-writable; nil and false otherwise. Nil-safe.
func (*PortObject) AsStringWriter ¶ added in v1.16.0
func (p *PortObject) AsStringWriter() (io.StringWriter, bool)
AsStringWriter returns the port's io.StringWriter and true if string-writable; nil and false otherwise. Nil-safe.
func (*PortObject) AsWriter ¶ added in v1.16.0
func (p *PortObject) AsWriter() (io.Writer, bool)
AsWriter returns the port's io.Writer and true if writable; nil and false otherwise. Nil-safe.
func (*PortObject) Close ¶ added in v1.16.0
func (p *PortObject) Close() error
Close flushes (if a flusher is present) and closes the port. Close is idempotent — subsequent calls are no-ops. Nil-safe: a nil receiver returns nil.
func (*PortObject) EqualTo ¶ added in v1.16.0
func (p *PortObject) EqualTo(v Value) bool
EqualTo returns true iff v is a port with the same kind and datum identity. Nil-safe: a nil receiver compares equal only to nil.
func (*PortObject) IsClosed ¶ added in v1.16.0
func (p *PortObject) IsClosed() bool
IsClosed returns true if the port has been closed. Nil-safe: a nil receiver is treated as closed.
func (*PortObject) IsVoid ¶ added in v1.16.0
func (p *PortObject) IsVoid() bool
IsVoid returns true if the receiver is nil. Mirrors the void-receiver convention used by other value types.
func (*PortObject) PortKind ¶ added in v1.16.0
func (p *PortObject) PortKind() string
PortKind returns the Scheme-visible port kind tag (e.g., "binary-input-port"). Returns "" for a nil receiver — there is no "unknown" port kind in the codebase; the empty string is the nil-safe sentinel.
func (*PortObject) SchemeString ¶ added in v1.16.0
func (p *PortObject) SchemeString() string
SchemeString returns the Scheme external representation. Preserves the existing portBase format `<{kind} 0xADDR>` verbatim. A nil receiver returns `<port nil>`.
func (*PortObject) StringContent ¶ added in v1.16.0
func (p *PortObject) StringContent() (string, bool)
StringContent returns the accumulated string for string-output ports. Returns ("", false) if the port is not string-extractable. Nil-safe.
API asymmetry with AsByteVectorExtractor: this returns the resolved string directly while AsByteVectorExtractor returns the extractor interface for the caller to invoke. The asymmetry is a deliberate deferral — converging the two extractor APIs (either both returning the interface, or both returning the resolved value) is tracked as a follow-up in memory/2026-05-14-port-unification-impl.md under "Deferred follow-ups".
func (*PortObject) Validate ¶ added in v1.16.0
func (p *PortObject) Validate() error
Validate checks the cross-slot capability invariants I1–I7. Every New*Port factory calls Validate and panics on failure; embedders constructing PortObject literally may call this themselves.
Invariants:
- I1: rb != nil requires rdr != nil
- I2: rr != nil requires rdr != nil
- I3: bidirectional pairing — rb requires urb (and vice versa); rr requires urr (and vice versa). Every factory in port_constructors.go assigns these slots together; tightening Validate to enforce both directions turns the construction convention into a checked invariant.
- I4: wb, wr, ws non-nil require wrt != nil
- I5: ext != nil requires wrt != nil
- I6: sext != nil requires wrt != nil
- I7: ext and sext are mutually exclusive
I8 (kind matches capability profile) is enforced by construction — every factory writes both kind and the slot set in the same struct literal — and is asserted at the per-factory test level.
type Process ¶ added in v1.9.1
type Process struct {
// contains filtered or unexported fields
}
Process represents a running OS process. Wraps *exec.Cmd and its connected pipes. Accessors return the ports for stdout, stderr, and stdin.
func NewProcess ¶ added in v1.9.1
func NewProcess( command string, cmd *exec.Cmd, stdin *PortObject, stdout *PortObject, stderr *PortObject, ) *Process
NewProcess creates a Process value. The cmd may be nil for testing. Ports may be nil if the process was not started with pipes.
func (*Process) IsVoid ¶ added in v1.9.1
IsVoid reports whether this process value is void. A nil *Process is considered void to satisfy the values.Value contract.
func (*Process) SchemeString ¶ added in v1.9.1
SchemeString returns the Scheme external representation.
func (*Process) Stderr ¶ added in v1.9.1
func (p *Process) Stderr() *PortObject
Stderr returns the input port connected to the process stderr.
func (*Process) Stdin ¶ added in v1.9.1
func (p *Process) Stdin() *PortObject
Stdin returns the output port connected to the process stdin.
func (*Process) Stdout ¶ added in v1.9.1
func (p *Process) Stdout() *PortObject
Stdout returns the input port connected to the process stdout.
type Promise ¶
type Promise struct {
// contains filtered or unexported fields
}
Promise represents a delayed computation (R7RS lazy evaluation). A promise contains either an unevaluated thunk or a cached result.
R7RS §4.2.5: The first time a promise is forced, its body is evaluated and the result is memoized; on subsequent forces, the memoized result is returned.
func NewForcedPromise ¶
NewForcedPromise creates an already-forced promise with the given value. This is used by make-promise when given a non-promise value.
func NewPromise ¶
NewPromise creates a new unforced promise with the given thunk. The thunk should be a procedure that takes no arguments.
func (*Promise) CachedResult ¶ added in v1.5.0
CachedResult returns the memoized result of a forced promise. Only valid when IsForced returns true.
func (*Promise) Force ¶ added in v1.5.0
Force transitions the promise from unforced to forced, caching the given result and clearing the thunk. Subsequent calls to IsForced return true and CachedResult returns the cached value.
func (*Promise) IsForced ¶ added in v1.5.0
IsForced reports whether the promise has been forced. A forced promise has a cached result and no thunk.
func (*Promise) SchemeString ¶
SchemeString returns the Scheme representation of the promise.
type RWMutex ¶
type RWMutex struct {
// contains filtered or unexported fields
}
RWMutex wraps sync.RWMutex for Scheme
func (*RWMutex) SchemeString ¶
SchemeString returns the Scheme representation of the RWMutex.
type Rational ¶
type Rational struct {
// contains filtered or unexported fields
}
Rational represents a Scheme rational number (exact fraction).
func NewRational ¶
NewRational creates a new Rational from numerator and denominator. The fraction is automatically normalized (reduced to lowest terms).
func NewRationalFromBigInt ¶
NewRationalFromBigInt creates a new Rational from big.Int numerator and denominator.
func NewRationalFromRat ¶
NewRationalFromRat creates a Rational from an existing big.Rat.
func (*Rational) Add ¶
R7RS §6.2.6: The + procedure returns the sum of its arguments. R7RS §6.2.2 Exactness: exact + exact = exact, exact + inexact = inexact. Inexactness is contagious per R7RS §6.2.2.
func (*Rational) Compare ¶
Compare compares this rational with another number.
R7RS §6.2.6: Numeric comparisons use mathematical value regardless of exactness. Returns -1 if p < o, 0 if p == o, 1 if p > o.
func (*Rational) DenomInt64 ¶
DenomInt64 returns the denominator as int64 (may overflow for large values).
func (*Rational) EqualTo ¶
EqualTo returns true if the rationals have equal values. Handles comparison with Integer and BigInteger for symmetry with whole-valued rationals (e.g., 5/1 == 5).
func (*Rational) Float64Truncated ¶ added in v1.16.0
Float64Truncated returns the rational as a float64, discarding the big.Rat.Float64() exact-bool signal. The name documents the silent loss (1/3 → 0.333..., 2^100 → 1.2e+30, 1e500 → +Inf). Callers that need the signal should use Float64WithAccuracy or, at the cross-package boundary, the values.ToFloat64WithAccuracy helper.
func (*Rational) Float64WithAccuracy ¶ added in v1.16.0
Float64WithAccuracy returns the rational as a float64 paired with a big.Accuracy direction. Returns big.Exact when the rational is exactly representable in float64, else big.Below/Above depending on rounding direction; ±Inf overflow is reported as Above/Below relative to the finite limit. See rationalToFloat64WithAccuracy for the registry-path equivalent.
func (*Rational) HashCode ¶
HashCode returns a hash of the rational value. Uses the canonical exact-family hash so that Integer, BigInteger, and Rational produce identical hashes for equal values.
func (*Rational) IsExact ¶
IsExact returns true since Rational is always exact.
R7RS §6.2.2: Rationals are always exact numbers.
func (*Rational) IsFinite ¶ added in v1.1.0
IsFinite returns true since exact rationals are always finite.
R7RS §6.2.6: finite? returns #t for all exact numbers.
func (*Rational) IsInteger ¶
IsInteger returns true if the rational represents an integer (denominator is 1).
func (*Rational) IsNaN ¶ added in v1.1.0
IsNaN returns false since exact rationals are never NaN.
R7RS §6.2.6: nan? returns #f for exact numbers.
func (*Rational) IsNegative ¶ added in v1.1.0
IsNegative returns true if this rational is negative.
func (*Rational) IsPositive ¶ added in v1.1.0
IsPositive returns true if this rational is positive.
func (*Rational) IsRational ¶ added in v1.1.0
IsRational returns true since Rational is always a rational number.
R7RS §6.2.6: rational? returns #t for exact rationals.
func (*Rational) Kind ¶ added in v1.5.0
func (p *Rational) Kind() NumericKind
Add returns the sum of two numbers.
Kind returns the numeric kind for dispatch table indexing.
func (*Rational) Negate ¶
Negate returns the negation of this rational.
R7RS §6.2.6: The - procedure with one argument returns the additive inverse.
func (*Rational) NumInt64 ¶
NumInt64 returns the numerator as int64 (may overflow for large values).
func (*Rational) SchemeString ¶
SchemeString returns the Scheme representation of the rational.
func (*Rational) Subtract ¶
Subtract returns the difference of two numbers.
R7RS §6.2.6: The - procedure returns the difference of its arguments. R7RS §6.2.2 Exactness: exact - exact = exact, exact - inexact = inexact.
type RealNumber ¶ added in v1.1.0
RealNumber represents a real-valued number with sign operations.
R7RS §6.2.6: The positive? and negative? predicates apply only to real numbers. Sign returns -1, 0, or 1.
type Record ¶
type Record struct {
// contains filtered or unexported fields
}
Record represents a record instance as defined by R7RS define-record-type. Each record has a type descriptor and a slice of field values.
func NewRecord ¶
func NewRecord(rt *RecordType, fields []Value) (*Record, error)
NewRecord creates a new Record with the given type and field values. Returns an error if rt is nil or len(fields) does not match rt.FieldCount().
func (*Record) EqualTo ¶
EqualTo implements structural equality for records. Two records are equal if they have the same type and all fields are equal.
func (*Record) FieldByName ¶
FieldByName returns the value of the field with the given name. Returns nil if the field is not found.
func (*Record) RecordType ¶
func (p *Record) RecordType() *RecordType
RecordType returns the record's type descriptor.
func (*Record) SchemeString ¶
SchemeString returns the Scheme external representation of the record. Opaque records omit the "record:" prefix to avoid revealing their implementation.
func (*Record) SetFieldByName ¶
SetFieldByName sets the value of the field with the given name. Does nothing if the field is not found.
type RecordType ¶
type RecordType struct {
// contains filtered or unexported fields
}
RecordType represents a record type descriptor as defined by R7RS define-record-type. It holds the type name, the ordered list of field names, and an optional parent type for record inheritance.
func NewDerivedRecordType ¶ added in v1.12.0
func NewDerivedRecordType(name *Symbol, parent *RecordType, fieldNames []*Symbol) *RecordType
NewDerivedRecordType creates a new RecordType that inherits from the given parent. If the parent is opaque, the derived type is also opaque.
func NewOpaqueRecordType ¶ added in v1.14.0
func NewOpaqueRecordType(name *Symbol, fieldNames []*Symbol) *RecordType
NewOpaqueRecordType creates a new RecordType that is opaque to generic inspection. Instances of opaque record types are not recognized by record? and cannot be inspected via record-type. Type-specific predicates and accessors still work. Panics if name is nil.
func NewRecordType ¶
func NewRecordType(name *Symbol, fieldNames []*Symbol) *RecordType
NewRecordType creates a new RecordType with the given name and field names. The parent defaults to nil (no inheritance).
func (*RecordType) EqualTo ¶
func (p *RecordType) EqualTo(v Value) bool
EqualTo implements identity-based equality for record types. Two record types are equal only if they are the same object.
func (*RecordType) FieldCount ¶
func (p *RecordType) FieldCount() int
FieldCount returns the number of fields in this record type.
func (*RecordType) FieldIndex ¶
func (p *RecordType) FieldIndex(name *Symbol) int
FieldIndex returns the index of the field with the given name, or -1 if not found.
func (*RecordType) FieldNames ¶
func (p *RecordType) FieldNames() []*Symbol
FieldNames returns the ordered list of field name symbols.
func (*RecordType) IsOpaque ¶ added in v1.14.0
func (p *RecordType) IsOpaque() bool
IsOpaque returns true if this record type is opaque to generic inspection.
func (*RecordType) IsVoid ¶
func (p *RecordType) IsVoid() bool
IsVoid returns true if the record type is nil.
func (*RecordType) Name ¶
func (p *RecordType) Name() *Symbol
Name returns the record type's name symbol.
func (*RecordType) Parent ¶ added in v1.12.0
func (p *RecordType) Parent() *RecordType
Parent returns the parent record type, or nil if this is a base type.
func (*RecordType) SchemeString ¶
func (p *RecordType) SchemeString() string
SchemeString returns the Scheme external representation of the record type. Opaque record types use #<type:N> to avoid revealing the record nature.
type RecordTypeConstraint ¶ added in v1.12.0
type RecordTypeConstraint struct {
// contains filtered or unexported fields
}
RecordTypeConstraint validates that a value is a Record whose RecordType matches (or inherits from) a specific record type descriptor.
func NewRecordTypeConstraint ¶ added in v1.12.0
func NewRecordTypeConstraint(rtd *RecordType) *RecordTypeConstraint
NewRecordTypeConstraint creates a RecordTypeConstraint for the given record type descriptor. Panics if rtd is nil.
func (*RecordTypeConstraint) Check ¶ added in v1.12.0
func (p *RecordTypeConstraint) Check(v Value) (any, bool, error)
Check tests whether v is a Record whose type matches (or inherits from) the target record type descriptor. Walks the parent chain for subtype matching.
func (*RecordTypeConstraint) Description ¶ added in v1.12.0
func (p *RecordTypeConstraint) Description() string
Description returns a human-readable description of the record type constraint.
func (*RecordTypeConstraint) Name ¶ added in v1.12.0
func (p *RecordTypeConstraint) Name() string
Name returns the Scheme-facing name of the record type.
type RuneUnreader ¶ added in v1.16.0
type RuneUnreader interface {
UnreadRune() error
}
RuneUnreader is the interface satisfied by readers that can unread the last rune. Mirrors io.RuneScanner's UnreadRune half.
type RuneWriter ¶ added in v1.16.0
RuneWriter is the interface satisfied by writers that can write a rune. The stdlib has no equivalent; bufio.Writer and bytes.Buffer satisfy it.
type SchemeWriter ¶
type SchemeWriter struct {
// contains filtered or unexported fields
}
SchemeWriter provides cycle-aware writing of Scheme values. Two-pass datum label output (R7RS §2.4): pass 1 (findShared) traverses the value graph to identify multiply-referenced objects; pass 2 (write) emits #n= definitions on first encounter and #n# references thereafter. See BIBLIOGRAPHY.md "Two-Pass Datum Label Output".
Implementation note: Uses maps with concrete *Pair and *Vector keys (not Tuple/Indexable interfaces) because: 1. Go map keys must be comparable types - interfaces are not suitable 2. Cycle/sharing detection requires pointer identity tracking 3. Each concrete type needs separate tracking for proper label assignment
func NewSchemeWriter ¶
func NewSchemeWriter() *SchemeWriter
NewSchemeWriter creates a new SchemeWriter for cycle-aware output. Default mode is WriteModeWrite (labels only circular references).
func (*SchemeWriter) WriteString ¶
func (p *SchemeWriter) WriteString(v Value) string
WriteString writes a Scheme value to a string with cycle detection. Circular and shared structures are represented using datum labels.
type Scope ¶ added in v1.16.0
type Scope struct {
// IsRebinding indicates whether this scope can potentially rebind auxiliary syntax.
// True for let-syntax/letrec-syntax scopes which create local macro bindings.
// False for with-binding-scope which only adds scopes for binding hygiene.
// This distinction is used in literalScopesMatch to correctly handle auxiliary
// syntax like => and else in cond/case.
IsRebinding bool
// Label is an optional human-readable description for debugging.
// Examples: "lambda", "let-syntax", "intro:my-macro", "library:(wile kanren)".
Label string
// contains filtered or unexported fields
}
Scope is an identity marker for macro hygiene. Each macro invocation creates a fresh Scope. Hygiene checking uses pointer equality to determine if a binding's scopes are a subset of a reference's scopes. This implements Flatt's "sets of scopes" model where scopes are just unique tags, not environment hierarchies.
func AddScopeToSet ¶ added in v1.16.0
AddScopeToSet adds a scope to a set if not already present
func FlipScopeInSet ¶ added in v1.16.0
FlipScopeInSet toggles the presence of a scope in a set. If the scope is present, it is removed; if absent, it is added. This is the core operation for syntax-local-introduce.
func NewRebindingScope ¶ added in v1.16.0
func NewRebindingScope() *Scope
NewRebindingScope creates a new scope that can potentially rebind auxiliary syntax. Used by let-syntax and letrec-syntax to mark scopes that could shadow literals.
func NewRebindingScopeWithLabel ¶ added in v1.16.0
NewRebindingScopeWithLabel creates a new rebinding scope with a label.
func NewScope ¶ added in v1.16.0
func NewScope() *Scope
NewScope creates a new scope with unique identity for hygiene tracking. By default, scopes are not rebinding scopes.
func NewScopeWithLabel ¶ added in v1.16.0
NewScopeWithLabel creates a new scope with a human-readable label for debugging. The label has no semantic effect — it is purely for diagnostics.
func RemoveScopeFromSet ¶ added in v1.16.0
RemoveScopeFromSet removes a scope from a set
type SelectCase ¶
type SelectCase struct {
Channel *Channel
Value Value // for send operations
Kind SelectCaseKind
}
type SelectCaseKind ¶ added in v1.5.0
type SelectCaseKind int
SelectCase represents a case in a channel select operation SelectCaseKind distinguishes the three valid select case types.
const ( SelectReceive SelectCaseKind = iota SelectSend SelectDefault )
type SourceContext ¶ added in v1.16.0
type SourceContext struct {
Text string
File string
Start SourceIndexes
End SourceIndexes
Scopes []*Scope // Scopes associated with this source location
Origin *OriginInfo // Macro expansion origin chain (nil if not from macro)
}
SourceContext holds source location and hygiene information for a syntax object.
func NewSourceContext ¶ added in v1.16.0
func NewSourceContext(text, file string, start, end SourceIndexes) *SourceContext
NewSourceContext creates a new source context with the given location info.
func NewZeroValueSourceContext ¶ added in v1.16.0
func NewZeroValueSourceContext() *SourceContext
NewZeroValueSourceContext creates an empty source context.
func (*SourceContext) Clone ¶ added in v1.16.0
func (p *SourceContext) Clone() *SourceContext
Clone returns a shallow copy of the SourceContext. The Scopes slice and Origin pointer are shared with the original; callers that need to mutate those fields should assign new values after cloning (which is exactly what the With* methods do).
func (*SourceContext) EqualTo ¶ added in v1.16.0
func (p *SourceContext) EqualTo(value Value) bool
EqualTo returns true if this source context equals the given value.
func (*SourceContext) IsVoid ¶ added in v1.16.0
func (p *SourceContext) IsVoid() bool
IsVoid returns true if the source context is nil.
func (*SourceContext) Location ¶ added in v1.16.0
func (p *SourceContext) Location() string
Location returns the source location formatted as "file:line:col". Returns empty string if the receiver is nil or has no file.
func (*SourceContext) SchemeString ¶ added in v1.16.0
func (p *SourceContext) SchemeString() string
SchemeString returns the Scheme representation of the source context.
func (*SourceContext) WithOrigin ¶ added in v1.16.0
func (p *SourceContext) WithOrigin(origin *OriginInfo) *SourceContext
WithOrigin returns a new SourceContext with the given origin chain. Used to attach macro expansion tracking information to syntax objects.
func (*SourceContext) WithScope ¶ added in v1.16.0
func (p *SourceContext) WithScope(scope *Scope) *SourceContext
WithScope returns a new SourceContext with an additional scope.
This is the primitive operation for adding hygiene scopes to syntax objects. In Flatt's "sets of scopes" model, each syntax object carries a set of scopes that identifies its binding context.
Design Decision: Scopes are stored in SourceContext rather than on individual syntax types. This treats scopes as source-location metadata, keeping the syntax types simpler and the scope management centralized.
The new scope is prepended to the list (most recent scope first). This doesn't affect the ScopesMatch algorithm, which uses set membership.
Returns a NEW SourceContext (immutable design for syntax objects).
func (*SourceContext) WithScopes ¶ added in v1.16.0
func (p *SourceContext) WithScopes(scopes []*Scope) *SourceContext
WithScopes returns a new SourceContext with additional scopes
func (*SourceContext) WithoutScopes ¶ added in v1.16.0
func (p *SourceContext) WithoutScopes() *SourceContext
WithoutScopes returns a new SourceContext with scopes cleared. Used when creating template identifiers that should not inherit use-site scopes during macro expansion (Flatt 2016 hygiene model).
type SourceIndexes ¶ added in v1.16.0
type SourceIndexes struct {
// contains filtered or unexported fields
}
SourceIndexes tracks position within a source file (index, column, line).
func NewSourceIndexes ¶ added in v1.16.0
func NewSourceIndexes(index, column, line int) SourceIndexes
NewSourceIndexes creates a new SourceIndexes with the given position.
func (SourceIndexes) Column ¶ added in v1.16.0
func (p SourceIndexes) Column() int
Column returns the column number within the current line (0-based).
func (SourceIndexes) EqualTo ¶ added in v1.16.0
func (p SourceIndexes) EqualTo(o Value) bool
EqualTo returns true if the positions are equal.
func (*SourceIndexes) Inc ¶ added in v1.16.0
func (p *SourceIndexes) Inc(n int) int
Inc advances the position by n characters on the same line.
func (SourceIndexes) Index ¶ added in v1.16.0
func (p SourceIndexes) Index() int
Index returns the absolute byte position in the source.
func (SourceIndexes) IsVoid ¶ added in v1.16.0
func (p SourceIndexes) IsVoid() bool
IsVoid returns false; SourceIndexes is never void.
func (SourceIndexes) Line ¶ added in v1.16.0
func (p SourceIndexes) Line() int
Line returns the line number (1-based).
func (*SourceIndexes) NewLine ¶ added in v1.16.0
func (p *SourceIndexes) NewLine() int
NewLine updates column and line tracking for a newline character. The index should already have been advanced by Inc(n) before calling this.
func (SourceIndexes) SchemeString ¶ added in v1.16.0
func (p SourceIndexes) SchemeString() string
SchemeString returns a string representation of the position.
func (*SourceIndexes) Tab ¶ added in v1.16.0
func (p *SourceIndexes) Tab() int
Tab updates column tracking for a tab character (8-column tab stops). The index should already have been advanced by Inc(n) before calling this.
type SourceLocation ¶
SourceLocation represents a position in source code.
type String ¶
type String struct {
Value string
// contains filtered or unexported fields
}
String represents a Scheme string value. R7RS §6.7: Literal strings and strings from symbol->string are immutable.
func NewMutableString ¶
NewMutableString returns a mutable String value. Use this for strings that may be mutated (e.g., via string-set! or string-fill!). R7RS §6.7: Procedures like string-copy return mutable strings.
func NewString ¶
NewString returns an immutable String value. R7RS §6.7: Literal strings and strings from symbol->string are immutable. Use NewMutableString for runtime-allocated strings that may be mutated.
func (*String) Fill ¶
Fill fills the string (or a portion of it) with the given character. Returns an error if the string is immutable. R7RS §6.7: (string-fill! string fill [start [end]])
func (*String) Get ¶ added in v1.1.0
Get returns the character at the given rune index as a Character value.
R7RS §6.7: (string-ref string k) returns character k of string.
func (*String) IsImmutable ¶ added in v1.3.0
IsImmutable returns true if the string cannot be mutated. Literal strings and strings returned by symbol->string are immutable. R7RS §6.7: It is an error to apply mutation procedures to literal strings or strings returned by symbol->string.
func (*String) Length ¶ added in v1.1.0
Length returns the length of the string in characters (runes).
R7RS §6.7: (string-length string) returns the number of characters.
func (*String) SchemeString ¶
SchemeString returns the Scheme representation of the string.
func (*String) Set ¶ added in v1.1.0
Set sets the character at the given rune index from a Character value. Returns an error if the string is immutable.
R7RS §6.7: (string-set! string k char) stores char in element k.
func (*String) SetChar ¶
SetChar sets the character at index k to the given rune. Returns an error if the string is immutable.
R7RS §6.7: (string-set! string k char) R7RS §6.7: "It is an error" to mutate literal strings or strings returned by symbol->string. This implementation signals an error when mutation is attempted on immutable strings.
type StringExtractor ¶ added in v1.16.0
type StringExtractor interface {
String() string
}
StringExtractor is implemented by buffers that can yield their accumulated bytes as a string. *bytes.Buffer satisfies it. Symmetric with ByteVectorExtractor.
type Symbol ¶
type Symbol struct {
Key string
}
Symbol represents a Scheme symbol.
func BigAccuracyToSymbol ¶ added in v1.16.0
BigAccuracyToSymbol maps a Go big.Accuracy to the corresponding Scheme singleton symbol. Used by primitives in extensions/math/ that surface accuracy to Scheme.
func NewTemporaryVariableName ¶
func NewTemporaryVariableName() *Symbol
NewTemporaryVariableName generates a unique symbol for use as a temporary variable. The symbol name has the format "__T_<base32-encoded-random-bytes>". Uses 128 bits of cryptographic randomness to ensure uniqueness. Thread-safe: uses crypto/rand which is safe for concurrent use. Panics if random number generation fails.
func (*Symbol) SchemeString ¶
SchemeString returns the R7RS external representation of the symbol.
R7RS §7.1.1: Identifiers that can be represented without bars are written bare. Otherwise, they are enclosed in vertical bars with only \ and | characters escaped.
type SyntaxBase ¶ added in v1.16.0
type SyntaxBase struct {
// contains filtered or unexported fields
}
SyntaxBase provides a common SourceContext() implementation for concrete syntax types via Go struct embedding. It eliminates boilerplate SourceContext() methods across the syntax type set (SyntaxObject, SyntaxSymbol, SyntaxPair, SyntaxVector, SyntaxComment, SyntaxDatum*, SyntaxDirective).
The sourceContext field is unexported; construct via NewSyntaxBase.
Note: IsVoid() and UnwrapAll() cannot be provided here:
- IsVoid() requires nil receiver checks, which don't work with embedding
- UnwrapAll() needs access to the outer type (self), not the embedded struct
func NewSyntaxBase ¶ added in v1.16.0
func NewSyntaxBase(sc *SourceContext) SyntaxBase
NewSyntaxBase constructs a SyntaxBase carrying the given source context.
func (*SyntaxBase) SetSourceContext ¶ added in v1.16.0
func (p *SyntaxBase) SetSourceContext(sc *SourceContext)
SetSourceContext replaces the source context. Used by syntax-list builders that thread per-element source contexts through a chain of pairs after construction.
func (*SyntaxBase) SourceContext ¶ added in v1.16.0
func (p *SyntaxBase) SourceContext() *SourceContext
SourceContext returns the source context carried by the embedding type.
type SyntaxForEachFunc ¶ added in v1.16.0
SyntaxForEachFunc is the callback type for iterating over syntax tuples.
type SyntaxTuple ¶ added in v1.16.0
type SyntaxTuple interface {
Tuple
SyntaxValue
SyntaxCar() SyntaxValue
SyntaxCdr() SyntaxValue
AsSyntaxVector() *SyntaxVector
SyntaxAppend(value SyntaxValue) SyntaxValue
SyntaxForEach(ctx context.Context, fn SyntaxForEachFunc) (SyntaxValue, error)
}
SyntaxTuple is the interface for syntax lists (pairs and vectors).
type SyntaxValue ¶ added in v1.16.0
type SyntaxValue interface {
Value
SourceContext() *SourceContext
Unwrap() Value
UnwrapAll() Value
}
SyntaxValue is the interface for all syntax objects. It provides access to source context and unwrapping capabilities.
The interface is defined in package values (rather than in the syntax package) so that the empty-list singleton (values.EmptyList) can directly implement it. This collapses the historical duality between values.emptyListType and the (now removed) syntaxEmptyListType — the empty list carries no symbols, no scopes, and no source-attachable hygiene content, matching Chez's `(equal? (syntax ()) '()) → #t`.
var SyntaxVectorVoidValue SyntaxValue
SyntaxVectorVoidValue is the syntax-level void value, set by internal/syntax at init time. SyntaxVector.SyntaxForEach with a nil receiver returns this value to preserve the original "syntax void tail" semantics (distinguishable from the empty-list tail).
MUST be non-nil. See SyntaxValueUnwrapAllFunc for the rationale.
type SyntaxVector ¶ added in v1.16.0
type SyntaxVector struct {
Values []SyntaxValue
SyntaxBase
}
SyntaxVector wraps a Scheme vector with source context.
The pair-side recursive scope-propagation logic for SyntaxVector lives in the internal/syntax package alongside the other concrete syntax data types. Only the data type itself is here so the SyntaxTuple interface (which references *SyntaxVector via AsSyntaxVector) can also live in values.
func NewSyntaxVector ¶ added in v1.16.0
func NewSyntaxVector(sc *SourceContext, vs ...SyntaxValue) *SyntaxVector
NewSyntaxVector creates a new syntax vector with the given source context and elements.
func (*SyntaxVector) AddScope ¶ added in v1.16.0
func (p *SyntaxVector) AddScope(scope *Scope) SyntaxValue
AddScope recursively propagates a scope to all nested syntax values.
Implements scope propagation for Flatt's "sets of scopes" hygiene. When a macro expands, the intro scope must be added to all identifiers (symbols) in the expansion. Empty vectors return self unchanged.
Panics if SyntaxVectorAddScopeFunc is nil — see the var declaration for why a silent fallback would be unsafe.
func (*SyntaxVector) EqualTo ¶ added in v1.16.0
func (p *SyntaxVector) EqualTo(o Value) bool
EqualTo performs pointer comparison only, matching Chez Scheme/Racket behavior. Two syntax objects are equal? only if they are the same object. For value comparison of syntax objects, use bound-identifier=? or free-identifier=?.
func (*SyntaxVector) ForEach ¶ added in v1.16.0
func (p *SyntaxVector) ForEach(ctx context.Context, fn ForEachFunc) (Value, error)
ForEach iterates over the elements of the vector as regular values in index order. It provides tuple-style iteration compatible with values.ForEachFunc callbacks.
func (*SyntaxVector) IsVoid ¶ added in v1.16.0
func (p *SyntaxVector) IsVoid() bool
IsVoid returns true if the syntax vector is nil.
func (*SyntaxVector) SchemeString ¶ added in v1.16.0
func (p *SyntaxVector) SchemeString() string
SchemeString returns the Scheme representation of the syntax vector.
func (*SyntaxVector) SyntaxForEach ¶ added in v1.16.0
func (p *SyntaxVector) SyntaxForEach(ctx context.Context, fn SyntaxForEachFunc) (SyntaxValue, error)
SyntaxForEach iterates over the syntax elements of the vector. A nil receiver returns the syntax-void singleton (semantically distinct from the empty-list tail returned for an iterated vector).
The callback is invoked for each element with its index and a boolean indicating whether there is another element after the current one. If the callback returns an error, iteration stops immediately and the error is returned.
Panics if SyntaxVectorVoidValue is nil — see the var declaration for why a silent fallback would be unsafe (returning the empty list instead of void changes the semantics callers branch on).
func (*SyntaxVector) Unwrap ¶ added in v1.16.0
func (p *SyntaxVector) Unwrap() Value
func (*SyntaxVector) UnwrapAll ¶ added in v1.16.0
func (p *SyntaxVector) UnwrapAll() Value
UnwrapAll recursively unwraps all elements to produce a plain values.Vector, using the syntax package's cycle-aware recursive unwrap.
Panics if SyntaxValueUnwrapAllFunc is nil — see the var declaration for why a silent fallback would be unsafe (cyclic syntax structures would stack-overflow on a non-cycle-aware fallback walk).
type TerminatedThreadException ¶
type TerminatedThreadException struct {
Thread *Thread
}
TerminatedThreadException is raised when joining a terminated thread
func (*TerminatedThreadException) Error ¶
func (p *TerminatedThreadException) Error() string
type Thread ¶
type Thread struct {
// RunFunc is set by the machine package to actually run the thread
// This avoids circular dependency between values and machine
RunFunc func(ctx context.Context, thunk Callable) (Value, error)
// CleanupFunc is injected by the machine package to run dynamic-wind
// after thunks (UnwindTo(0)) on thread exit. Called on both normal exit
// and forced termination.
CleanupFunc func()
// contains filtered or unexported fields
}
Thread represents a Scheme thread (SRFI-18)
func (*Thread) AbandonOwnedMutexes ¶ added in v1.1.0
func (p *Thread) AbandonOwnedMutexes()
AbandonOwnedMutexes marks all mutexes owned by this thread as abandoned. Called during thread termination to ensure waiting threads are notified.
func (*Thread) Context ¶ added in v1.5.0
Context returns the context associated with this thread. Returns nil if the thread has not been started.
func (*Thread) Done ¶
func (p *Thread) Done() <-chan struct{}
Done returns a channel that's closed when the thread terminates
func (*Thread) Join ¶
Join waits for the thread to terminate with optional timeout Returns the thread's result or an error
func (*Thread) SchemeString ¶
SchemeString returns the Scheme representation of this thread.
func (*Thread) SetSpecific ¶
SetSpecific sets the thread's specific field
func (*Thread) Start ¶
Start begins execution of the thread. The parentCtx is used as the parent for the thread's cancellable context, enabling cancellation propagation from the engine/caller while allowing independent termination via thread-terminate!.
func (*Thread) State ¶
func (p *Thread) State() ThreadState
State returns the current state of the thread
func (*Thread) StateSymbol ¶
StateSymbol returns the state as a Scheme symbol. Returns package-level singletons so that repeated calls return the same pointer: (eq? (thread-state t) (thread-state t)) → #t. See the doc comment on SymbolThreadNew for eq? vs equal? caveats.
func (*Thread) Terminate ¶
func (p *Thread) Terminate()
Terminate forcefully terminates the thread. Marks all owned mutexes as abandoned and cancels the thread's context. The deferred cleanup in the goroutine (dynamic-wind after thunks) will fire when the goroutine exits. However, AbandonOwnedMutexes is also called here directly because the goroutine may be blocked on a Go-level operation (e.g., sync.Cond.Wait) and won't exit immediately on context cancellation.
func (*Thread) TrackMutex ¶ added in v1.1.0
TrackMutex adds a mutex to this thread's ownership tracking set. Called by mutex-lock! when a mutex is acquired with this thread as owner.
func (*Thread) UntrackMutex ¶ added in v1.1.0
UntrackMutex removes a mutex from this thread's ownership tracking set. Called by mutex-unlock! when a mutex is released.
type ThreadState ¶
type ThreadState int
ThreadState represents the state of a thread
const ( ThreadNew ThreadState = iota // Created but not started ThreadRunnable // Running or ready to run ThreadBlocked // Waiting for mutex/cv/sleep ThreadTerminated // Finished execution )
ThreadState constants.
func (ThreadState) String ¶
func (p ThreadState) String() string
type Time ¶
type Time struct {
// contains filtered or unexported fields
}
Time represents a point in time (SRFI-18)
func NewTimeFromSeconds ¶
NewTimeFromSeconds creates a Time from seconds since epoch
func (*Time) DurationFromNow ¶
DurationFromNow returns the duration from now until this time.
func (*Time) SchemeString ¶
SchemeString returns the Scheme representation of the time.
type Tuple ¶
type Tuple interface {
Value
// Car returns the first element of the pair (R7RS §6.4).
Car() Value
// Cdr returns the rest of the list after the first element (R7RS §6.4).
Cdr() Value
// ForEach calls fn for each element in order. Returns the tail value
// (EmptyList for proper lists, the improper cdr otherwise).
ForEach(ctx context.Context, fn ForEachFunc) (Value, error)
// Length returns the number of elements. For improper lists, this
// counts only the proper prefix.
Length() int
// Append creates a new list with value appended (R7RS §6.4 append).
Append(value Value) Value
// AsVector converts the list to a Vector (R7RS §6.4 list->vector).
AsVector() *Vector
// IsList reports whether this is a proper list (R7RS §6.4 list?).
// Uses Floyd's cycle detection (tortoise-and-hare).
IsList() bool
// IsEmptyList reports whether this is the empty list (R7RS §6.4 null?).
IsEmptyList() bool
// IsVoid reports whether this value is void (nil receiver handling).
IsVoid() bool
}
Tuple represents the Scheme list protocol — any value that can be consumed as a sequence of car/cdr pairs.
R7RS §6.4: Lists are chains of pairs terminated by the empty list. Tuple captures the operations needed to traverse, measure, and convert list-shaped values without requiring a concrete *Pair type.
Implemented by: Pair, emptyListType (EmptyList singleton).
IsVoid is listed explicitly because Pair uses a nil-receiver convention where (*Pair)(nil) represents void, and the method must be dispatched through the interface to handle that case.
func List ¶
List constructs a proper list from the given values. Returns EmptyList if no arguments are provided. The resulting list has the values in the same order as the arguments.
Implementation note: Block-allocates all Pair cells in a single slice and links them via cdr pointers. Callers receive the Tuple interface.
func VectorToList ¶
VectorToList converts a Vector to a proper list preserving element order. Returns EmptyList for nil or void vectors.
type TypeConstraint ¶ added in v1.12.0
type TypeConstraint interface {
// Name returns the Scheme-facing type name (e.g., "integer", "point").
Name() string
// Description returns a human-readable description.
Description() string
// Check tests whether v satisfies this constraint.
// On success, returns the narrowed value and true.
// On failure, returns nil, false, and an error describing the mismatch.
Check(Value) (any, bool, error)
}
TypeConstraint describes a type expectation for documentation and validation. Built-in types are represented by ValueType constants. User-defined types (e.g., record types) implement this interface directly.
A nil TypeConstraint means "unspecified" (no type info declared). TypeAny means "explicitly accepts any value."
type UncaughtThreadException ¶
type UncaughtThreadException struct {
Reason error
}
UncaughtThreadException wraps an exception that wasn't caught in a thread
func (*UncaughtThreadException) Error ¶
func (p *UncaughtThreadException) Error() string
func (*UncaughtThreadException) Unwrap ¶
func (p *UncaughtThreadException) Unwrap() error
type Value ¶
Value is the base interface for all Scheme values.
Every runtime object in Wile implements Value. The three methods correspond to fundamental Scheme operations:
- SchemeString returns the external representation (R7RS §6.13.3 write).
- IsVoid reports whether this value represents the absence of a result (e.g., the return value of set! or display). A nil receiver must return true so that missing values are treated as void.
- EqualTo implements structural equality (R7RS §6.1 equal?).
ADDING A NEW VALUE TYPE requires at minimum:
- values/<type>.go — implement Value (SchemeString, IsVoid, EqualTo)
- values/<type>_test.go — test the three Value methods + type-specific behavior
Depending on the type's role, also update:
- registry/core/prim_predicates.go — if it needs a type predicate (e.g., box?)
- ffi.go — if it maps to/from Go types via RegisterFunc
- values/scheme_writer.go — if it has internal structure that can be shared/circular
- machine/machine_context_apply.go — if it is callable (implements Callable)
- machine/native_template.go — if it can appear as a compile-time literal
- values/value_type.go — if the type participates in the extension-API type vocabulary: add a ValueType constant + entries in typeNames, typeDescriptions, checks, AND a row in goTypeToValueType so SchemeTypeName renders a Scheme name instead of leaking the Go type via %T. Types named in Scheme but without a ValueType counterpart (Record, Box, Promise) instead get an arm in SchemeTypeName's explicit switch.
If the new type has capability-conditional operations (e.g., optional read/write/seek surfaces), expose them via AsXxx() (T, bool) methods following the *PortObject pattern (values/port.go — AsReader, AsByteWriter, etc.). Document any new slot invariants in a Validate() method that constructors call.
For numeric types, see the more detailed guide in values/numeric_kind.go (12 items).
var EOFObject Value = eofType{}
EOFObject is the singleton EOF value.
var Void Value = voidType{}
Void is the singleton void value.
func ChannelSelect ¶
func ChannelSelect(cases []SelectCase) (idx int, val Value, ok bool)
ChannelSelect performs a select operation on multiple channels. Returns the index of the selected case and the received value (for receive cases). If a send case targets a channel that is closed concurrently, the select returns that case's index with ok=false instead of panicking.
func ForEach ¶
ForEach iterates over a Tuple value, calling fn for each element. If the value is not a Tuple, returns the value unchanged with no error. The callback receives the element index, whether more elements follow, and the element value. Returns the tail of the tuple (EmptyList for proper lists) and any error from the callback.
func NthCons ¶ added in v1.17.0
NthCons advances n cons cells along the cdr chain and returns the remaining list (or improper tail). It is the unified primitive behind list-ref (NthCons(...).Car()) and list-tail (NthCons(...)). Returns ErrIndexOutOfRange if n is negative or exceeds the list length.
At n=0 the input is returned unchanged, including for EmptyList — this matches R7RS semantics where (list-tail x 0) is x.
func Single ¶ added in v1.5.0
Single returns the sole element of a single-element Tuple, or false if the Tuple has zero or more than one element. This avoids ForEach and its closure allocation for the common case of 1-element rest-arg lists.
func StringOrFalse ¶ added in v1.10.7
StringOrFalse returns a Scheme string if s is non-empty, or #f if empty. Follows the BoolToBoolean precedent for eliminating repeated if/else patterns.
func UnconsTyped ¶ added in v1.17.0
UnconsTyped is Uncons followed by a type assertion on the head. On head-type mismatch, returns a wrapped headSentinel with the expected-type phrase read via werr.TypeNameOf.
func ValueOrVoid ¶ added in v1.17.0
ValueOrVoid returns v, or the singleton Void when v is nil. It collapses the repeated "nil accessor result -> Void" guard used by primitives whose Go accessor returns a nil Value for an unset slot (thread/mutex/condvar -specific, atomic-box load/swap). Follows the BoolToBoolean / StringOrFalse precedent for eliminating repeated if/else patterns.
type ValueType ¶ added in v1.10.3
type ValueType uint8
ValueType represents a Scheme type constraint for extension API contracts. Each constant maps to either a concrete Go type or an interface in the values package.
const ( TypeAny ValueType = iota // any Value TypeVoid // void singleton TypeBoolean // *Boolean TypeNumber // Number interface TypeComplex // ComplexNumber interface TypeReal // RealNumber interface TypeRational // *Rational TypeInteger // *Integer | *BigInteger (all Wile integers are exact) TypeFlonum // *Float | *BigFloat TypeString // *String TypeCharacter // *Character TypeSymbol // *Symbol TypeByte // *Byte TypePair // *Pair TypeList // Tuple interface TypeVector // *Vector TypeByteVector // *ByteVector TypeHashtable // *Hashtable TypeProcedure // Callable interface TypePort // *PortObject (Port marker interface) TypeInputPort // *PortObject with rdr slot non-nil TypeOutputPort // *PortObject with wrt slot non-nil TypeTextualInputPort // *PortObject with rr slot non-nil TypeTextualOutputPort // *PortObject with wr slot non-nil TypeBinaryInputPort // *PortObject with rb slot non-nil TypeBinaryOutputPort // *PortObject with wb slot non-nil TypeCount // sentinel — must be last )
func (ValueType) Check ¶ added in v1.10.3
Check tests whether v satisfies this type constraint. On success, returns the narrowed value and true. On failure, returns nil, false, and an error describing the mismatch.
func (ValueType) Description ¶ added in v1.10.3
Description returns a human-readable description of the type constraint.
type Vector ¶
type Vector []Value
Vector represents an R7RS vector, a fixed-size mutable array of values. Vectors are written as #(element ...) in Scheme syntax. Unlike lists, vectors provide O(1) access to elements by index.
func NewVector ¶
NewVector creates a new Vector from the given values. Returns an empty vector if no arguments are provided.
func NewVectorWithLength ¶
NewVectorWithLength creates a new Vector of the given length, with all elements initialized to the specified fill value.
func (*Vector) AsList ¶
AsList converts the vector to a proper list (linked list of pairs). Returns void (nil Pair) if the vector is void. Returns EmptyList if the vector is empty. Otherwise returns a newly constructed list containing the vector's elements.
func (*Vector) EqualTo ¶
EqualTo implements structural equality for vectors. Two vectors are equal if they have the same length and all corresponding elements are equal (using recursive EqualTo comparison). Returns false if the other value is not a Vector.
func (*Vector) IsVoid ¶
IsVoid returns true if the vector is a nil pointer. A nil vector represents the absence of a value, distinct from an empty vector.
func (*Vector) Length ¶
Length returns the number of elements in the vector. Returns 0 if the vector is void (nil pointer).
func (*Vector) SchemeString ¶
SchemeString returns the Scheme external representation of the vector. Format: #( element1 element2 ... ) with elements separated by spaces. Empty vectors are represented as #().
type WaitGroup ¶
type WaitGroup struct {
// contains filtered or unexported fields
}
WaitGroup wraps sync.WaitGroup for Scheme
func (*WaitGroup) SchemeString ¶
SchemeString returns the Scheme representation of the wait group.
type WriteMode ¶
type WriteMode int
WriteMode controls how the SchemeWriter handles shared structure.
R7RS §6.13.3 specifies three output procedures with different sharing semantics:
- write: datum labels only for circular references (WriteModeWrite)
- write-shared: datum labels for all shared references (WriteModeWriteShared)
- write-simple: no datum labels at all (handled separately via SchemeString)
Source Files
¶
- atomic.go
- big_complex.go
- big_float.go
- big_integer.go
- boolean.go
- box.go
- byte.go
- byte_vector.go
- channel.go
- char_set.go
- character.go
- compile_time_value.go
- complex.go
- condition_variable.go
- conversion.go
- debug.go
- doc.go
- empty_list.go
- float.go
- hash.go
- hashtable.go
- integer.go
- mutex.go
- native_error.go
- numeric_kind.go
- numeric_registry.go
- numeric_scratch.go
- numeric_tower.go
- once.go
- opaque_value.go
- pair.go
- pair_block.go
- port.go
- port_base.go
- port_constructors.go
- port_helpers.go
- process.go
- promise.go
- promotion.go
- rational.go
- record.go
- record_type.go
- rw_mutex.go
- scheme_writer.go
- scope.go
- source_context.go
- source_indexes.go
- string.go
- symbol.go
- symbols_accuracy.go
- syntax_base.go
- syntax_tuple.go
- syntax_value.go
- syntax_vector.go
- thread.go
- time.go
- utils.go
- validate_numeric_registry.go
- value_type.go
- values.go
- vector.go
- wait_group.go
Directories
¶
| Path | Synopsis |
|---|---|
|
Package valuestest provides test helpers for the values package.
|
Package valuestest provides test helpers for the values package. |