Thank you On 11 February 2017 at 11:51, Joh-Tob Schäg <johtob...@gmail.com> wrote:
> You can also explicitly change the car or cdr of a list cell. > If you do a little diging in the docs you might find the functions. > Am 11.02.2017 12:45 schrieb "dean" <deangwillia...@gmail.com>: > > > >Does that explanation make sense? > > > > Yes it does > > > > >You can either destructivly change the car of a cell in the list or > write > > your own pop which keeps the same >cell at the head of the list (by > > reassigning car parts appropiatly). > > > > Thank you...this is the only way I know about at the moment that lets me > > destroy the car and replace it with something new...as you say though it > > creates a whole new AND GLOBAL list because of setq. > > (setq L (insert '1 (remove '1 L) 2)) > > > > Irrespective...thank you for your further advice. > > > > > > > > > > On 11 February 2017 at 10:51, Joh-Tob Schäg <johtob...@gmail.com> wrote: > > > > > List operations in Picolisp tend to be non destructive and constructive > > > (they allocate new cells to get what you want) leaving old ones to be > > > collected by gc. > > > Am 11.02.2017 11:48 schrieb "Joh-Tob Schäg" <johtob...@gmail.com>: > > > > > >> I understand your problem now. > > >> > > >> You have think about cells in this case. > > >> > > >> When you inc a 'symbol the value part of the symbol-cell is changed. > > >> [prop|val] represents a symbol in this case. > > >> (inc '[NIL|5]) is [NIL|6] > > >> The Symbol was changed destructivly. All earlier refernces to this > cell > > >> now evaluate to 6. That is because a cell evaluates to its value. > > >> > > >> If you push 88 on to a list. You do not get back the original list > > >> changed but a new list which has a a cell with 88 in the beginning and > > >> pointer to the old list in the cdr. > > >> [1|pointer to 2nd cell] [2| pointer to 2nd cell ] [3|Nil] [Nil|Nil] > > >> You save this list in to a symbol which now has the pointer to the > first > > >> element in it value slot. > > >> > > >> If you push 88 on to this list it looks like this: > > >> [1|pointer to 2nd cell] [2| pointer to 2nd cell ] [3|Nil] [88|pointer > to > > >> first cell] > > >> However your symbol L does not notice this change because it is still > > >> pointing to the first cell. > > >> To make it point to the head of the new list you need to setq the > value > > >> of L to the new head of the list. > > >> > > >> Does that explanation make sense? > > >> > > >> You can either destructivly change the car of a cell in the list or > > write > > >> your own pop which keeps the same cell at the head of the list (by > > >> reassigning car parts appropiatly). > > >> Am 11.02.2017 11:29 schrieb "dean" <deangwillia...@gmail.com>: > > >> > > >>> Hi Joh-tob & Joe > > >>> With setq L.....(0 0 0) gets changed to (2 0 0) i.e. the replace is > > done > > >>> by index not matching value > > >>> With let L...(0 0 0) stays at (0 0 0) > > >>> I'd wanted the former in conjunction with let. > > >>> Thank you for the suggestion re need...and the explanation re let. > > >>> I can do this with setq but was just wondering if there was a way > > around > > >>> "setting" let'd values more than once...like you can with let'd > > >>> atoms...using inc and dec. > > >>> I don't think you can but didn't think you could with atoms until inc > > >>> and dec came back as an answer on this forum...hence this question :) >