Linked-list: added support for operators '<<' and '>>'. Also fixed list insertion: ['x'] >> [1,2] must return [1,2,['x'], not [1,2,'x']; use $([]) to flat a list

This commit is contained in:
2026-05-22 06:46:04 +02:00
parent ac5c97bfd3
commit 4b2b573420
4 changed files with 48 additions and 31 deletions
+18 -20
View File
@@ -31,13 +31,11 @@ func newAppendTerm(tk *scan.Token) (inst *scan.Term) {
}
}
func prependToList(ctx kern.ExprContext, opTerm *scan.Term, leftValue, rightValue any) (result any, err error) {
func prependToList(opTerm *scan.Term, leftValue, rightValue any) (result any, err error) {
if list, ok := rightValue.(*kern.ListType); ok {
var it kern.Iterator
if it, ok = leftValue.(kern.Iterator); !ok {
if it, err = NewIterator(ctx, leftValue, nil); err != nil {
return
}
it = NewFormalIterator(leftValue)
}
ls := kern.NewLinkedList()
@@ -54,12 +52,13 @@ func prependToList(ctx kern.ExprContext, opTerm *scan.Term, leftValue, rightValu
newList = append(newList, item)
}
result = &newList
} else if list, ok := rightValue.(*kern.LinkedList); ok {
var it kern.Iterator
if it, ok = leftValue.(kern.Iterator); !ok {
it = NewFormalIterator(leftValue)
}
// ***** EVENTUALMENTE ABILITARE LA MODIFICA DELLA VARIABILE
// ***** CON UN OPERATORE SPECIFICO
// if opTerm.Children[1].Symbol() == scan.SymVariable {
// ctx.UnsafeSetVar(opTerm.Children[1].Source(), result)
// }
result = list.SeqPushBack(it)
} else {
err = opTerm.ErrIncompatibleTypes(leftValue, rightValue)
}
@@ -73,17 +72,15 @@ func evalPrepend(ctx kern.ExprContext, opTerm *scan.Term) (v any, err error) {
return
}
v, err = prependToList(ctx, opTerm, leftValue, rightValue)
v, err = prependToList(opTerm, leftValue, rightValue)
return
}
func appendToList(ctx kern.ExprContext, opTerm *scan.Term, leftValue, rightValue any) (result any, err error) {
func appendToList(opTerm *scan.Term, leftValue, rightValue any) (result any, err error) {
if list, ok := leftValue.(*kern.ListType); ok {
var it kern.Iterator
if it, ok = rightValue.(kern.Iterator); !ok {
if it, err = NewIterator(ctx, rightValue, nil); err != nil {
return
}
it = NewFormalIterator(rightValue)
}
ls := kern.NewLinkedList()
@@ -100,12 +97,13 @@ func appendToList(ctx kern.ExprContext, opTerm *scan.Term, leftValue, rightValue
newList = append(newList, node.Data())
}
result = &newList
} else if list, ok := leftValue.(*kern.LinkedList); ok {
var it kern.Iterator
if it, ok = rightValue.(kern.Iterator); !ok {
it = NewFormalIterator(rightValue)
}
// ***** EVENTUALMENTE ABILITARE LA MODIFICA DELLA VARIABILE
// ***** CON UN OPERATORE SPECIFICO
// if opTerm.Children[0].Symbol() == scan.SymVariable {
// ctx.UnsafeSetVar(opTerm.Children[0].Source(), result)
// }
result = list.SeqPushBack(it)
} else {
err = opTerm.ErrIncompatibleTypes(leftValue, rightValue)
}
@@ -119,7 +117,7 @@ func evalAppend(ctx kern.ExprContext, opTerm *scan.Term) (v any, err error) {
return
}
v, err = appendToList(ctx, opTerm, leftValue, rightValue)
v, err = appendToList(opTerm, leftValue, rightValue)
return
}