with.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package rules
  2. import (
  3. "fw/cp/node"
  4. "fw/rt2"
  5. "fw/rt2/frame"
  6. "fw/rt2/scope"
  7. )
  8. func withSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  9. n := rt2.NodeOf(f)
  10. rt2.RegOf(f)[0] = n.Left() //if
  11. rt2.Push(rt2.New(n.Left()), f)
  12. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  13. return rt2.ValueOf(f)[n.Left().Adr()] != nil, 60
  14. })
  15. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  16. last := rt2.RegOf(f)[0].(node.Node)
  17. done := scope.GoTypeFrom(rt2.ValueOf(f)[last.Adr()]).(bool)
  18. rt2.ValueOf(f)[last.Adr()] = nil
  19. if done && last.Right() != nil {
  20. rt2.Push(rt2.New(last.Right()), f)
  21. return frame.Tail(frame.STOP), frame.LATER
  22. } else if last.Right() == nil {
  23. return frame.End()
  24. } else if last.Link() != nil { //elsif
  25. rt2.RegOf(f)[0] = last.Link()
  26. rt2.Push(rt2.New(last.Link()), f)
  27. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  28. return rt2.ValueOf(f)[last.Link().Adr()] != nil, 61
  29. })
  30. return seq, frame.LATER
  31. } else if n.Right() != nil { //else
  32. rt2.Push(rt2.New(n.Right()), f)
  33. return frame.Tail(frame.STOP), frame.LATER
  34. } else if n.Right() == nil {
  35. return frame.End()
  36. } else if last == n.Right() {
  37. return frame.End()
  38. } else {
  39. panic("conditional sequence wrong")
  40. }
  41. }
  42. return seq, frame.LATER
  43. }