rendered paste body: new-list ( -- list ) 1 cells allocate throw nil over ! ;
: cons ( y x -- addr ) 2 cells allocate throw dup >r 2! r> ;
: free-cons ( addr -- ) ?dup if free throw then ;
: >car ( pair -- first-addr ) ; immediate
: >cdr ( pair -- second-addr ) cell+ ;
: car ( pair -- first ) dup if >car @ then ;
: cdr ( pair -- second ) dup if >cdr @ then ;
: delete-node ( node -- next-node ) dup cdr swap free-cons ;
: list-delete-first ( list -- ) dup @ delete-node swap ! ;
: list-push ( atom list -- ) tuck @ swap cons swap ! ;
: list-pop ( list -- atom ) dup @ car swap list-delete-first ;
: delete-rest ( node -- nil ) begin dup while delete-node repeat ;
: list-delete ( list -- ) dup @ delete-rest swap ! ;
: join-nodes ( node2 node1 -- ) ?dup if >cdr ! else drop then ;
: last-node ( node -- last-node ) begin dup cdr while cdr repeat ;
: lists-join ( list2 list1 -- ) swap @ swap @ last-node join-nodes ;