// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. // operator-sign.go package expr import ( "git.portale-stac.it/go-pkg/expr/kern" "git.portale-stac.it/go-pkg/expr/scan" ) //-------- plus sign term func newPlusSignTerm(tk *scan.Token) (inst *scan.Term) { return &scan.Term{ Tk: *tk, Children: make([]*scan.Term, 0, 1), Position: scan.PosPrefix, Priority: scan.PriSign, EvalFunc: evalSign, } } func newMinusSignTerm(tk *scan.Token) (inst *scan.Term) { return &scan.Term{ Tk: *tk, Children: make([]*scan.Term, 0, 1), Position: scan.PosPrefix, Priority: scan.PriSign, EvalFunc: evalSign, } } func evalSign(ctx kern.ExprContext, opTerm *scan.Term) (v any, err error) { var rightValue any if rightValue, err = opTerm.EvalPrefix(ctx); err != nil { return } if kern.IsFloat(rightValue) { if opTerm.Tk.Sym == scan.SymChangeSign { f, _ := rightValue.(float64) v = -f } else { v = rightValue } } else if kern.IsInteger(rightValue) { if opTerm.Tk.Sym == scan.SymChangeSign { i, _ := rightValue.(int64) v = -i } else { v = rightValue } } else { err = opTerm.ErrIncompatiblePrefixPostfixType(rightValue) } return } // init func init() { scan.RegisterTermConstructor(scan.SymUnchangeSign, newPlusSignTerm) scan.RegisterTermConstructor(scan.SymChangeSign, newMinusSignTerm) }