Racket - фильтровать четные и нечетные целые числа в два отдельных списка

Функция должна принимать список целых чисел и возвращать список, содержащий два подсписка: первый содержит четные числа из исходного списка, а второй содержит нечетные. Мой код выполняет свою работу, но если я проверю его с отрицательным целым числом, например -5 во втором тесте, мой код просто проигнорирует его. Любые идеи о том, как исправить?

(Примечание: я знаю, что есть функции для четных, нечетных и т. д., но для этого задания я должен создать их сам.)

(define (segregate lst)
  (list(pullEven lst)(pullOdd lst)))

(define (pullEven lst)
    (if (empty? lst)
         '()
    (if (isEven (first lst))
     (cons (first lst) (pullEven (rest lst)))
     (pullEven (rest lst)))))

(define (pullOdd lst)
    (if (empty? lst)
         '()
    (if (isOdd (first lst))
     (cons (first lst) (pullOdd (rest lst)))
     (pullOdd (rest lst)))))

(define (isEven x)
  (if (equal? (remainder x 2) 0) #t #f)
  )
(define (isOdd x)
  (if (equal? (remainder x 2) 1) #t #f)
  )

;tests
"---------------------------------------------"
"Segregate Tests"
(segregate '(7 2 3 5 8)) 
(segregate '(3 -5 8 16 99))
(segregate '())
"---------------------------------------------"

person Brian Jay    schedule 03.10.2017    source источник
comment
Вы смотрели partition?   -  person Alex Knauth    schedule 03.10.2017
comment
напоминание об отрицательном числе, деленном на 2, равно отрицательному (поэтому это не 1;)   -  person rsm    schedule 03.10.2017
comment
Возможный дубликат Как разделить список на две части в Схема   -  person Sylwester    schedule 03.10.2017


Ответы (1)


Попробуйте заменить modulo вместо remainder.

Остаток сохранит знак ответа (остаток -1 не соответствует значению 1, которое вы проверяете).

Модуль возвращает ответ с тем же знаком, что и знаменатель.

person Wes Lord    schedule 03.10.2017
comment
Основываясь на ответе @rsm, я добавил больше логики в свой оператор if, что сработало, но самой чистой идеей было переключить «остаток» на «по модулю». Всем спасибо. - person Brian Jay; 03.10.2017