10 REM A strict pointer is a distinct declared kind. Assignment always copies;
20 REM POINT is the only way to share, so a program that never writes it can
30 REM never be surprised by aliasing.
40 TYPE NODE
50   COUNT#
60   TAIL@ AS PTR TO NODE
70 END TYPE
80 DIM N1@ AS NODE
90 DIM N2@ AS NODE
100 DIM N3@ AS NODE
110 N1@.COUNT# = 10
120 N2@.COUNT# = 20
130 N3@.COUNT# = 30
140 REM A TYPE may refer to itself only through PTR TO, which is what makes a
150 REM list possible at all -- by value it would have no finite size.
160 POINT N1@.TAIL@ AT N2@
170 POINT N2@.TAIL@ AT N3@
180 DIM WALK@ AS PTR TO NODE
190 POINT WALK@ AT N1@
200 PRINT WALK@->COUNT#
210 WALK@ = WALK@->TAIL@
220 PRINT WALK@->COUNT#
230 WALK@ = WALK@->TAIL@
240 PRINT WALK@->COUNT#
250 REM An unbound pointer is NOTHING, not a crash.
260 PRINT WALK@->TAIL@
270 REM Writing through a pointer changes what it points at.
280 POINT WALK@ AT N1@
290 WALK@->COUNT# = 99
300 PRINT N1@.COUNT#
310 REM And the whole list renders, following pointers as it goes.
320 PRINT N1@
