Поскольку xor может использоваться с любым количеством аргументов, единственным требованием является то, чтобы количество истинных вхождений было нечетным. Это можно определить примерно так:
(define (true? x) (eqv? x #t))
(define (xor . args)
(odd? (length (filter true? args))))
Проверка аргументов не требуется, поскольку любое количество аргументов (включая ни одного) вернет правильный ответ.
Однако, у этой простой реализации есть проблемы с эффективностью: длина и фильтр пересекают список дважды; поэтому я подумал, что смогу удалить и ту, и другую бесполезную процедуру предиката "true?".
Значение нечетное? receive - это значение аккумулятора (aka acc), когда args не имеет оставшихся истинно оценивающих членов. Если существуют члены с истинной оценкой, повторите с acc + 1, а остальные аргументы начинаются со следующего значения true или оцените как false, что приведет к тому, что acc будет возвращен с последним счетом.
(define (xor . args)
(odd? (let count ([args (memv #t args)]
[acc 0])
(if args
(count (memv #t (cdr args))
(+ acc 1))
acc))))