For everything else, there's pattern matching (on nex-3's arc-wiki).
(pat-match:def rem-pairs
( (a b . c) )
(if (is a b)
(rem-pairs c)
`(,a ,@(rem-pairs `(,b ,@c))))
( (a) )
`(,a)
( () ) ())
Possibly I can make it such that you can even say something like (a ,(b (is a b)) . c) in the pattern guard, but it seems a semi-hard problem.
;does not work in current version yet!!
(pat-match:def rem-pairs
( (a ,(b (is a b)) . c) )
(rem-pairs c)
( (a . as) )
`(,a ,@(rem-pairs as))
( () )
() )
I'm still not seeing the win of pattern matching here, I'm afraid. This is actually longer than the standard definition using car/cdr. Maybe it's better for more complicated things, I suppose, but that'll defeat the purpose because it wouldn't be legible at that point (as if it is now).
The big win is that it's assuredly correct, and you don't have to mess around dealing with car and cdr. Crossref def varline in app.arc : arc1 had a bug there because it's ridiculously easy to make a mistake dealing with car and cdr. If you can't find the bug, try rewriting the code into pattern-matching form.