// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserightChilded. // operator-assign.go package expr //-------- assign term func newAssignTerm(tk *Token) (inst *term) { return &term{ tk: *tk, children: make([]*term, 0, 2), position: posInfix, priority: priAssign, evalFunc: evalAssign, } } func evalAssign(ctx ExprContext, self *term) (v any, err error) { if err = self.checkOperands(); err != nil { return } leftTerm := self.children[0] if leftTerm.tk.Sym != SymVariable { err = leftTerm.tk.Errorf("left operand of %q must be a variable", self.tk.source) return } rightChild := self.children[1] if v, err = rightChild.compute(ctx); err == nil { if functor, ok := v.(Functor); ok { funcName := rightChild.source() if info, exists, _ := GetFuncInfo(ctx, funcName); exists { // ctx.RegisterFuncInfo(info) ctx.RegisterFunc(leftTerm.source(), info.Functor(), info.ReturnType(), info.Params()) } else if funcDef, ok := functor.(*exprFunctor); ok { paramSpecs := ForAll(funcDef.params, newFuncParam) // paramCount := len(funcDef.params) // paramSpecs := make([]ExprFuncParam, paramCount) // for i := range paramSpecs { // paramSpecs[i] = newFuncParam(funcDef.params[i]) // } ctx.RegisterFunc(leftTerm.source(), functor, typeAny, paramSpecs) } else { err = self.Errorf("unknown function %s()", funcName) } } else { ctx.UnsafeSetVar(leftTerm.source(), v) } } return } // init func init() { registerTermConstructor(SymEqual, newAssignTerm) }