2017-01-17 6 views
-1

Я создал функцию, которая берет список и два элемента списка. Он должен возвращать #t, если второй аргумент появляется в аргументе списка перед третьим аргументом:Программа ракеты не работает как она должна

Процедура также должна возвращать #f, если любой из предполагаемых элементов вообще не отображается.

вот что я получил до сих пор:

(define (before-in-list? lst a b) 
    (cond 
    ((empty? lst) #f) 
    ((eq? (car lst) a) (map b (cdr lst)) #t) 
    ((eq? (car lst) b) #f) 
    (else (before-in-list? (cdr lst) a b)))) 

, чтобы проверить это, я использовал:

(before-in-list? '(back in the ussr) '(in) '(ussr)) 
(before-in-list? '(back in the ussr) '(the) '(ussr)) 

проблема заключается в том, что она дает мне е каждый раз.

любые подсказки о том, как исправить это пожалуйста?

ответ

1

Способ использования map не имеет смысла. Кроме того, вы должны использовать equal? для более общих сравнений, а параметры a и b не должны быть списками. Попробуйте следующее:

(define (before-in-list? lst a b) 
    (cond 
    ((empty? lst) #f) 
    ((equal? (car lst) a) 
    (if (member b (cdr lst)) #t #f)) 
    ((equal? (car lst) b) #f) 
    (else (before-in-list? (cdr lst) a b)))) 

(before-in-list? '(back in the ussr) 'in 'ussr) 
=> #t 
(before-in-list? '(back in the ussr) 'the 'ussr) 
=> #t 
+0

большое спасибо –

+0

@yousifS без проблем! Если этот ответ был полезен для вас, пожалуйста, не забудьте [принять] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work), просто нажмите отметьте его слева;) –

+0

@yousifS, пожалуйста, не забудьте принять этот ответ! –