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

  1.        ╔════════════════════════════════════════════════════╗
  2.        ║  Lesson 7 Part 090 F-PC 3.5 Tutorial by Jack Brown ║
  3.        ╚════════════════════════════════════════════════════╝
  4.  
  5.               ┌──────────────────────────────────────┐
  6.               │  Explanation of the NOTE  Compiler   │
  7.               └──────────────────────────────────────┘
  8.  
  9. The part before the word DOES> and after the word NOTE describes how to
  10. make notes.  The part after the word DOES> and before the  ;  tells how
  11. to play a note, or what is to happen when you execute a note type object.
  12.  
  13. \ The note compiler.
  14. : NOTE   CREATE   ,                       \ Compile time like constant.
  15.          DOES>  @  OCTAVE @ *  5 + 10 /   \ Run time, fetch value, compute
  16.                 TONE  REST S.OFF ;        \ frequency and play the note.
  17.  
  18. Now for a detailed explanation of how NOTE works.
  19.      
  20. First look at the compile time or creation part of the word.  This is
  21. the part before the DOES> .  You know from the preceding discussion that
  22. CREATE makes a dictionary entry for the word which follows it in the
  23. input stream. This time, however, CREATE is included in a definition so
  24. the dictionary entry will not be created until NOTE is executed.  At
  25. this time the word following NOTE in the input stream wile be the name
  26. of the musical note we want to create.  The comma  ( , ) stores the top
  27. stack number in the dictionary space following the created note name (
  28. in the notes pfa ). This value will be recovered at run time and used to
  29. control the frequency of the sound generator.
  30.     
  31. Second look at the run time or execution time part of the word.  This is
  32. the part after the DOES>.  Recall that whenever a word defined by CREATE
  33. executes ( and in this case NOTE because it includes CREATE ), the
  34. parameter field address or pfa get pushed to the data stack.  The @
  35. which follows the DOES> fetches the value stored at this location ( the
  36. value stored by the comma ( , )  at compile time ).  This value is
  37. multiplied by the OCTAVE and turned into a frequency for the word TONE.
  38. TONE starts the sound generator with the compute frequency and REST
  39. waits the number of beats specified by the number on the stack.  Finally
  40. when the beats are finished the sound is turned off.
  41.     
  42. That's it...  Its all over...  The music language is all contained in the
  43. word NOTE.   We just make NOTEs  as you would make CONSTANTs and then
  44. you use the NOTEs to do something.  Above we have a program that plays a
  45. musical scale.  If you would like a song there is one below:
  46.     
  47. \ Music Music??
  48. : PART1  1/4  2ND F# E D C D E D
  49.               1ST A F# G A B A F#  1/2 A 1/4  2ND D E ;
  50. : PART2  1/2  2ND F# F# 1/4 F# E D E F# E D F# 1/2 E ;
  51. : PART3  1/4  2ND F# E F# G A F# D E F# D E 1ST A 1/2 2ND D R ;
  52. : PART4  1/4  1ST F# E F# G A G F# E F# E F# G ;
  53. : PART5  1/4  2ND D E F# D 1ST B 2ND C# D 1ST A F# G A F#
  54.          1/2  E 1/4 D E ;
  55. : PART6  1/4  1ST F# E F# G A F# D E F# D E C# 1/2 D R ;
  56. : TURKEY  PART1 PART2 PART1 PART3 PART4 1/2 1ST A R
  57.           PART4 1/2 1ST B 1/4 B  2ND C# PART5 PART6 ;
  58.  
  59.         ┌──────────────────────────────────────────────────┐
  60.         │  Defining a VECTOR with Run Time Error Checking  │
  61.         └──────────────────────────────────────────────────┘
  62.  
  63. At compile time all elements of the vector are initialized to zero.  At
  64. run time the vector subscript is checked against that stored at compile
  65. time and an error message issued if the subscript is out of range.  I
  66. have noticed seasoned veterans of other languages comment at Forth's lack
  67. or error checking.  Well... you can put as much in as you like, and you
  68. know what?  The more you put in the slower you program will run.  A
  69. correct program does not need run time error checking.  So what is a
  70. person to do, like me who cannot write correct programs?   Have one
  71. version of the word with error checking to use when you are doing
  72. development work and another to use when you have all the bugs removed.
  73. Here is the definition of VECTOR with error checking.
  74.  
  75. \ Create a one dimensional vector n storage cells
  76. \ Usage:         VECTOR  {name}   ( n -- )
  77. \ Later:         {name}           ( index -- adr )
  78.  
  79. : VECTOR   ( n  -- )
  80.         CREATE                 \ This is the compile time routine
  81.         DUP ,                  \ Compile n, maximum subscript.
  82.         0 DO 0 , LOOP          \ Initialize vector to zeros.
  83.                                \ Run time- comments are stack state.
  84.         DOES>                  \ index adr
  85.         TUCK @  OVER           \ adr index n index
  86.         <= OVER 0< OR          \ adr index flag
  87.         ABORT" Subscript out of range."  \ Error message
  88.         1 + 2* + ;              \ Compute address of ith element
  89.  
  90. ╓───────────────╖
  91. ║  Problem 7.6  ║
  92. ╙───────────────╜
  93. Use this version of VECTOR to implement the WORK example given at the end
  94. of Lesson 7 Part 7.  Verify the operation of the run time error checking
  95. by coding an out of range subscript in the definition of WORK
  96.  
  97. ┌───────────────────────────────────┐
  98. │  Please Move to Lesson 7 Part 100 │
  99. └───────────────────────────────────┘
  100.  
  101.  
  102.