Схема. Рекурсивная проверка эквивалентности в списке

У меня проблема с функцией, которая должна удалить первое вхождение указанного элемента из списка. И я не могу использовать равные. Что я делаю неправильно?

 (define f
  (lambda (E X)
    (list? X)
    (check E X)))

(define check
  (lambda (E X)
    (cond ((eq?(cdr X) '()) 'no_occur)
          (#t (cond
                ((eq?(car X)E) (cdr X))
                (#t (cons '()
                          (cons (car X)
                                (check E (car X))))))))))

(f 'u '(k u l o))

Я получаю это:
mcdr: нарушение контракта
ожидаемый: mpair?
дано: k


person no_name    schedule 07.11.2014    source источник
comment
Я изменил только отступ.   -  person soegaard    schedule 07.11.2014
comment
Определение f кажется подозрительным. Вы хотели написать, если X является списком, то проверить X ?   -  person soegaard    schedule 07.11.2014


Ответы (2)


Решение с минимальными изменениями. Обратите внимание, что последний вызов проверки (check E (cdr X)) использует cdr, а не машину X. Почему?

#lang racket
(define f
  (lambda (E X)
    (if (list? X)
        (check E X)
        #f)))

(define check
  (lambda (E X)
    (cond ((eq? X '()) 'no_occur)
          (#t (cond
                ((eq? (car X) E) (cdr X))
                (#t (cons (car X)
                          (check E (cdr X)))))))))

(f 'u '(k u l o))
person soegaard    schedule 07.11.2014

 (define f
  (lambda (E X)
    (if (list? X)
        (check E X)
        "Your error message")))


(define check
  (lambda (E X)
    (cond ((eq? (cdr X) '()) 'no_occur)          ; what if it's the last symbol?
          ((eq?(car X) E) (cdr X))               ; no need to nest cond's
          (else (cons (car X)                    ; In scheme we use else
                      (check E (cdr X)))))))     ; you search the rest of the 
                                                 ; list. This line cuased your
                     ; error message. You called check with X=k (the car of '(k u l o))

Также я не удалил cons '() Вам не нужно каждый раз минусовать пустой список. Также обратите внимание на этот тест

> (f 'a '(k u l o))
 '(k u l . no_occur)

Я оставляю это вам, чтобы решить эту. ;-П

person Rptx    schedule 07.11.2014