home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / fpc / tutor / l3p050 < prev    next >
Text File  |  1990-07-15  |  4KB  |  118 lines

  1.        ╔════════════════════════════════════════════════════╗
  2.        ║ Lesson 3 Part 050  F-PC 3.5 Tutorial by Jack Brown ║
  3.        ╚════════════════════════════════════════════════════╝
  4.  
  5.               ┌────────────────────────────┐
  6.               │   Interval Testing Words   │
  7.               └────────────────────────────┘
  8.  
  9. We continue our discussion of flags and conditionals with some of my
  10. favorite words. Interval testing words. Naming convention motivated by
  11. the mathematical intervals (a,b)  a < x < b , [a,b]  a <= x <= b (a,b]
  12. a < x <= b and [a,b)  a <= x < b.
  13.  
  14. \ (IN)  leaves a true flag if   a < x < b
  15. : (IN)  ( x a b --  flag )  ( JWB 28 09 88 )
  16. \ Remove the comment from the line below for run time error checking.
  17. \        2DUP < NOT ABORT" Invalid interval."
  18.          -ROT OVER < -ROT > AND ;
  19.  
  20. \ [IN]  leaves a true flag if a <= x <= b  , otherwise false.
  21. : [IN]  ( x a b --  flag ) 1+ SWAP 1- SWAP (IN) ;
  22.  
  23. \ (IN]  leaves a true flag if a <  x <= b  , otherwise false.
  24. : (IN]  ( x a b --  flag ) 1+ (IN) ;
  25.  
  26. \ [IN)  leaves a true flag if a <= x <  b  , otherwise false.
  27. : [IN)  ( x a b --  flag ) SWAP 1- SWAP (IN) ;
  28.  
  29. Here are the results of throughly testing [IN]
  30. 2 3 5 [IN] . <enter>  0  ok     \ False because 2 is not in [3,5]
  31. 3 3 5 [IN] . <enter> -1  ok     \ True  because 3 is     in [3,5]
  32. 4 3 5 [IN] . <enter> -1  ok     \ True  because 4 is     in [3,5]
  33. 5 3 5 [IN] . <enter> -1  ok     \ True  because 5 is     in [3,5]
  34. 6 3 5 [IN] . <enter>  0  ok     \ False because 6 is not in [3,5]
  35.  
  36. ╓──────────────╖
  37. ║ Problem 3.10 ║
  38. ╙──────────────╜
  39. Construct test data to verify the operation of (IN] (IN) and [IN).
  40. For an interval to be valid we must have a < b.  What happens when the
  41. interval testing words are used with invalid intervals?  Modify the
  42. definition of (IN) as suggested and try using an invalid interval.
  43.  
  44. ╓──────────────╖
  45. ║ Problem 3.11 ║
  46. ╙──────────────╜
  47. Write definitions of [IN] (IN] and [IN) that do not use (IN) or
  48. each other!
  49.  
  50. Using Forth's Conditional Programming Structures.
  51.  
  52.    IF ... THEN    and    IF ...  ELSE ... THEN
  53.  
  54. CONDITIONAL STRUCTURES CAN ONLY BE USED WITHIN A COLON DEFINITIONS.
  55.  
  56.   <condition>  IF    <do this part only if condition is true>
  57.                THEN  <continue here>
  58.  
  59.   <condition>  IF    <do this part only if condition is true>
  60.                ELSE  <do this part only if condition is false>
  61.                THEN  <continue here>
  62.  
  63. The best way to learn about these is to study some simple programs.
  64. Here is a word that will test the top stack number to determine whether
  65. or not it is odd or even.  A message is printed to announce the result
  66. of the test.
  67.  
  68. : TEST  ( n -- )   \ Determine if number is even or odd.
  69.         CR DUP ." THE NUMBER " .  ." IS AN "
  70.         DUP 2/  2* =         \ Test if number is even.
  71.         IF      ." EVEN "
  72.         ELSE    ."  ODD "
  73.         THEN    ." NUMBER"  ;
  74.  
  75. ╓───────────────╖
  76. ║ Problem 3.12  ║
  77. ╙───────────────╜
  78. Use the word TEST on some even and odd numbers to make sure it works as
  79. advertised!  The second line of TEST  ( the one that tests if the number
  80. is even or odd ) is a little clumsy.  Find a better way to test if a
  81. number is even.  We know of at least two better ways to test for
  82. evenness.  How many ways can you find?
  83.  
  84. ╓──────────────╖
  85. ║ Problem 3.13 ║
  86. ╙──────────────╜
  87. Write word similar to TEST , whose output is a sentence stating whether
  88. the top number on the stack is positive , zero  or negative.
  89.  
  90. ╓──────────────╖
  91. ║ Problem 3.14 ║
  92. ╙──────────────╜
  93. Write a word called  EVEN  ( n   flag )  , that takes a stack input n
  94. and leaves a true flag if n is even and a false flag if n is odd.
  95.  
  96. Two new words:  KEY  and EXIT
  97.  
  98.  KEY  ( -- n )  Wait for user to press key on keyboard and
  99.                 return the key code n.
  100.  EXIT ( -- )    When compiled in a word, EXIT , will cause
  101.                 termination of word execution when encountered.
  102.  
  103. : KEY_TEST ( -- )  \ Using Exit to exit an infinite loop.
  104.         BEGIN  CR  KEY
  105.         DUP  CONTROL M  =    \  Control M is return key.
  106.         IF DROP EXIT THEN    \  Exit infinite loop if pressed.
  107.         DUP .  EMIT  AGAIN ; \  Otherwise show key pressed.
  108.  
  109. ╓───────────────╖
  110. ║ Problem 3.15  ║
  111. ╙───────────────╜
  112. Run this word and describe what happens when the function keys
  113. are pressed.
  114.  
  115. ┌────────────────────────────────────┐
  116. │  Please move to Lesson 3 Part 060  │
  117. └────────────────────────────────────┘
  118.