Next: Constants, Previous: CREATE
, Up: Defining Words [Contents][Index]
The previous section showed how a sequence of commands could be used to generate a variable. As a final refinement, the whole code sequence can be wrapped up in a defining word (pre-empting the subject of the next section), making it easier to create new variables:
: myvariableX ( "name" -- a-addr ) CREATE 1 cells allot ; : myvariable0 ( "name" -- a-addr ) CREATE 0 , ; myvariableX foo \ variable foo starts off with an unknown value myvariable0 joe \ whilst joe is initialised to 0 45 3 * foo ! \ set foo to 135 1234 joe ! \ set joe to 1234 3 joe +! \ increment joe by 3.. to 1237
Not surprisingly, there is no need to define myvariable
, since
Forth already has a definition Variable
. Standard Forth does not
guarantee that a Variable
is initialised when it is created
(i.e., it may behave like myvariableX
). In contrast, Gforth’s
Variable
initialises the variable to 0 (i.e., it behaves exactly
like myvariable0
). Forth also provides 2Variable
and
fvariable
for double and floating-point variables, respectively
– they are initialised to 0. and 0e in Gforth. If you use a Variable
to
store a boolean, you can use on
and off
to toggle its
state.
Variable
( "name" – ) core “Variable”
Define name and reserve a cell starting at addr.
name run-time: ( -- addr )
.
AVariable
( "name" – ) gforth-0.2 “AVariable”
Works like variable
, but (when used in cross-compiled
code) tells the cross-compiler that the cell stored in the
variable is an address.
2Variable
( "name" – ) double “two-variable”
fvariable
( "name" – ) floating “f-variable”
Finally, for buffers of arbitrary length there is
buffer:
( u "name" – ) core-ext “buffer-colon”
Define name and reserve u bytes starting at addr.
name run-time: ( -- addr )
. Gforth initializes the
reserved bytes to 0, but the standard does not guarantee this.
The defining word User
behaves in the same way as
Variable
. The difference is that it reserves space in the
user (data) space of each task rather than normal data space. Each
task has its own instance of the user space.
User
( "name" – ) gforth-0.2 “User”
AUser
( "name" – ) gforth-0.2 “AUser”
Define a user variable for containing an addres (this only makes a difference in the cross-compiler).
uallot
( n – n’ ) gforth-0.3 “uallot”
Reserve n bytes in every user space.
Next: Constants, Previous: CREATE
, Up: Defining Words [Contents][Index]