2012-07-03 30 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