return.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package rules
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/rt2/context"
  6. "fw/rt2/frame"
  7. "fw/rt2/nodeframe"
  8. "fw/rt2/scope"
  9. "reflect"
  10. )
  11. func returnSeq(f frame.Frame) (frame.Sequence, frame.WAIT) {
  12. var fu nodeframe.FrameUtils
  13. a := fu.NodeOf(f)
  14. left := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  15. switch a.Left().(type) {
  16. case node.ConstantNode:
  17. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  18. fu.DataOf(f.Parent())[a.Object()] = a.Left().(node.ConstantNode).Data()
  19. return frame.End()
  20. }
  21. ret = frame.NOW
  22. case node.VariableNode:
  23. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  24. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  25. fu.DataOf(f.Parent())[a.Object()] = sc.Select(a.Left().Object())
  26. return frame.End()
  27. }
  28. ret = frame.NOW
  29. case node.OperationNode, node.CallNode:
  30. fu.Push(fu.New(a.Left()), f)
  31. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  32. fu.DataOf(f.Parent())[a.Object()] = fu.DataOf(f)[a.Left()]
  33. return frame.End()
  34. }
  35. ret = frame.LATER
  36. default:
  37. fmt.Println(reflect.TypeOf(a.Left()))
  38. panic("wrong right")
  39. }
  40. return seq, ret
  41. }
  42. return left, frame.NOW
  43. }