Scheme에서 객체와 표현식을 취하는 함수를 만드는 질문을하고 있습니다. 예를 들어 (foo 'x '(x 10 x x 4))
은 주어진 객체를 따르는 모든 객체를 반환해야하므로 위의 함수 호출은 (10 x 4)
을 반환합니다. 그러나 표현에는 (foo 'y '(y (3 y 5 y y 8 9) (10 y 12 13 y 15 y) 17))
과 같이 목록을 포함하여 ((3 y 5 y y 8 9) 5 y 8 12 15)
을 반환해야합니다. 목록이있을 때 문제가 있습니다. 지금까지 제 코드가 있습니다. 식이 목록이 포함 된 경우 목록을 포함하는 표현식을 통한 스키마 루핑
(define (foo target expression)
(cond [(null? expression)]
[(list? (first expression)) (foo target (first expression))]
[(eqv? (first expression) target) (cons (first (rest expression)) (foo target (rest expression)))]
[(not (eqv? (first expression) target)) (foo target (rest expression))]))
그래서, 나는 그러나, 내가 검색을 계속하기 위해 원래의 표정으로 돌아 가야하는 방법을 모른다, 재귀 적으로 그 목록에있는 함수를 호출하는 것을 시도하고있다.
내가 얻고 (foo 'y '(y (3 y 5 y y 8 9) (10 y 12 13 y 15 y) 17))
를 호출 할 때 그래서 ((3 y 5 y y 8 9) 5 y 8 . #t)
그렇게 성공적으로 첫 번째 목록을 통해 루프는 그러나 그것은 그 후 중지하고
또한 표현에 두 번째 목록에 도달하지 않는다, 나는 데 다른 하나의 문제입니다 부울 결과가 끝날 때,이 줄이 cond [(null? expression)]
인 것을 알았습니다. 표현식이 끝나면 오류가 발생했기 때문에이 내용을 추가했습니다. 어떻게 해결할 수 있습니까?
이 질문에 주어진 예제 중 하나는'(foo 'z'z) =>()'입니다. 어떻게 추가 할 수 있습니까? 현재'rest : contract violation expected : (와/c list? (not/c empty?)) given : z' –
'[(not (list? expr)) '()]'을 추가했는데 제대로 작동하는 것 같습니까? –
맞습니다. 이를 통해, 입력 표현식이리스트가 아닐 때마다 빈리스트를 출력합니다. 첫 번째 기본 케이스로 테스트되도록 주문하십시오. – assefamaru