2012-07-03 67 views
1

我正在試驗Scheme(MIT/GNU計劃9.1),並且正在編寫一些簡單的程序來讀取和寫入文件。來自計劃文件(MIT/GNU計劃)的讀線

爲了讀取包含在一個文件中的所有線路,我寫了下面的列表:

(define read-lines-from-port-impl 
     (lambda (file-input-port) 
       (let* ((line (read-line file-input-port)) 
        ) 
         (if (eof-object? line) 
          (list) 
          (cons line (read-lines-from-port-impl file-input-port)) 
        ) 
       ) 
     ) 
) 


(define read-lines-from-port 
     (lambda (file-port) 
       (if (input-port? file-port) 
        (read-lines-from-port-impl file-port) 
        (list) 
       ) 
     ) 
) 


(define read-lines-from-file 
     (lambda (filename) 
       (call-with-input-file filename read-lines-from-port) 
     ) 
) 

問題1

這似乎是工作,但也許有一個更地道/簡明的做法 這在Scheme中。你能建議如何改進這個代碼?

問題2

在上面的代碼我已經使用呼叫與輸入文件,其負責打開一個 輸入端口的呼叫讀線-從端口之前和之後,關閉它的程序 已完成。

如果我想使用開放輸入文件和關閉輸入端口來打開和關閉輸入端口,我將如何在Scheme中編寫此代碼?我的意思是我要

  • 調用open-輸入文件
  • 讀取產生的口線
  • 調用close-輸入端口

在Haskell我會用做記號,但是我如何在Scheme中指定這樣的一系列操作?

回答

2

我沒有測試此代碼,但即使我做錯了什麼,你應該能夠從這裏找到答案:

; read-lines [port-or-filename] -- defaults to current input 
(define (read-lines . args) 
    (let ((p (cond ((null? args) (current-input-port)) 
       ((port? (car args)) (car args)) 
       ((string? (car args)) (open-input-file (car args))) 
       (else (error 'read-lines "bad argument"))))) 
    (let loop ((line (read-line p)) (lines (list))) 
     (if (eof-object? line) 
      (begin (if (and (pair? args) (string? (car args))) 
        (close-input-port p)) 
       (reverse lines)) 
      (loop (read-line p) (cons line lines)))))) 

你寫使用begin語句序列,如上圖所示。

+0

我是初學者,所以我不會想出讓自己。我想我會設法讓你的片段工作。非常感謝提示。 – Giorgio