123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756 |
- package program
- import (
- "regexp"
- "math/big"
- "kumachan/standalone/ctn"
- "kumachan/interpreter/core"
- "kumachan/lang/source"
- "kumachan/lang/typsys"
- )
- type ExprBasedFunctionValue struct {
- InputArgs [] *Binding
- InputCtx [] *Binding
- Output *Expr
- }
- func (v *ExprBasedFunctionValue) Call(args ([] core.Object), ctx ([] core.Object), h core.RuntimeHandle) core.Object {
- var eval_ctx = CreateEvalContext(h)
- eval_ctx = eval_ctx.NewCtxBindAll(v.InputArgs, args)
- eval_ctx = eval_ctx.NewCtxBindAll(v.InputCtx, ctx)
- return eval_ctx.Eval(v.Output)
- }
- type Expr struct {
- Type typsys.CertainType
- Info ExprInfo
- Content ExprContent
- }
- type ExprInfo struct {
- Location source.Location
- }
- func ExprInfoFrom(loc source.Location) ExprInfo {
- return ExprInfo { Location: loc }
- }
- type ExprContent interface {
- Eval(ctx *EvalContext) core.Object
- }
- type EvalContext struct {
- bindingValues ctn.Map[uintptr, core.Object]
- runtimeHandle core.RuntimeHandle
- }
- func CreateEvalContext(h core.RuntimeHandle) *EvalContext {
- return &EvalContext {
- bindingValues: makeBindingValuesMap(),
- runtimeHandle: h,
- }
- }
- func makeBindingValuesMap() ctn.Map[uintptr, core.Object] {
- var cmp = ctn.DefaultCompare[uintptr]
- return ctn.MakeMap[uintptr, core.Object](cmp)
- }
- func (ctx *EvalContext) Eval(expr *Expr) core.Object {
- return expr.Content.Eval(ctx)
- }
- func (ctx *EvalContext) EvalAll(exprList ([] *Expr)) ([] core.Object) {
- var objects = make([] core.Object, len(exprList))
- for i := range exprList {
- objects[i] = ctx.Eval(exprList[i])
- }
- return objects
- }
- func (ctx *EvalContext) EvalAllAsList(exprList ([] *Expr)) core.List {
- var nodes = make([] core.ListNode, len(exprList))
- for i := range exprList {
- nodes[i].Value = ctx.Eval(exprList[i])
- }
- return core.NodesToList(nodes)
- }
- func (ctx *EvalContext) EvalBinding(binding *Binding) core.Object {
- var ptr = binding.PointerNumber()
- var obj, _ = ctx.bindingValues.Lookup(ptr)
- return obj
- }
- func (ctx *EvalContext) NewCtx() *EvalContext {
- return &EvalContext {
- bindingValues: makeBindingValuesMap(),
- runtimeHandle: ctx.runtimeHandle,
- }
- }
- func (ctx *EvalContext) NewCtxMatch(p PatternMatching, obj core.Object) *EvalContext {
- var m = ctx.bindingValues
- for _, item := range p {
- var v core.Object
- if item.Index1 == 0 {
- v = obj
- } else {
- var index = (item.Index1 - 1)
- var r = (*obj).(core.Record)
- v = r.Objects[index]
- }
- var k = item.Binding.PointerNumber()
- m = m.Inserted(k, v)
- }
- return &EvalContext {
- bindingValues: m,
- runtimeHandle: ctx.runtimeHandle,
- }
- }
- func (ctx *EvalContext) NewCtxUnbind(binding *Binding) *EvalContext {
- var m = ctx.bindingValues
- var ptr = binding.PointerNumber()
- _, m, _ = m.Deleted(ptr)
- return &EvalContext {
- bindingValues: m,
- runtimeHandle: ctx.runtimeHandle,
- }
- }
- func (ctx *EvalContext) NewCtxBind(binding *Binding, obj core.Object) *EvalContext {
- var m = ctx.bindingValues
- var ptr = binding.PointerNumber()
- m = m.Inserted(ptr, obj)
- return &EvalContext {
- bindingValues: m,
- runtimeHandle: ctx.runtimeHandle,
- }
- }
- func (ctx *EvalContext) NewCtxBindAll(bindings ([] *Binding), objects ([] core.Object)) *EvalContext {
- var m = ctx.bindingValues
- for i, b := range bindings {
- var ptr = b.PointerNumber()
- var obj = objects[i]
- m = m.Inserted(ptr, obj)
- }
- return &EvalContext {
- bindingValues: m,
- runtimeHandle: ctx.runtimeHandle,
- }
- }
- func (ctx *EvalContext) NewCtxCapture(bindings ([] *Binding)) *EvalContext {
- var new_ctx = ctx.NewCtx()
- var m = &(new_ctx.bindingValues)
- for _, b := range bindings {
- var ptr = b.PointerNumber()
- var obj, _ = ctx.bindingValues.Lookup(ptr)
- *m = m.Inserted(ptr, obj)
- }
- return new_ctx
- }
- type PatternMatching ([] PatternMatchingItem)
- type PatternMatchingItem struct {
- Binding *Binding
- Index1 int // 0 = whole, 1 = .0
- }
- type Wrapper struct {
- Inner *Expr
- }
- func (expr Wrapper) Eval(ctx *EvalContext) core.Object {
- return ctx.Eval(expr.Inner)
- }
- type CachedExpr struct {
- Expr *Expr
- Cache *ExprValueCache
- }
- type ExprValueCache struct {
- available bool
- value core.Object
- }
- func (expr CachedExpr) Eval(ctx *EvalContext) core.Object {
- if expr.Cache.available {
- return expr.Cache.value
- } else {
- var value = ctx.Eval(expr.Expr)
- expr.Cache.value = value
- expr.Cache.available = true
- return value
- }
- }
- func Cached(expr *Expr) *Expr {
- return &Expr {
- Type: expr.Type,
- Info: expr.Info,
- Content: CachedExpr {
- Expr: expr,
- Cache: new(ExprValueCache),
- },
- }
- }
- type FunRef struct {
- Function **Function
- Context [] *Expr
- Unpack bool
- }
- func (expr FunRef) Eval(ctx *EvalContext) core.Object {
- return core.FunctionToLambdaObject (
- (*expr.Function).value,
- expr.Unpack,
- ctx.EvalAll(expr.Context),
- ctx.runtimeHandle,
- )
- }
- type LocalRef struct {
- Binding *Binding
- }
- func (expr LocalRef) Eval(ctx *EvalContext) core.Object {
- return ctx.EvalBinding(expr.Binding)
- }
- type CallLambda struct {
- Callee *Expr
- Argument *Expr
- }
- func (expr CallLambda) Eval(ctx *EvalContext) core.Object {
- var callee = ctx.Eval(expr.Callee)
- var lambda = (*callee).(core.Lambda)
- var argument = ctx.Eval(expr.Argument)
- return lambda.Call(argument)
- }
- type CallFunction struct {
- Location source.Location
- Callee **Function
- Context [] *Expr
- Arguments [] *Expr
- }
- func (expr CallFunction) Eval(ctx *EvalContext) core.Object {
- var f = *(expr.Callee)
- var f_ctx = ctx.EvalAll(expr.Context)
- var args = ctx.EvalAll(expr.Arguments)
- var h = core.AddFrameInfo(ctx.runtimeHandle, f.name, expr.Location)
- return f.value.Call(args, f_ctx, h)
- }
- type Interface struct {
- ConcreteValue *Expr
- DispatchTable **DispatchTable
- }
- func (expr Interface) Eval(ctx *EvalContext) core.Object {
- return core.Obj(core.Interface {
- UnderlyingObject: ctx.Eval(expr.ConcreteValue),
- DispatchTable: (*expr.DispatchTable).value(),
- })
- }
- type InterfaceTransformUpward struct {
- Arg *Expr
- Path [] int
- }
- func (expr InterfaceTransformUpward) Eval(ctx *EvalContext) core.Object {
- var arg = ctx.Eval(expr.Arg)
- var I = (*arg).(core.Interface)
- var table = I.DispatchTable
- for _, index := range expr.Path {
- table = table.Children[index]
- }
- return core.Obj(core.Interface {
- UnderlyingObject: I.UnderlyingObject,
- DispatchTable: table,
- })
- }
- type InterfaceTransformDownward struct {
- Arg *Expr
- Depth int
- Target string
- }
- func (expr InterfaceTransformDownward) Eval(ctx *EvalContext) core.Object {
- var arg = ctx.Eval(expr.Arg)
- var I = (*arg).(core.Interface)
- var table = I.DispatchTable
- for i := 0; i < expr.Depth; i += 1 {
- table = table.Parent
- if table == nil {
- break
- }
- }
- if ((table != nil) && (table.Interface == expr.Target)) {
- return core.Just(core.Obj(core.Interface {
- UnderlyingObject: I.UnderlyingObject,
- DispatchTable: table,
- }))
- } else {
- return core.Nothing()
- }
- }
- type InterfaceFromSamValue struct {
- Value *Expr
- }
- func (expr InterfaceFromSamValue) Eval(ctx *EvalContext) core.Object {
- var value = ctx.Eval(expr.Value)
- return core.Obj(core.CraftSamInterface(value))
- }
- type Null struct {}
- func (expr Null) Eval(_ *EvalContext) core.Object {
- return nil
- }
- type Enum int
- func (expr Enum) Eval(_ *EvalContext) core.Object {
- var index = int(expr)
- return core.Obj(core.Enum(index))
- }
- type EnumToInt struct {
- EnumValue *Expr
- }
- func (expr EnumToInt) Eval(ctx *EvalContext) core.Object {
- var enum_obj = ctx.Eval(expr.EnumValue)
- var n = big.NewInt(int64(int((*enum_obj).(core.Enum))))
- return core.Obj(core.Int { Value: n })
- }
- type Union struct {
- Index int
- Value *Expr
- }
- func (expr Union) Eval(ctx *EvalContext) core.Object {
- return core.Obj(core.Union {
- Index: expr.Index,
- Object: ctx.Eval(expr.Value),
- })
- }
- type Record struct {
- Values [] *Expr
- }
- func (expr Record) Eval(ctx *EvalContext) core.Object {
- return core.Obj(core.Record {
- Objects: ctx.EvalAll(expr.Values),
- })
- }
- type FieldValue struct {
- Record *Expr
- Index int
- }
- func (expr FieldValue) Eval(ctx *EvalContext) core.Object {
- var obj = ctx.Eval(expr.Record)
- var record = (*obj).(core.Record)
- return record.Objects[expr.Index]
- }
- type ObservableFieldProjection struct {
- Base *Expr
- Index int
- }
- func (expr ObservableFieldProjection) Eval(ctx *EvalContext) core.Object {
- var index = expr.Index
- var base = ctx.Eval(expr.Base)
- var raw = core.GetObservable(base).Map(func(obj core.Object) core.Object {
- var record = (*obj).(core.Record)
- return record.Objects[index]
- })
- return core.Obj(raw.DistinctUntilObjectChanged())
- }
- type ConcreteMethodValue struct {
- Location source.Location
- This *Expr
- Path [] int
- Method **Function
- }
- func (expr ConcreteMethodValue) Eval(ctx *EvalContext) core.Object {
- var this = ctx.Eval(expr.This)
- if len(expr.Path) > 0 {
- var I = (*this).(core.Interface)
- var obj = I.UnderlyingObject
- var table = I.DispatchTable
- for _, index := range expr.Path {
- table = table.Children[index]
- }
- this = core.Obj(core.Interface {
- UnderlyingObject: obj,
- DispatchTable: table,
- })
- }
- var args = [] core.Object { this }
- var f = (*expr.Method)
- var h = core.AddFrameInfo(ctx.runtimeHandle, f.name, expr.Location)
- return f.value.Call(args, nil, h)
- }
- type AbstractMethodValue struct {
- Location source.Location
- Interface *Expr
- Path [] int
- Index int
- }
- func (expr AbstractMethodValue) Eval(ctx *EvalContext) core.Object {
- var interface_object = ctx.Eval(expr.Interface)
- var I = (*interface_object).(core.Interface)
- var this = I.UnderlyingObject
- var table = I.DispatchTable
- for _, index := range expr.Path {
- table = table.Children[index]
- }
- var f = *(table.Methods[expr.Index])
- var args = [] core.Object { this }
- var h = core.AddFrameInfo(ctx.runtimeHandle, "(dynamic)", expr.Location)
- return f.Call(args, nil, h)
- }
- type List struct {
- Items [] *Expr
- }
- func (expr List) Eval(ctx *EvalContext) core.Object {
- return core.Obj(ctx.EvalAllAsList(expr.Items))
- }
- type InteriorRef struct {
- Base *Expr
- Index int
- Table **DispatchTable // optional, used in dynamic cast
- Kind InteriorRefKind
- Operand InteriorRefOperand
- }
- type InteriorRefKind int
- const (
- RK_RecordField InteriorRefKind = iota
- RK_EnumItem
- RK_UnionItem
- RK_DynamicCast
- )
- type InteriorRefOperand int
- const (
- RO_Direct InteriorRefOperand = iota
- RO_Lens1
- RO_Lens2
- )
- func (expr InteriorRef) Eval(ctx *EvalContext) core.Object {
- var base = expr.Base.Content.Eval(ctx)
- switch expr.Kind {
- case RK_RecordField:
- i := expr.Index
- switch expr.Operand {
- case RO_Direct: return core.Lens1FromRecord(base, i)
- case RO_Lens1: return core.Lens1FromRecordLens1(base, i)
- }
- case RK_EnumItem:
- i := expr.Index
- switch expr.Operand {
- case RO_Direct: return core.Lens2FromEnum(base, i)
- case RO_Lens1: return core.Lens2FromEnumLens1(base, i)
- case RO_Lens2: return core.Lens2FromEnumLens2(base, i)
- }
- case RK_UnionItem:
- i := expr.Index
- switch expr.Operand {
- case RO_Direct: return core.Lens2FromUnion(base, i)
- case RO_Lens1: return core.Lens2FromUnionLens1(base, i)
- case RO_Lens2: return core.Lens2FromUnionLens2(base, i)
- }
- case RK_DynamicCast:
- t := (*expr.Table).value()
- switch expr.Operand {
- case RO_Direct: return core.Lens2FromInterface(base, t)
- case RO_Lens1: return core.Lens2FromInterfaceLens1(base, t)
- case RO_Lens2: return core.Lens2FromInterfaceLens2(base, t)
- }
- }
- panic("something went wrong")
- }
- type IntLiteral struct {
- Value *big.Int
- }
- func (expr IntLiteral) Eval(_ *EvalContext) core.Object {
- return core.Obj(core.Int { Value: expr.Value })
- }
- type CharLiteral struct {
- Value rune
- }
- func (expr CharLiteral) Eval(_ *EvalContext) core.Object {
- return core.Obj(core.Char(expr.Value))
- }
- type FloatLiteral struct {
- Value float64
- }
- func (expr FloatLiteral) Eval(_ *EvalContext) core.Object {
- return core.Obj(core.Float(expr.Value))
- }
- type BytesLiteral struct {
- Value [] byte
- }
- func (expr BytesLiteral) Eval(_ *EvalContext) core.Object {
- return core.Obj(core.Bytes(expr.Value))
- }
- type StringLiteral struct {
- Value string
- }
- func (expr StringLiteral) Eval(_ *EvalContext) core.Object {
- return core.Obj(core.String(expr.Value))
- }
- type RegexpLiteral struct {
- Value *regexp.Regexp
- }
- func (expr RegexpLiteral) Eval(_ *EvalContext) core.Object {
- return core.Obj(core.RegExp { Value: expr.Value })
- }
- type Lambda struct {
- Ctx [] *Binding
- In PatternMatching
- Out *Expr
- Self *Binding
- }
- func (expr Lambda) Eval(ctx *EvalContext) core.Object {
- var capture = ctx.NewCtxCapture(expr.Ctx)
- var input_pattern = expr.In
- var output_expr = expr.Out
- var lambda = core.Obj(core.Lambda { Call: func(arg core.Object) core.Object {
- var inner = capture.NewCtxMatch(input_pattern, arg)
- return inner.Eval(output_expr)
- }})
- if expr.Self != nil {
- capture = capture.NewCtxBind(expr.Self, lambda)
- }
- return lambda
- }
- type Let struct {
- In PatternMatching
- Arg *Expr
- Out *Expr
- }
- func (expr Let) Eval(ctx *EvalContext) core.Object {
- var arg = ctx.Eval(expr.Arg)
- var inner = ctx.NewCtxMatch(expr.In, arg)
- return inner.Eval(expr.Out)
- }
- type If struct {
- Branches [] IfBranch
- }
- type IfBranch struct {
- Conds [] Cond
- Value *Expr
- }
- type Cond struct {
- Kind CondKind
- Match PatternMatching
- Value *Expr
- }
- type CondKind int
- const (
- CK_Bool CondKind = iota
- CK_Maybe
- CK_Lens2
- )
- func (expr If) Eval(ctx *EvalContext) core.Object {
- for _, branch := range expr.Branches {
- var branch_ctx = ctx
- var branch_ok = true
- for _, cond := range branch.Conds {
- var v = branch_ctx.Eval(cond.Value)
- switch cond.Kind {
- case CK_Bool:
- if core.GetBool(v) {
- continue
- }
- case CK_Maybe:
- if v, ok := core.UnwrapMaybe(v); ok {
- branch_ctx = branch_ctx.NewCtxMatch(cond.Match, v)
- continue
- }
- case CK_Lens2:
- if v, ok := core.UnwrapLens2(v); ok {
- branch_ctx = branch_ctx.NewCtxMatch(cond.Match, v)
- continue
- }
- default:
- panic("impossible branch")
- }
- branch_ok = false
- break
- }
- if branch_ok {
- return branch_ctx.Eval(branch.Value)
- }
- }
- panic("bad if expression")
- }
- type When struct {
- Operand WhenOperand
- Branches [] *WhenBranch
- }
- type WhenBranch struct {
- Match PatternMatching
- Value *Expr
- }
- type WhenOperand struct {
- Kind UnionOrEnum
- Value *Expr
- }
- type UnionOrEnum int
- const (
- UE_Union UnionOrEnum = iota
- UE_Enum
- )
- func (expr When) Eval(ctx *EvalContext) core.Object {
- switch expr.Operand.Kind {
- case UE_Union:
- var operand = ctx.Eval(expr.Operand.Value)
- var u = (*operand).(core.Union)
- var branch = expr.Branches[u.Index]
- var inner = ctx.NewCtxMatch(branch.Match, u.Object)
- return inner.Eval(branch.Value)
- case UE_Enum:
- var operand = ctx.Eval(expr.Operand.Value)
- var index = int((*operand).(core.Enum))
- var branch = expr.Branches[index]
- return ctx.Eval(branch.Value)
- default:
- panic("impossible branch")
- }
- }
- type EachValue struct {
- Kind UnionOrEnum
- Index int
- Match PatternMatching
- Value *Expr
- }
- func (expr EachValue) Eval(ctx *EvalContext) core.Object {
- switch expr.Kind {
- case UE_Union:
- var index = expr.Index
- var conv = core.Obj(core.Lambda { Call: func(arg core.Object) core.Object {
- return core.Obj(core.Union {
- Index: index,
- Object: arg,
- })
- }})
- var inner = ctx.NewCtxMatch(expr.Match, conv)
- return inner.Eval(expr.Value)
- case UE_Enum:
- var index = expr.Index
- var enum_obj = core.Obj(core.Enum(index))
- var inner = ctx.NewCtxMatch(expr.Match, enum_obj)
- return inner.Eval(expr.Value)
- default:
- panic("impossible branch")
- }
- }
- type ObservableRecord struct {
- Record Record
- }
- type ObservableMaybeRecord struct {
- Record Record
- }
- func (expr ObservableRecord) Eval(ctx *EvalContext) core.Object {
- var values = ctx.EvalAll(expr.Record.Values)
- var observables = ctn.MapEach(values, core.GetObservable)
- return core.Obj(core.CombineLatest(observables...).Map(func(combined core.Object) core.Object {
- var objects = make([] core.Object, len(values))
- core.GetList(combined).ForEachWithIndex(func(i int, obj core.Object) {
- objects[i] = obj
- })
- return core.Obj(core.Record { Objects: objects })
- }))
- }
- func (expr ObservableMaybeRecord) Eval(ctx *EvalContext) core.Object {
- var combined = (ObservableRecord { expr.Record }).Eval(ctx)
- return core.Obj(core.GetObservable(combined).Map(func(obj core.Object) core.Object {
- var r = (*obj).(core.Record)
- var unwrapped = make([] core.Object, len(r.Objects))
- for i := range r.Objects {
- if inner, ok := core.UnwrapMaybe(r.Objects[i]); ok {
- unwrapped[i] = inner
- } else {
- return core.Nothing()
- }
- }
- return core.Just(core.Obj(core.Record { Objects: unwrapped }))
- }))
- }
- type ObservableRecordDefault struct {
- Content ExprContent
- }
- type ObservableMaybeRecordDefault struct {
- Content ExprContent
- }
- func (expr ObservableRecordDefault) Eval(ctx *EvalContext) core.Object {
- var v = expr.Content.Eval(ctx)
- return core.Obj(core.ObservableSyncValue(v))
- }
- func (expr ObservableMaybeRecordDefault) Eval(ctx *EvalContext) core.Object {
- var v = expr.Content.Eval(ctx)
- return core.Obj(core.ObservableSyncValue(core.Just(v)))
- }
- type HookRecord struct {
- Record Record
- }
- func (expr HookRecord) Eval(ctx *EvalContext) core.Object {
- var values = ctx.EvalAll(expr.Record.Values)
- var jobs = ctn.MapEach(values, func(v core.Object) core.Observable {
- return core.FromObject[core.Hook](v).Job
- })
- var result = core.ObservableSyncValue(core.Obj(core.EmptyList()))
- var L = len(jobs)
- for i := (L-1); i >= 0; i -= 1 {
- result = (func(current core.Observable, next core.Observable) core.Observable {
- return current.AwaitNoexcept(ctx.runtimeHandle, func(head core.Object) core.Observable {
- return next.AwaitNoexcept(ctx.runtimeHandle, func(tail_obj core.Object) core.Observable {
- var tail = core.GetList(tail_obj)
- var list = core.Cons(head, tail)
- return core.ObservableSyncValue(core.Obj(list))
- })})
- })(jobs[i], result)
- }
- { var result = result.Map(func(obj core.Object) core.Object {
- var list = core.GetList(obj)
- var objects = make([] core.Object, list.Length())
- list.ForEachWithIndex(func(i int, object core.Object) {
- objects[i] = object
- })
- return core.Obj(core.Record { Objects: objects })
- })
- return core.ToObject(core.Hook { Job: result }) }
- }
- type HookRecordDefault struct {
- Content ExprContent
- }
- func (expr HookRecordDefault) Eval(ctx *EvalContext) core.Object {
- var v = expr.Content.Eval(ctx)
- var o = core.ObservableSyncValue(v)
- return core.ToObject(core.Hook { Job: o })
- }
- type ReflectType struct {
- Type ReflectType_
- }
- func (expr ReflectType) Eval(_ *EvalContext) core.Object {
- var t = core.ReflectType(expr.Type)
- return core.Obj(t)
- }
- type ReflectValue struct {
- Type ReflectType_
- Value *Expr
- }
- func (expr ReflectValue) Eval(ctx *EvalContext) core.Object {
- var t = core.ReflectType(expr.Type)
- var v = ctx.Eval(expr.Value)
- return core.Obj(core.AssumeValidReflectValue(t, v))
- }
|