please note that since yesterday picoLisp-2.3.4 is out.
The release contains a number of bug fixes, most notably in 'pipe' (as
discovered and discussed here), and in the 'http' and 'form' libraries.
The bignum routines contained a bug which obviously had been there
during all the years, but was rather improbable to show up. It could
lead to wrong results (or even to an infinite loop) if a large number
was compared to its negated and then absoluted value, e.g.
: (let N 12345678901234567890 (> N (abs (- N))))
-> T # wrong!
It appeared only if the internal data structure of numbers (here 'N')
was shared. It did not appear in
: (> 12345678901234567890 (abs (- 12345678901234567890)))
The reason was that the unary minus and the 'abs' function duplicate the
first cell of a big number, so that the tails of the original 'N' and
the results of '-' and 'abs' are shared. This could not be handled by
the comparison routines.
I discovered this bug in the course of re-writing these routines in
assembly for picolisp-3.
'eval' and 'run' now accept a new optional argument that may hold a list
of symbols to be excluded from the unbinding process.