Explorar el Código

подошел к алфавитной сортировке строк

kpmy hace 10 años
padre
commit
ec65f8368c
Se han modificado 4 ficheros con 54 adiciones y 11 borrados
  1. BIN
      code/XevTestStrings.oz
  2. 29 10
      rt2/rules/deref.go
  3. 17 1
      rt2/scope/modern/ms.go
  4. 8 0
      rt2/scope/modern/val.go

BIN
code/XevTestStrings.oz


+ 29 - 10
rt2/rules/deref.go

@@ -35,19 +35,24 @@ func derefSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 			halt.As(100, l.Adr(), reflect.TypeOf(l))
 		}
 	} else {
+		deref := func(val scope.Value) {
+			t, c := scope.Ops.TypeOf(val)
+			switch cc := c.(type) {
+			case object.ArrayType:
+				rt2.ValueOf(f.Parent())[n.Adr()] = scope.TypeFromGo(scope.GoTypeFrom(val))
+			case object.DynArrayType:
+				rt2.ValueOf(f.Parent())[n.Adr()] = scope.TypeFromGo(scope.GoTypeFrom(val))
+			//case nil:
+			//	panic(0)
+			default:
+				halt.As(100, t, reflect.TypeOf(cc))
+			}
+		}
 		if n.Left().Object() != nil {
 			switch l := n.Left().Object().(type) {
 			case object.ParameterObject, object.VariableObject:
 				val := sc.Select(l.Adr())
-				_, c := scope.Ops.TypeOf(val)
-				switch cc := c.(type) {
-				case object.ArrayType:
-					rt2.ValueOf(f.Parent())[n.Adr()] = scope.TypeFromGo(scope.GoTypeFrom(val))
-				case object.DynArrayType:
-					rt2.ValueOf(f.Parent())[n.Adr()] = scope.TypeFromGo(scope.GoTypeFrom(val))
-				default:
-					halt.As(100, reflect.TypeOf(cc))
-				}
+				deref(val)
 				return frame.End()
 			default:
 				halt.As(100, l.Adr(), reflect.TypeOf(l))
@@ -60,7 +65,21 @@ func derefSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
 					return rt2.ValueOf(f)[left.Adr()] != nil, 60
 				})
 				seq = Propose(func(...IN) OUT {
-					rt2.ValueOf(f.Parent())[n.Adr()] = rt2.ValueOf(f)[left.Adr()]
+					deref(rt2.ValueOf(f)[left.Adr()])
+					return End()
+				})
+				ret = LATER.wait()
+			case node.IndexNode:
+				rt2.Push(rt2.New(left), f)
+				rt2.Assert(f, func(f frame.Frame) (bool, int) {
+					return rt2.ValueOf(f)[left.Adr()] != nil, 60
+				})
+				seq = Propose(func(...IN) OUT {
+					val := rt2.ValueOf(f)[left.Adr()]
+					arr := sc.Select(left.Left().Object().Adr()).(scope.Array)
+					deref(arr.Get(val).(scope.Pointer).Get())
+					//rt2.ValueOf(f.Parent())[n.Adr()] = rt2.ValueOf(f)[left.Adr()]
+					//halt.As(100, reflect.TypeOf(rt2.ValueOf(f)[left.Adr()]))
 					return End()
 				})
 				ret = LATER.wait()

+ 17 - 1
rt2/scope/modern/ms.go

@@ -254,16 +254,32 @@ func (a *salloc) Initialize(n node.Node, par scope.PARAM) (seq frame.Sequence, r
 			case node.FieldNode, node.DerefNode:
 				nf := rt2.New(nv)
 				rt2.Push(nf, f)
+				rt2.ReplaceDomain(nf, global)
 				rt2.Assert(f, func(f frame.Frame) (bool, int) {
 					return rt2.ValueOf(f)[nv.Adr()] != nil, 60
 				})
-				rt2.ReplaceDomain(nf, global)
 				seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
 					v := rt2.ValueOf(f)[nv.Adr()]
 					l.v[l.k[o.Adr()]].Set(v)
 					return end, frame.NOW
 				}
 				ret = frame.LATER
+			case node.IndexNode:
+				nf := rt2.New(nv)
+				rt2.Push(nf, f)
+				rt2.ReplaceDomain(nf, global)
+				rt2.Assert(f, func(f frame.Frame) (bool, int) {
+					return rt2.ValueOf(f)[nv.Adr()] != nil, 64
+				})
+				seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
+					sc := global.Discover(context.SCOPE).(scope.Manager)
+					left := rt2.ValueOf(f)[nv.Adr()]
+					arr := sc.Select(nv.Left().Object().Adr()).(scope.Array)
+					v := arr.Get(left)
+					l.v[l.k[o.Adr()]].Set(v)
+					return end, frame.NOW
+				}
+				ret = frame.LATER
 			default:
 				halt.As(40, reflect.TypeOf(nv))
 			}

+ 8 - 0
rt2/scope/modern/val.go

@@ -112,10 +112,14 @@ func (a *arr) Set(v scope.Value) {
 
 func (a *dynarr) Set(v scope.Value) {
 	switch x := v.(type) {
+	case *data:
+		a.Set(vfrom(x))
 	case *arr:
 		a.val = x.val
 	case *dynarr:
 		a.val = x.val
+	case *idx:
+		a.Set(x.Get())
 	case STRING:
 		z := []rune(string(x))
 		v := make([]interface{}, len(z))
@@ -218,6 +222,8 @@ func (i *idx) Set(v scope.Value) {
 func (i *idx) Get() scope.Value {
 	x := i.arr.val[i.idx]
 	switch z := x.(type) {
+	case *arr:
+		return z
 	case CHAR:
 		return z
 	case nil:
@@ -1545,6 +1551,8 @@ func (o *ops) TypeOf(x scope.Value) (object.Type, object.ComplexType) {
 		return v.link.Type(), v.link.Complex()
 	case *arr:
 		return v.link.Type(), v.link.Complex()
+	case *data:
+		return v.link.Type(), v.link.Complex()
 	default:
 		halt.As(100, reflect.TypeOf(v))
 	}