2017-05-21 9 views
0

guile 1.8 또는 guile 2를 사용하여 다음 코드는 EOF를 읽습니다. 이것이 추출물 인 더 큰 프로그램에서 이것이 갖는 효과는 이전에 읽은 데이터를 겉으로보기에는 손상시키는 것입니다. read-line을 사용하고 있거나 eof-object를 잘못 테스트하고 있습니까?Guile Scheme read-reading from EOF

1 
2 
3 
# comment line 
4 
5 
1 
2 
3 
# comment line 
4 
5 
1 
2 
3 
# comment line 
4 
5 

그것은 명시하는 문제에 대한 긴 몇 줄보다 더 할 필요가 : 여기

(use-modules (ice-9 rdelim)) 

(define f 
    (lambda (p) 
    (let loop ((line (read-line p))) 
     (format #t "line: ~a\n" line) 
     (if (not (eof-object? (peek-char p))) 
     (begin 
     (let ((m (string-match "^[ \t]*#" line))) 
      (if m 
      (begin 
       (format #t "comment: ~a\n" (match:string m)) 
       (loop (read-line p)) 
      ))) 
     (format #t "read next line\n") 
     (loop (read-line p))))))) 

(define main 
    (lambda() 
    (let ((h (open-input-file "test"))) 
     (f h)))) 

는 최소한의 샘플 더미 입력 파일입니다. 코드 예제의 길이는 사과하지만이 문제는 코드가 복잡해지면 발생합니다 (작지만).

+0

주요 문제는 그 사실 것 같다을 의견을 찾으면 반복마다 _ 두 줄을 읽습니다. 솔루션을 구성하는 다른 방법에 대한 내 대답을 확인하십시오. –

답변

1

나는 프로 시저를 다시 작성하는 것이 좋습니다. 파일과 루프를 읽는 올바른 방법이 아닌 것 같습니다. 시도하십시오이 하나를 샘플 입력으로

(define (f) 
    (let loop ((line (read-line))) 
    (if (not (eof-object? line)) 
     (begin 
      (format #t "line: ~a\n" line) 
      (let ((m (string-match "^[ \t]*#" line))) 
      (if m (format #t "comment: ~a\n" line))) 
      (format #t "read next line\n") 
      (loop (read-line)))))) 

(define (main) 
    (with-input-from-file "test" f)) 

콘솔에 (main) 인쇄 다음과 같은 출력, 희망이 예상 무엇 전화 :

line: 1 
read next line 
line: 2 
read next line 
line: 3 
read next line 
line: # comment line 
comment: # comment line 
read next line 
line: 4 
read next line 
line: 5 
read next line 
line: 1 
read next line 
line: 2 
read next line 
line: 3 
read next line 
line: # comment line 
comment: # comment line 
read next line 
line: 4 
read next line 
line: 5 
read next line 
line: 1 
read next line 
line: 2 
read next line 
line: 3 
read next line 
line: # comment line 
comment: # comment line 
read next line 
line: 4 
read next line 
line: 5 
read next line 
+0

Guile 1.8에는 놀라 울 정도는 없지만. 물론 이들을 작성하거나 대체 논리를 사용할 수 있습니다. – andro

+0

@andro 나는 그것을 몰랐다. 저기, 고정되어있어. 그 이외에, 당신을 위해이 일을 했습니까? –

+0

조각이 잘 작동합니다. 그러나이 문제는 더 미묘한 것으로 보인다. 내가하고있는 일은 패턴 일치를위한 줄을 검사하고 일치에 대한 계산을 수행하는 작은 파서를 작성한 다음 다음 줄을 얻고 싶습니다. 다음 줄을 얻으려고합니다. 루프를 다시 호출하여 루프 값을 제공합니다. read-line으로 입력을 읽는 중. 즉, 일종의 '다음'제어 양식입니다. 그러한 진술을 많이 추가하면 계획이 예측할 수없는 방식으로 작동합니다. 이 방법으로 루프에서 빠져 나와 다음 반복으로 돌아갈 수 없습니까? – andro