travtree.rig 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. -- Tree traverse examples
  2. -- They work with trees with arbitrary selectors.
  3. -- Values under selectors must bee numbers or trees.
  4. -- Rule #num calculates number of leaves ($n) in the tree.
  5. -- Rule #sum1 adds $n to each leaf. It actually constructs
  6. -- a new tree.
  7. -- Rule #sum2 does the same "at place".
  8. #main
  9. $tree:=<.A:1,B:5,C:<.a:2,b:7.>.>;
  10. PRINT $tree;
  11. $n:=#num($tree);
  12. PRINT $n;
  13. $tree1:=#sum1($n $tree);
  14. PRINT $tree;
  15. PRINT $tree1;
  16. #sum2($n $tree1);
  17. PRINT $tree1;
  18. #sum3($tree1);
  19. PRINT $tree1;
  20. ##
  21. #num
  22. <* $m:($N/$eq+:=1/ ! $eq+:=#num)*>/RETURN $eq/
  23. ##
  24. #sum1 $EQ
  25. <*$m:
  26. ($N /$tr++:=<.$m:$N+$EQ.>/
  27. -- $N in pattern accepts only numerical atom.
  28. -- $N+$EQ creates new numeric atom. $N does not
  29. -- change.
  30. !
  31. $a /$tr++:=<.$m:#sum1($EQ $a).>/)
  32. *>
  33. /RETURN $tr/
  34. ##
  35. #sum2 $EQ
  36. <*$m:($N/$N+:=$EQ
  37. -- This incremention is made "at place"
  38. / !
  39. $a /#sum2($EQ $a)/
  40. ) *>
  41. ##
  42. #sum3 <* $m : ($N / $N+:=LAST #main $n
  43. -- Similar to #sum2, but we dont pass $EQ each time,
  44. -- and simply take it from #main.
  45. / !
  46. #sum3
  47. ) *>
  48. ##