Next: , Previous: , Up: Defining Words   [Contents][Index]


6.10.2 Variables

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]