\ ============================================================================== \ \ dnl_expl - the generic double linked list example in the ffl \ \ Copyright (C) 2010 Dick van Oudheusden \ \ This library is free software; you can redistribute it and/or \ modify it under the terms of the GNU General Public \ License as published by the Free Software Foundation; either \ version 2 of the License, or (at your option) any later version. \ \ This library is distributed in the hope that it will be useful, \ but WITHOUT ANY WARRANTY; without even the implied warranty of \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU \ General Public License for more details. \ \ You should have received a copy of the GNU General Public \ License along with this library; if not, write to the Free \ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. \ \ ============================================================================== \ \ $Date: 2008-04-10 16:12:01 $ $Revision: 1.1 $ \ \ ============================================================================== include ffl/dnl.fs include ffl/rng.fs \ Example: sort a double linked list with 1001 random floats \ Create the double linked list on the heap dnl-new value flist \ Extend the generic double linked list node with a float field begin-structure fnode% dnn% +field fnode>node ffield: fnode>float end-structure \ Create the pseudo random generator in the dictionary with seed 5489 5479 rng-create frng \ Insert 1001 float nodes in the flist : flist-insert ( n -- = Insert n random floats in flist ) 0 DO frng rng-next-float \ Generate random float fnode% allocate throw \ Allocate fnode dup fnode>node dnn-init \ Initialise generic node dup fnode>float f! \ Store random float flist dnl-append \ Append to flist LOOP ; 1001 flist-insert \ Check the number of floats out of sequence : fnode-out-sequence ( n1 r1 fnode -- n2 r2 = Count the number of out of sequence floats, n: count r:previous float ) fnode>float f@ fswap fover f> IF 1+ THEN \ Compare current float with previous float, increment counter if out of sequence ; .( Before sorting there are ) 0 -1.0E+0 ' fnode-out-sequence flist dnl-execute fdrop . .( floats out of sequence. ) cr \ Sort the list using the fnode-compare word : fnode-compare ( fnode1 fnode2 -- n = Compare fnode1 with fnode2 ) swap fnode>float f@ fnode>float f@ f- fdup f0< IF fdrop -1 ELSE f0= IF 0 ELSE 1 THEN THEN ; ' fnode-compare flist dnl-sort \ Check the number of floats out of sequence again .( After sorting there are ) 0 -1.0E+0 ' fnode-out-sequence flist dnl-execute fdrop . .( floats out of sequence. ) cr \ Reverse the list flist dnl-reverse \ Check the number of out of sequence floats again .( After reversing the list there are ) 0 -1.0E+0 ' fnode-out-sequence flist dnl-execute fdrop . .( floats out of sequence. ) cr \ Cleanup the list flist dnl-free \ No dynamic memory stored in node, so default free word can be used
Generated by fsdocgen 0.1.0