if.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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 && last.Right() != nil {
  35. fu.Push(fu.New(last.Right()), f)
  36. return frame.Tail(frame.STOP), frame.LATER
  37. } else if last.Right() == nil {
  38. return frame.End()
  39. } else if last.Link() != nil { //elsif
  40. fu.DataOf(f)[0] = last.Link()
  41. fu.Push(fu.New(last.Link()), f)
  42. return seq, frame.LATER
  43. } else if n.Right() != nil { //else
  44. fu.Push(fu.New(n.Right()), f)
  45. return frame.Tail(frame.STOP), frame.LATER
  46. } else if n.Right() == nil {
  47. return frame.End()
  48. } else if last == n.Right() {
  49. return frame.End()
  50. } else {
  51. panic("conditional sequence wrong")
  52. }
  53. }
  54. return seq, frame.LATER
  55. }