expr/operator-insert.go

92 lines
2.0 KiB
Go
Raw Normal View History

2024-04-16 03:54:50 +02:00
// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.
// operator-insert.go
package expr
//-------- prepend term
2024-04-16 03:54:50 +02:00
func newPrependTerm(tk *Token) (inst *term) {
2024-04-16 03:54:50 +02:00
return &term{
tk: *tk,
children: make([]*term, 0, 2),
position: posInfix,
priority: priInsert,
evalFunc: evalPrepend,
2024-04-16 03:54:50 +02:00
}
}
func newAppendTerm(tk *Token) (inst *term) {
return &term{
tk: *tk,
children: make([]*term, 0, 2),
position: posInfix,
priority: priInsert,
2024-04-16 03:54:50 +02:00
evalFunc: evalAppend,
}
}
func evalPrepend(ctx ExprContext, opTerm *term) (v any, err error) {
2024-04-16 03:54:50 +02:00
var leftValue, rightValue any
2024-07-09 07:50:06 +02:00
if leftValue, rightValue, err = opTerm.evalInfix(ctx); err != nil {
2024-04-16 03:54:50 +02:00
return
}
if IsList(rightValue) {
list, _ := rightValue.(*ListType)
newList := append(ListType{leftValue}, *list...)
v = &newList
2024-07-09 07:50:06 +02:00
if opTerm.children[1].symbol() == SymVariable {
ctx.UnsafeSetVar(opTerm.children[1].source(), v)
}
2024-04-16 03:54:50 +02:00
} else {
2024-07-09 07:50:06 +02:00
err = opTerm.errIncompatibleTypes(leftValue, rightValue)
2024-04-16 03:54:50 +02:00
}
return
}
2024-07-09 07:50:06 +02:00
func evalAppend(ctx ExprContext, opTerm *term) (v any, err error) {
2024-04-16 03:54:50 +02:00
var leftValue, rightValue any
2024-07-09 07:50:06 +02:00
if leftValue, rightValue, err = opTerm.evalInfix(ctx); err != nil {
2024-04-16 03:54:50 +02:00
return
}
if IsList(leftValue) {
list, _ := leftValue.(*ListType)
newList := append(*list, rightValue)
v = &newList
2024-07-09 07:50:06 +02:00
if opTerm.children[0].symbol() == SymVariable {
ctx.UnsafeSetVar(opTerm.children[0].source(), v)
}
2024-04-16 03:54:50 +02:00
} else {
2024-07-09 07:50:06 +02:00
err = opTerm.errIncompatibleTypes(leftValue, rightValue)
2024-04-16 03:54:50 +02:00
}
return
}
// func evalAssignAppend(ctx ExprContext, self *term) (v any, err error) {
// var leftValue, rightValue any
// if leftValue, rightValue, err = self.evalInfix(ctx); err != nil {
// return
// }
// if IsList(leftValue) {
// list, _ := leftValue.(*ListType)
// newList := append(*list, rightValue)
// v = &newList
// if
// } else {
// err = self.errIncompatibleTypes(leftValue, rightValue)
// }
// return
// }
2024-04-16 03:54:50 +02:00
// init
func init() {
registerTermConstructor(SymPlusGreater, newPrependTerm)
registerTermConstructor(SymLessPlus, newAppendTerm)
2024-04-16 03:54:50 +02:00
}