Imports #
"strconv"
"fmt"
"go/token"
"math"
"math/big"
"math/bits"
"strconv"
"strings"
"sync"
"unicode/utf8"
"strconv"
"fmt"
"go/token"
"math"
"math/big"
"math/bits"
"strconv"
"strings"
"sync"
"unicode/utf8"
non-numeric values
const Boolconst Complexconst Floatnumeric values
const Intconst Stringunknown values
const Unknown Kind = iotavar _Kind_index = [...]uint8{...}const _Kind_name = "UnknownBoolStringIntFloatComplex"const _log = *ast.BinaryExprCompute the size of a Word in bytes.
const _m = *ast.UnaryExprvar emptyString stringValvar floatVal0 = floatVal{...}Permit fractions with component sizes up to maxExp before switching to using floating-point numbers.
const maxExp = *ast.BinaryExprMaximum supported mantissa precision. The spec requires at least 256 bits; typical implementations use 512 bits.
const prec = 512const wordSize = *ast.BinaryExprKind specifies the kind of value represented by a [Value].
type Kind inttype boolVal booltype int64Val int64A Value represents the value of a Go constant.
type Value interface {
Kind() Kind
String() string
ExactString() string
implementsValue()
}type complexVal struct {
re Value
im Value
}type floatVal struct {
val *big.Float
}type intVal struct {
val *big.Int
}type ratVal struct {
val *big.Rat
}type stringVal struct {
mu sync.Mutex
s string
l *stringVal
r *stringVal
}type unknownVal struct {
}BinaryOp returns the result of the binary expression x op y. The operation must be defined for the operands. If one of the operands is [Unknown], the result is [Unknown]. BinaryOp doesn't handle comparisons or shifts; use [Compare] or [Shift] instead. To force integer division of [Int] operands, use op == [token.QUO_ASSIGN] instead of [token.QUO]; the result is guaranteed to be [Int] in this case. Division by zero leads to a run-time panic.
func BinaryOp(x_ Value, op token.Token, y_ Value) ValueBitLen returns the number of bits required to represent the absolute value x in binary representation; x must be an [Int] or an [Unknown]. If x is [Unknown], the result is 0.
func BitLen(x Value) intBoolVal returns the Go boolean value of x, which must be a [Bool] or an [Unknown]. If x is [Unknown], the result is false.
func BoolVal(x Value) boolBytes returns the bytes for the absolute value of x in little- endian binary representation; x must be an [Int].
func Bytes(x Value) []byteCompare returns the result of the comparison x op y. The comparison must be defined for the operands. If one of the operands is [Unknown], the result is false.
func Compare(x_ Value, op token.Token, y_ Value) boolDenom returns the denominator of x; x must be [Int], [Float], or [Unknown]. If x is [Unknown], or if it is too large or small to represent as a fraction, the result is [Unknown]. Otherwise the result is an [Int] >= 1.
func Denom(x Value) Valuefunc (x unknownVal) ExactString() stringfunc (x boolVal) ExactString() stringfunc (x complexVal) ExactString() stringfunc (x floatVal) ExactString() stringfunc (x ratVal) ExactString() stringfunc (x intVal) ExactString() stringfunc (x int64Val) ExactString() stringfunc (x *stringVal) ExactString() stringFloat32Val is like [Float64Val] but for float32 instead of float64.
func Float32Val(x Value) (float32, bool)Float64Val returns the nearest Go float64 value of x and whether the result is exact; x must be numeric or an [Unknown], but not [Complex]. For values too small (too close to 0) to represent as float64, [Float64Val] silently underflows to 0. The result sign always matches the sign of x, even for 0. If x is [Unknown], the result is (0, false).
func Float64Val(x Value) (float64, bool)Imag returns the imaginary part of x, which must be a numeric or unknown value. If x is [Unknown], the result is [Unknown].
func Imag(x Value) ValueInt64Val returns the Go int64 value of x and whether the result is exact; x must be an [Int] or an [Unknown]. If the result is not exact, its value is undefined. If x is [Unknown], the result is (0, false).
func Int64Val(x Value) (int64, bool)func (int64Val) Kind() Kindfunc (unknownVal) Kind() Kindfunc (boolVal) Kind() Kindfunc (*stringVal) Kind() Kindfunc (ratVal) Kind() Kindfunc (intVal) Kind() Kindfunc (complexVal) Kind() Kindfunc (floatVal) Kind() KindMake returns the [Value] for x. type of x result Kind ---------------------------- bool Bool string String int64 Int *big.Int Int *big.Float Float *big.Rat Float anything else Unknown
func Make(x any) ValueMakeBool returns the [Bool] value for b.
func MakeBool(b bool) ValueMakeFloat64 returns the [Float] value for x. If x is -0.0, the result is 0.0. If x is not finite, the result is an [Unknown].
func MakeFloat64(x float64) ValueMakeFromBytes returns the [Int] value given the bytes of its little-endian binary representation. An empty byte slice argument represents 0.
func MakeFromBytes(bytes []byte) ValueMakeFromLiteral returns the corresponding integer, floating-point, imaginary, character, or string value for a Go literal string. The tok value must be one of [token.INT], [token.FLOAT], [token.IMAG], [token.CHAR], or [token.STRING]. The final argument must be zero. If the literal string syntax is invalid, the result is an [Unknown].
func MakeFromLiteral(lit string, tok token.Token, zero uint) ValueMakeImag returns the [Complex] value x*i; x must be [Int], [Float], or [Unknown]. If x is [Unknown], the result is [Unknown].
func MakeImag(x Value) ValueMakeInt64 returns the [Int] value for x.
func MakeInt64(x int64) ValueMakeString returns the [String] value for s.
func MakeString(s string) ValueMakeUint64 returns the [Int] value for x.
func MakeUint64(x uint64) ValueMakeUnknown returns the [Unknown] value.
func MakeUnknown() ValueNum returns the numerator of x; x must be [Int], [Float], or [Unknown]. If x is [Unknown], or if it is too large or small to represent as a fraction, the result is [Unknown]. Otherwise the result is an [Int] with the same sign as x.
func Num(x Value) ValueReal returns the real part of x, which must be a numeric or unknown value. If x is [Unknown], the result is [Unknown].
func Real(x Value) ValueShift returns the result of the shift expression x op s with op == [token.SHL] or [token.SHR] (<< or >>). x must be an [Int] or an [Unknown]. If x is [Unknown], the result is x.
func Shift(x Value, op token.Token, s uint) ValueSign returns -1, 0, or 1 depending on whether x < 0, x == 0, or x > 0; x must be numeric or [Unknown]. For complex values x, the sign is 0 if x == 0, otherwise it is != 0. If x is [Unknown], the result is 1.
func Sign(x Value) intfunc (x boolVal) String() stringfunc (x complexVal) String() stringfunc (i Kind) String() stringfunc (unknownVal) String() stringString returns a possibly shortened quoted form of the String value.
func (x *stringVal) String() stringfunc (x int64Val) String() stringfunc (x intVal) String() stringfunc (x ratVal) String() stringString returns a decimal approximation of the Float value.
func (x floatVal) String() stringStringVal returns the Go string value of x, which must be a [String] or an [Unknown]. If x is [Unknown], the result is "".
func StringVal(x Value) stringToComplex converts x to a [Complex] value if x is representable as a [Complex]. Otherwise it returns an [Unknown].
func ToComplex(x Value) ValueToFloat converts x to a [Float] value if x is representable as a [Float]. Otherwise it returns an [Unknown].
func ToFloat(x Value) ValueToInt converts x to an [Int] value if x is representable as an [Int]. Otherwise it returns an [Unknown].
func ToInt(x Value) ValueUint64Val returns the Go uint64 value of x and whether the result is exact; x must be an [Int] or an [Unknown]. If the result is not exact, its value is undefined. If x is [Unknown], the result is (0, false).
func Uint64Val(x Value) (uint64, bool)UnaryOp returns the result of the unary expression op y. The operation must be defined for the operand. If prec > 0 it specifies the ^ (xor) result size in bits. If y is [Unknown], the result is [Unknown].
func UnaryOp(op token.Token, y Value, prec uint) ValueVal returns the underlying value for a given constant. Since it returns an interface, it is up to the caller to type assert the result to the expected type. The possible dynamic return types are: x Kind type of result ----------------------------------------- Bool bool String string Int int64 or *big.Int Float *big.Float or *big.Rat everything else nil
func Val(x Value) anyfunc _()func add(x Value, y Value) ValueappendReverse appends to list all of x's subpieces, but in reverse, and returns the result. Appending the reversal allows processing the right side in a recursive call and the left side in a loop. Because a chain like a + b + c + d + e is actually represented as ((((a + b) + c) + d) + e), the left-side loop avoids deep recursion. x must be locked.
func (x *stringVal) appendReverse(list []string) []stringfunc cmpZero(x int, op token.Token) boolfunc i64tof(x int64Val) floatValfunc i64toi(x int64Val) intValfunc i64tor(x int64Val) ratValfunc (complexVal) implementsValue()func (unknownVal) implementsValue()func (ratVal) implementsValue()func (intVal) implementsValue()func (*stringVal) implementsValue()func (int64Val) implementsValue()func (floatVal) implementsValue()func (boolVal) implementsValue()is32bit reports whether x can be represented using 32 bits.
func is32bit(x int64) boolis63bit reports whether x can be represented using 63 bits.
func is63bit(x int64) boolfunc itof(x intVal) floatValfunc itor(x intVal) ratValfunc makeComplex(re Value, im Value) Valuefunc makeFloat(x *big.Float) Valuefunc makeFloatFromLiteral(lit string) Valuefunc makeInt(x *big.Int) Valuefunc makeRat(x *big.Rat) Valuematch returns the matching representation (same type) with the smallest complexity for two values x and y. If one of them is numeric, both of them must be numeric. If one of them is Unknown or invalid (say, nil) both results are that value.
func match(x Value, y Value) (_ Value, _ Value)match0 must only be called by match. Invariant: ord(x) < ord(y)
func match0(x Value, y Value) (_ Value, _ Value)func mul(x Value, y Value) Valuefunc newFloat() *big.Floatfunc newInt() *big.Intfunc newRat() *big.Ratfunc ord(x Value) intfunc quo(x Value, y Value) Valuereverse reverses x in place and returns it.
func reverse(x []string) []stringfunc rtof(x ratVal) floatValsmallFloat reports whether x would lead to "reasonably"-sized fraction if converted to a *big.Rat.
func smallFloat(x *big.Float) boolsmallFloat64 reports whether x would lead to "reasonably"-sized fraction if converted to a *big.Rat.
func smallFloat64(x float64) boolsmallInt reports whether x would lead to "reasonably"-sized fraction if converted to a *big.Rat.
func smallInt(x *big.Int) boolstring constructs and returns the actual string literal value. If x represents an addition, then it rewrites x to be a single string, to speed future calls. This lazy construction avoids building different string values for all subpieces of a large concatenation. See golang.org/issue/23348.
func (x *stringVal) string() stringfunc sub(x Value, y Value) Valuefunc vtoc(x Value) complexValGenerated with Arrow