I forgot to add: %lset2<= depends on how member uses its = argument. In the reference implementation, the order is correct, but the document doesn’t require it.

I only noticed this because MIT/GNU Scheme's implementation of member flips the arguments to = which causes a problem.

Perhaps avoiding the use of member in %lset2<= would clarify things.
On May 26, 2020, 7:56 PM -0700, Chris Hanson <xxxxxx@chris-hanson.org>, wrote:
In the description of lset= the document states:
The = procedure's first argument is an element of listi; its second is an element of listi+1.

But the implementation essentially boils down to this:
(and (%lset2<= = s1 s2) (%lset2<= = s2 s1))

This flips the arguments but not the predicate. This can be fixed by flipping the predicate, or removing the statement from the document.

Given that I’ve been using this implementation for many years, and this is the first time I noticed the problem, it might be simpler to remove the statement.