アレキサンダーの発言は正しい。また、あなたはid1を見つけたかどうか情報を保持しません。ここであなたができる方法の例です:
(define (precedes id1 id2 lst)
(define (iter lst foundid1)
(printf "~a ~a\n" lst foundid1) ; for debugging
(cond ((null? lst)
#f) ; never found id2 so #f
((eq? (car lst) id2)
foundid1) ; found id2 so result is whether we found id1 before
((eq? (car lst) id1)
(iter (cdr lst) #t)) ; found id1 so iterate, set found flag to #t
(else
(iter (cdr lst) foundid1)))) ; found nothing, iterate
(iter lst #f))
、ここでは出力です:
> (precedes 'e 'c '(d b e a c g f))
(d b e a c g f) #f
(b e a c g f) #f
(e a c g f) #f
(a c g f) #t
(c g f) #t
#t
> (precedes 'x 'c '(d b e a c g f))
(d b e a c g f) #f
(b e a c g f) #f
(e a c g f) #f
(a c g f) #f
(c g f) #f
#f
> (precedes 'x 'y '(d b e a c g f))
(d b e a c g f) #f
(b e a c g f) #f
(e a c g f) #f
(a c g f) #f
(c g f) #f
(g f) #f
(f) #f
() #f
#f
あなたはiter' 'に空のリストを渡している、(ヌル'によって生成ので、 '#のF'出力?lst) '。また、lstが識別子シンボルのリストであることを意図している場合、その要素と 'n'(数値)が等しいかどうかをチェックすることはあまり意味がありません。一方、 'x'は、' iter'手続きでは完全に使用されていません。 – assefamaru