home *** CD-ROM | disk | FTP | other *** search
- X> % Welcome back to the next PISTOL session!
- X>
- X> % I shall show in this session how to create things
- X> % specifically, I shall show how to define CONSTANTs
- X> % VARIABLEs, WORDs, and "inline macros".
- X>
- X> % CONSTANTs
- X> % suppose I wish to define "1K" as 1024 in decimal in
- X> % order to increase the readability and decrease the size
- X> % of the program. Constants are an important tool to
- X> % simplify future modifications in a program.
- X>
- X> 1024 '1K CONSTANT
- X>
- X> % we can test if the definition "took" (really unnecessary)
- X> % but good for demonstration!
- X>
- X> 1K =
- 1024
- X>
- X> % I shall digress to the question of number bases. We have bee
- X> % been using "decimal" all along. We could change, say to
- X> % Hexadecimal (base 16) by the command:
- X>
- X> HEX
- H>
- H> % notice how the prompt is now "H>", to indicate we are
- H> % now conversing with PISTOL in hexadecimal.
- H>
- H> % What is "1K" in hex?:
- H>
- H> 1K =
- 400
- H>
- H> % here is another demonstration we are in "hex":
- H>
- H> 8 8 + =
- 10
- H>
- H> % the "10" is sixteen in hex; here's another demo:
- H>
- H> 100 2 / =
- 80
- H>
- H> 100 2 /
- 1H> DECIMAL
- 1X> =
- 128
- X> % note that the prompt helps to remind us which number base
- X> % we are using. The value of a CONSTANT is not changing
- X> % when we change number bases, but writing its value "looks"
- X> % different in each number base. Let's see "1K":
- X>
- X> BINARY
- B> 1K =
- 10000000000
- B>
- B> OCTAL
- Q> 1K =
- 2000
- Q>
- Q> HEX
- H> 1K =
- 400
- H>
- H> DECIMAL
- X> 1K =
- 1024
- X>
- X>
- X> % VARIABLEs
- X> % It is possible to store items in named locations like
- X> % most other higher-level languages. For example,
- X> % " X = Y + Z " is probably understood as " take what is
- X> % stored at location 'X'; take what is stored at location
- X> % 'Y' ; add them; store the result at the location 'Z' "
- X>
- X> % We must define and allocate space for variables before
- X> % we can use them; we shall define the variables, Y and Z
- X> % with initial values of 3 and 4 initially:
- X>
- X> 3 'Y variable
- X> 4 'Z VARIABLE
- X>
- X> % to test the values of variables we use the word "?":
- X>
- X> Y ?
- 3
- X> Z ?
- 4
- X>
- X> % to simulate X=Y+Z we better define X first:
- X>
- X> 0 'X variable
- X>
- X> X ?
- 0
- X>
- X> % Here goes:
- X>
- X> Y W@ Z W@ + X W!
- X>
- X> X ?
- 7
- X> % we did it. We can continue to use X,Y, and Z for the
- X> % remainder of the session. To see what have been the
- X> % ten most recent definitions we can use:
- X>
- X> TOP10
- 25280 X
- 25264 Z
- 25248 Y
- 25234 1K
- 25132 FINISH
- 25066 WRITE
- 25020 READ
- 24990 1READ
- 24930 DELETES
- 24912 REPLACE
- 1X>
- 1X> % note this command left an item on the stack. It is
- 1X> % used to enable us to find the names of yet earlier
- 1X> % definitions:
- 1X>
- 1X> NEXT10
- 24898 DELETE
- 24874 (DELETE)
- 24808 INPUT
- 24700 LI
- 24684 ARG#ERR
- 24644 1POSARG?
- 24610 LENTER
- 24596 MTDN
- 24570 OVERWRITE
- 24534 MTUP
- 1X>
- 1X> NEXT10
- 24488 #GETLINE
- 24450 LDDR
- 24412 LDIR
- 24306 LFIND
- 24290 ILLEGLIN
- 24236 LISTALL
- 24202 NEXTLINE
- 24164 NEWF
- 24148 EOT
- 24132 OLDLINE^
- 1X>
- 1X> DROP
- X>
- X> % the DROP is for "good housekeeping".
- X>
- X> % back to CONTANTs and VARIALEs:
- X> % suppose we want to do: X = '1K' + Y :
- X>
- X> 1K Y W@ + X W!
- X>
- X> X ?
- 1027
- X>
- X> % looks correct. It's about time I explain the words:
- X> % W@ and W! The first, "word-at" is used to get the
- X> % contents of a location ( a VARIABLE provides a pointer
- X> % to the location). The second, "word-store", is used
- X> % to place the item next to the top of stack into the
- X> % location pointed to by the top of stack.
- X>
- X> % Let's follow the last example using the STACK utility:
- X>
- X> STACK
- (0)
- X> 1K STACK
- (1) 1024
- 1X> Y STACK
- (2) 1024 25254
- 2X> W@ STACK
- (2) 1024 3
- 2X> + STACK
- (1) 1027
- 1X> X STACK
- (2) 1027 25286
- 2X> W! STACK
- (0)
- X>
- X> X STACK
- (1) 25286
- 1X> ? STACK
- 1027
- (0)
- X>
- X> % the ? is equivalent to the pair of words: W@ =
- X>
- X> % creating new WORDs....
- X> % suppose we didn't have or didn't know the word, "?" ,
- X> % we could invent it: suppose we call our word, "IS" :
- X>
- X> 'IS : W@ = ;
- X>
- X> % testing this new word:
- X>
- X> X IS
- 1027
- X>
- X> Y IS
- 3
- X>
- X> Z IS
- 4
- X> % it appears to work. Once a word exists, we can define
- X> % newer words yet, for example:
- X>
- X> 'XYZ? : X IS SPACE Y IS SPACE Z IS ;
- X>
- X> % testing:
- X>
- X> XYZ?
- 1027 3 4
- X>
- X> % further testing:
- X>
- X> -15 X W!
- X> XYZ?
- -15 3 4
- X>
- X>
- X> % DIS-assembling words: (very useful if you forgot how
- X> % you created a definition!)
- X>
- X> 'XYZ? DIS
- 'XYZ? [:] X IS SPACE Y IS SPACE
- Z IS ;
- X>
- X>
- X> % Thus DIS shows us more or less the same thing as we typed.
- X> % more examples:
- X>
- X> 'IS DIS
- 'IS [:] W@ = ;
- X>
- X> '? DIS
- '? [:] W@ = ;
- X>
- X>
- X> % So we see that the "?" was originally defined the same
- X> % way we defined "IS".
- X>
- X> % Sometimes we wish to observe the internal action of a
- X> % definition, say, for debugging. We use the utility
- X> % "TRACE":
- X>
- X> 'XYZ? TRACE
- 'XYZ? BEING TRACED:
- (0) X
- (1) 25286 IS -15
- (0) SPACE
- (0) Y
- (1) 25254 IS 3
- (0) SPACE
- (0) Z
- (1) 25270 IS 4
- (0) (;)
- TRACE COMPLETED
- X>
- X>
- X> % notice that the STACK utility is interposed in between
- X> % each word that makes up the definition being tested.
- X> % fortunately, however, the individual words, such as
- X> % "IS" are not also "traced"; if TRACE showed every
- X> % step we would have too much clutter. It is then
- X> % possible to do a TRACE on a suspicious subsidiary word,
- X> % and so on...
- X>
- X> % inline macros:
- X> % as the last topic of this session we shall show an
- X> % alternate way to define new words:
- X> % we will define "DOUBLE" in two ways:
- X>
- X> 'DOUBLE1 : DUP + ;
- X> 'DOUBLE2 $: DUP + ;$
- X>
- X> % testing each:
- X> 3 DOUBLE1 =
- 6
- X> 3 DOUBLE2 =
- 6
- X>
- X> % they appear to behave at least similarly. What about
- X> % disassembling them:
- X>
- X> 'DOUBLE1 dis
- 'DOUBLE1 [:] DUP + ;
- X> 'DOUBLE2 dis
- 'DOUBLE2 [$:] DUP + ;
- X>
- X> % Now I can try to illustrate how they really differ, by
- X> % defining QUADUPLE using both:
- X>
- X> 'QUADUPLE :
-
- 1X:> DOUBLE1
-
- 1X:> DOUBLE2
-
- 1X:> ;
- X>
- X> % testing:
- X>
- X> 3 quaduple =
- 12
- X> % seems reasonable (yes, I realize my spelling is bad!)
- X> % let's use DIS:
- X>
- X> 'QUADUPLE DIS
- 'QUADUPLE [:] DOUBLE1 DUP + ;
- X>
- X> % Where did DOUBLE2 go? We see that it was repleced by
- X> % " DUP + ", which is the way we defined DOUBLE2 anyway.
- X>
- X> % the difference between using the : ; pair for defining
- X> % a word and the $: ;$ pair for the definition is the
- X> % the former creates a "subroutine" and the latter defines
- X> % a pattern to be substituted into whereever it will be
- X> % used. The choice of which to use is that of space
- X> % verses speed.
- X>
- X> % Let's use TOP10 to see what monsters we have created:
- X>
- X> TOP10
- 25364 QUADUPLE
- 25350 DOUBLE2
- 25336 DOUBLE1
- 25310 XYZ?
- 25296 IS
- 25280 X
- 25264 Z
- 25248 Y
- 25234 1K
- 25132 FINISH
- 1X>
- 1X> drop
- X>
- X> % sooner or later we wish to redo definitions or discard
- X> % them. The word FORGET is used:
- X>
- X> 'IS FORGET
- X>
- X> % testing:
- X>
- X> TOP10
- 25280 X
- 25264 Z
- 25248 Y
- 25234 1K
- 25132 FINISH
- 25066 WRITE
- 25020 READ
- 24990 1READ
- 24930 DELETES
- 24912 REPLACE
- 1X>
- 1X> drop
- X>
- X> % FORGET not only discards the chosen word (here "IS"), but
- X> % also all more recent definitions. This behavior is
- X> % following a long tradition that was in FORTH and in
- X> % STOIC. At times it is convenient, at times inconvenient.
- X> % Consider whether XYZ? would have been useful after IS was
- X> % discarded.
- X>
- X> % FORGET is a word that causes designers of this kind of
- X> % language sleepless nights.
- X>
- X> % This session has lasted long enough.... Why don't you
- X> % continue experimenting and learning PISTOL more
- X> % systematically by reading PISTOL.DOC?
- X>
- X> bye
-