operator-fraction.go -- new data-type and operator fraction

This commit is contained in:
Celestino Amoroso 2024-05-01 09:48:09 +02:00
parent 4c83764332
commit cb3d8827fa

57
operator-fraction.go Normal file
View File

@ -0,0 +1,57 @@
// 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)
}