2014-11-03 2 views
1

나는 학교에서 단어 번역자를해야했다. 필자는 DrRacket에서 이렇게 해보았지만, 독일어를 영어로 번역 할 때, "오류"를 준다. 선생님도 모른다. 실수를 수정하는 방법, 당신의 누군가가 나를 도울 수 있기를 바랍니다.스킴 - 단어 번역기

> (wordtranslator 'Hund *lex*) 
Error 
> 
+0

'(null? liste)'는'liste'에 값이 지정되지 않았기 때문에 true가됩니다. 또한'(car list)'와 같은 이후 호출은'list'가 라켓/스킴 함수에 내장되어 있기 때문에 문제가 있습니다. –

답변

0

구현은 불필요하게 복잡하고 구문 오류의 몇 가지있다 - 예를 들면 : 내가 번역 할 때

(define *lex* 
    '((cat Katze) 
    (dog Hund) 
    (eats frisst) 
    (jumps springt) 
    (the die) 
    (the der))) 


(define (wordtranslator word *lex*) 
      (cond ((null? liste) 'Error) 
       ((not (equal? word (or (car (car list)) (car (cdr (car list)))))) (wordtranslator word (cdr liste))) 
       (else 
       (cond 
        ((equal? word (car (car list))) (car (cdr (car list)))) 
        ((equal? word (car (cdr (car list)))) (car (car list))))))) 

는 "개자리는"이 표시 *lex*라는 목록 매개 변수입니다, list 또는 liste? 그리고 이유는 복수 cond 표현, 단일 멀티 부품 cond면 충분합니까? equal? 내에서 or을 사용하는 방식이 잘못되었음을 알 수 있습니다. 처음부터 다시 시도하는 것이 좋습니다 것 : 난 당신이 단어가 현재 쌍의 하지 인 경우 먼저 찾기 위해 노력하고 있다고 이해 코멘트에서

(define (wordtranslator word liste) 
     ; if the list is empty, we didn't find the word, signal an error 
    (cond ((null? liste) 'Error) 
     ; is the word in the first element of pair? 
     ((equal? word (caar liste)) 
     ; then return the second element of pair 
     (cadar liste)) 
     ; is the word in the second element of pair? 
     ((equal? word (cadar liste)) 
     ; then return the first element of pair 
     (caar liste)) 
     ; otherwise, the word is not in the current pair 
     (else 
     ; advance the recursion to the next pair 
     (wordtranslator word (cdr liste))))) 

합니다. 이것은 또한 가능하지만, IMHO 코드는 읽기 쉽지 않으므로 더 많은 비교를 사용해야합니다. 또한 두 번째 조건을 표현하는 올바른 방법에 유의하십시오. 나는 당신이 생각했던 것과 유사한 방법으로이 쓸 수 있지만 기억할 것 - 모두 구현은 동일합니다

난 당신이 첫 번째 구현을 사용하는 것이 좋습니다
(define (wordtranslator word liste) 
    (cond ((null? liste) 'Error) 
     ((not (or (equal? word (car (car liste))) 
        (equal? word (car (cdr (car liste)))))) 
     (wordtranslator word (cdr liste))) 
     (else 
     (cond ((equal? word (car (car liste))) 
       (car (cdr (car liste)))) 
       ((equal? word (car (cdr (car liste)))) 
       (car (car liste))))))) 

else 부분은 이미 무엇을 표현한다 복잡한 두 번째 조건은 두 번째 구현에서 수행 중이며 조건을 재정렬하면 코드를 단순화 할 수 있습니다. 어느 쪽이든 번역은 두 방향 모두에서 작동합니다 :

(wordtranslator 'Hund *lex*) 
=> 'dog 
(wordtranslator 'dog *lex*) 
=> 'Hund 
(wordtranslator 'bunny *lex*) 
=> 'Error 
+0

정말요? 정답을 downvoting하기 전에 코멘트를 원하십니까? –

+0

하지만 모든 단어가 전체 컴플렉스를 통과하지 않도록 첫 줄에서 요청을 끝내려고합니다. – TheDevilofme

+0

@TheDevilofme 무슨 뜻입니까? 이 구현은 단어가 발견 되 자마자 재귀를 끝내고, 재귀는 마지막 조건에서만 진행되며 단어가 발견되거나 목록이 비어지면 다른 모든 조건은 멈 춥니 다. –