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

  1.        ╔════════════════════════════════════════════════════╗
  2.        ║ Lesson 4 Part 100  F-PC 3.5 Tutorial by Jack Brown ║
  3.        ╚════════════════════════════════════════════════════╝
  4.  
  5.                ┌─────────────────────────────────┐
  6.                │  The Marbles Example Revisited  │
  7.                └─────────────────────────────────┘
  8.  
  9. The definition below has been reformated and commented to make it more
  10. readable.  It was originally coded in an old fashioned Forth screen or
  11. block of 16 lines by 64 characters and it was not changed when it was
  12. first presented at the end of L4P080.
  13.  
  14. : MARBLES  ( {n} color   -- )   \ There may be 1 or 2 numbers on stack.
  15.         TABLE  +                        \ Add colour offset to TABLE
  16.         DEPTH 1 =                       \ Check for {n} present.
  17.         IF SHOW THEN                    \ Set display mode if no {n}
  18.         LESS? IF   SWAP NEGATE SWAP +!  \ Do the subtract function.
  19.               ELSE SHOW?
  20.                    IF   @ .             \ Do the display function.
  21.                    ELSE MORE?
  22.                         IF   +!         \ Do the add function.
  23.                         ELSE  !         \ Do the reset function.
  24.                         THEN
  25.               THEN
  26.        THEN
  27.        ONLY ;     \ Set the default mode to the reset function.
  28.  
  29. Note that the ONLY or reset value function is assumed and not checked
  30. for if none of the other cases are present.
  31.  
  32. ╓──────────────╖
  33. ║ Problem 4.13 ║
  34. ╙──────────────╜
  35. Incorporate the defintion of ONLY? suggested in Problem 4.12 into the
  36. definiton of MARBLES.  Add error checking to make sure that if an
  37. invalid mode is detected an appropriate error message is displayed.
  38. Test it with the following:
  39.  
  40. : SMASH  5 MODE ! ;  <enter> ok
  41. SMASH 10 RED MARBLES <enter>  Error: Undefined function.  ok
  42. SMASH RED MARBLES    <enter> ... what happens and why? (Don't guess!)
  43.  
  44.  
  45. Let's look at another array example.
  46.                      \ The values of DATA are unitialized.
  47. CREATE DATA 20 ALLOT \ Create an array called DATA to hold
  48.                      \ 10 16-bit numbers at offsets 0, 2, ...18
  49.  
  50. \ Fetch the ith element of the array DATA
  51. \ Here i can be 0 1 2 3 4 5 6 7 8 or 9
  52. \ If negative or values larger than 9 are used you will
  53. \ fetch non existant array elements.
  54.  
  55. : DATA@  ( i -- n )  2* DATA + @ ;
  56.  
  57. \ Store the ith element of the array DATA
  58. \ WARNING! if values less than 0 or larger than 9 are used
  59. \ you will mutilate the Forth system by overwriting previous
  60. \ of following word definitions or data structures.
  61.  
  62. : DATA!  ( n i -- )  2* DATA + ! ;
  63.  
  64. ╓──────────────╖
  65. ║ Problem 4.14 ║
  66. ╙──────────────╜
  67. Use the MOD operator to write versions of DATA@ and DATA! that will
  68. always result in an index of 0 ... 9 being generated with no error
  69. message being generated.
  70.  
  71. ╓──────────────╖
  72. ║ Problem 4.15 ║
  73. ╙──────────────╜
  74. Use your word [IN] to write versions of DATA@ and DATA! that will issue
  75. an error messages if an index that is not between 0 and 9 is used.
  76.  
  77. \ Here is a word that clears all the elements of the array DATA.
  78.  
  79. : CLEAR-DATA ( -- ) 10 0 DO 0 I DATA! LOOP ;
  80.  
  81. ╓──────────────╖
  82. ║ Problem 4.16 ║
  83. ╙──────────────╜
  84. Write two new versions of CLEAR-DATA , one using FILL and another
  85. using ERASE .  Which of the CLEAR-DATA's do you think is the fastest?
  86.  
  87. \ The following word prompts the user to enter 10 numbers
  88. \ which will be stored in the DATA array as elements 0 ... 9
  89. : GET-DATA ( -- )
  90.         10 0 DO CR I 3 .R SPACE #IN  I DATA! LOOP ;
  91.  
  92. \ This word will display the contents of the DATA array
  93. \ along with the appropriate indices.
  94. : SHOW-DATA
  95.         10 0 DO CR ." DATA( " I . ." ) ="
  96.                 I DATA@ 10 .R
  97.              LOOP ;
  98.  
  99. ╓───────────────╖
  100. ║ Problem 4.17  ║
  101. ╙───────────────╜
  102. a) Write a word COUNT-DATA ( --   k )  that leaves the number of
  103.    non zero items k in the array DATA  on the stack.
  104. b) Write SUM-DATA ( --  sum ) that sums the non zero data values.
  105. c) Write AVERAGE-DATA ( -- ) prints average of the non 0 values.
  106.    Be sure to test you words.
  107.  
  108. ┌───────────────────────────────────┐
  109. │  Please move to Lesson 4 Part 110 │
  110. └───────────────────────────────────┘
  111.