// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. // operand-fraction.go package expr import ( "fmt" "strings" ) type fraction struct { num, den int64 } func (f *fraction) ToString(opt FmtOpt) string { var sb strings.Builder sb.WriteString(fmt.Sprintf("%d|%d", f.num, f.den)) return sb.String() } // -------- fraction term func newFractionTerm(tk *Token) *term { return &term{ tk: *tk, parent: nil, children: make([]*term, 0, 2), position: posInfix, priority: priFraction, evalFunc: evalFraction, } } // -------- eval func func evalFraction(ctx ExprContext, self *term) (v any, err error) { var numValue, denValue any var num, den int64 var ok bool if numValue, denValue, err = self.evalInfix(ctx); err != nil { return } if num, ok = numValue.(int64); !ok { err = fmt.Errorf("numerator must be integer, got %T (%v)", numValue, numValue) } if den, ok = denValue.(int64); !ok { err = fmt.Errorf("denominator must be integer, got %T (%v)", denValue, denValue) } v = &fraction{num, den} return } // init func init() { registerTermConstructor(SymVertBar, newFractionTerm) }