2012-03-31 2 views
0

저는 Scheme에 단어 계산 프로그램을 만들려고합니다. 내 라인, 단어 및 문자를 계산할 알고리즘을 찾았지만, 프로그램을 실행하기 시작하면 "The object # \ 1 is not applicable."이라고 알려줍니다. "1"은 내가 읽고있는 파일의 첫 번째 문자이며 "else"에 속해야합니다. 내가 보는 모든 것은 내 주장과 일치하기 때문에 나는 올바르게하고 있다고 생각하지만 분명히 어딘가에서 엉망이된다. 도와 줘서 고마워!제도 케이스 오류

(define files 
    (lambda (reading n) 
    (begin 
     (define in (open-input-file reading)) 
     (let loop ((lines 0) 
     (words 0) 
     (chars 0) 
     (port (read-char in))) 
     (case (port) 
     ((#\newline) 
      (loop (+ lines 1) words (+ chars 1) (read-char in))) 
     ((#\space #\tab) 
      (loop lines (+ words 1) (+ chars 1) (read-char in))) 
     (else (loop lines words (+ chars 1) (read-char in))))) 
    (close-input-port in) 

    (display lines) 
    (display " ") 
    (display words) 
    (display " ") 
    (display chars) 
    (newline) 
    (display "Top ") 
    (display n) 
    (display " word(s):") 
    (newline) 
    '()))) 
+0

[동료 사용자가 삭제 된 질문으로 인해 혼란에 빠졌습니다] (http://meta.stackexchange.com/questions/129578/) question-deleted-while-writing-answer). – sarnold

답변

2

문제는 다행히도 쉽게 해결할 수 있습니다. 당신은 서면으로 작성했습니다 :

(case (port) ...) 

하지만 기능 port를 호출 한 결과에 case 않습니다. 물론, port는 캐릭터의 함수가 아니므로 그냥 원하는 :

(case port ...) 
+0

고마워요. 문제가 해결되었지만, 지금은 또 다른 문제가 있습니다 ... 디스플레이 등으로이 새로운 것을 사냥 할 수 있습니다. – AmberWolfe

+1

이 답변이 도움이된다면, 답을 옆에있는 체크 표시를 클릭하여 "수락"하십시오. –

0

어떻게 당신이 파일의 끝에 도달 한시기를 알 "루프하자"는 무엇입니까? read-char는 끝 부분에 도달하면 무엇을 반환합니까? 힌트 : eof-object에 대해 읽었습니까? 술부. 술어는 #t 또는 #f를 리턴하는 함수입니다. 이 술어를 사용하기 위해 대문자가 아닌 cond를 사용해야 할 수도 있습니다.

또한 lines, chars 및 words 변수는 let의 로컬 변수이므로 "외부"로 인쇄 할 수 없습니다. (힌트 : (eof-object? port)가 #t를 반환하면 루프 안에 출력하십시오.

스타일 quibble : read-char가 반환하는 char에 "port"이름을 사용하지 마십시오. 포트 (파일 핸들), 아마도 "포트"대신 "채널"사용할 수 있습니다.

관련 문제