Hi Kevin, > I may have encountered a possible bug, unless my understanding of @ is > incorrect. It appears the value of @ is not restored in a prog1 body when > another flow/logic statement occurs as the car of an expression within the
This is right. All flow functions which set '@' do *not* bind it. The value is simply set. > Test Cases: > > (let (A0 (1) > A1 (2 3) > A2 'x) > (prog1 (cdr A1) At this moment '@' is set to the result of evaluating (cdr A1). > ((if (sym? A2) 'set 'con) A2 A0) Now '@' was overwritten by 'if'. '@' is bound only on the function call level. That is, '@' is restored to the caller's value when the function returns. But inside a function's body the rule is that 1. Functions with controlling expressions just set '@' to the result. 'prog1' is such a function. 2. Functions with conditional expressions set '@' to the result *IF* the result is non-NIL (otherwise they leave it untouched). All this is described in more detail in https://software-lab.de/doc/ref.html#atres ☺/ A!ex -- UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe