\ Copyright 2003 Roelf, postbus@bmbcon2.demon.nl \ Assuming the list is made of nodes and each node is composed of two cells. \ Cell 1 contains pointer to another node, the link. \ Cell 2 points to another list, literal data, structure, xt, whatever. \ There are many ways to create these lists, here we use a free list from \ which we'll construct new lists. \ note on stack comments: \ node = address node-structure \ list = address first node-structure in list aka chain of nodes \ Allocate LISP cells [UNDEFINED] New-List [IF] [UNDEFINED] #Nodes [IF] 512 constant #Nodes \ dividable by '2 cells' [THEN] \ nodes will be cons from here 2 cells constant Node \ a list node has '2 cells' a.units #Nodes Node [*] array List-Heap \ 8 bytes, sorry: a.units, per cell Node array Nil \ create zero node variable Free-List \ free list handle : Zero-Heap Nil dup 2dup ! cell+ ! \ zero NIL node List-Heap #Nodes Node [*] bounds do 0 i ! loop ; : Init-Free-List ( --) Zero-Heap List-Heap #Nodes 1- 0 \ all nodes except the last do \ will be linked dup Node + dup >r swap ! r> loop Nil swap ! \ last is linked to Nil node List-Heap Free-List ! \ Free-List contains whole heap ; \ Some words to deal with the list, some have LISP names \ retrieves what is in the first node's 'pointer cell' : CAR ( list - x ) cell+ @ ; \ return next node i.e. rest of list : CDR ( list - restlist) @ ; \ add node to the beginning of the list and return 'newlist' : add-node ( node list - newlist ) over ! ; \ remove first node, returning node and 'newlist' : remove-node ( list - node restlist ) dup Nil = abort" Empty list" dup CDR ; \ get us a node from the heap : get-node ( - node ) Free-List @ remove-node Free-List ! ; \ return node to the heap : return-node ( node - ) Free-List @ add-node Free-List ! ; \ creating a new list with Nil as first node : New-List ( - list ) Nil ; \ add item to a list returning the newlist : CONS ( whatever list - newlist) get-node tuck ! tuck cell+ ! ; \ show what is in list : Show-List ( list - ) begin dup Nil <> while dup CAR . cr CDR repeat drop ." NIL" cr ; Init-Free-List [DEFINED] 4TH# [IF] hide Node hide List-Heap hide Free-List hide Zero-Heap hide Init-Free-List [THEN] \ example: \ New-List value my-list \ my-list Show-List \ s" postbus@bmbcon2.demon.nl" \ my-list CONS to my-list \ my-list CONS to my-list \ my-list Show-List \ my-list dup CAR swap CDR CAR type \ Roelf, generated Wed Jul 23 02:53:42 2003 [THEN]