if.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package rules
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/rt2/frame"
  6. "fw/rt2/nodeframe"
  7. "reflect"
  8. )
  9. func ifExpr(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  10. var fu nodeframe.FrameUtils
  11. n := fu.NodeOf(f)
  12. switch n.Left().(type) {
  13. case node.OperationNode:
  14. fu.Push(fu.New(n.Left()), f)
  15. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  16. fu.DataOf(f.Parent())[n] = fu.DataOf(f)[n.Left()]
  17. return frame.End()
  18. }
  19. ret = frame.LATER
  20. default:
  21. panic(fmt.Sprintf("unknown condition expression", reflect.TypeOf(n.Left())))
  22. }
  23. return seq, ret
  24. }
  25. func ifSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  26. var fu nodeframe.FrameUtils
  27. n := fu.NodeOf(f)
  28. fu.DataOf(f)[0] = n.Left() //if
  29. fu.Push(fu.New(n.Left()), f)
  30. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  31. last := fu.DataOf(f)[0].(node.Node)
  32. done := fu.DataOf(f)[last].(bool)
  33. fu.DataOf(f)[last] = nil
  34. if done {
  35. fu.Push(fu.New(last.Right()), f)
  36. return frame.Tail(frame.STOP), frame.LATER
  37. } else if last.Link() != nil { //elsif
  38. fu.DataOf(f)[0] = last.Link()
  39. fu.Push(fu.New(last.Link()), f)
  40. return seq, frame.LATER
  41. } else if n.Right() != nil { //else
  42. fu.Push(fu.New(n.Right()), f)
  43. return frame.Tail(frame.STOP), frame.LATER
  44. } else if n.Right() == nil {
  45. return frame.End()
  46. } else if last == n.Right() {
  47. return frame.End()
  48. } else {
  49. panic("conditional sequence wrong")
  50. }
  51. }
  52. return seq, frame.LATER
  53. }