1

私はScheme(MIT / GNU Scheme 9.1)を試していて、ファイルを読み書きするための簡単な手順をいくつか書いています。

ファイルに含まれるすべての行をリストに読み込むために、次のように記述しました。

(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

上記のコードでは、call-with-input-fileを使用しました。これは、read-lines-from-portを呼び出す前に入力ポートを開き、その手順が完了した後に閉じることを処理します。

open-input-fileとclose-input-portを使用して自分で入力ポートを開閉したい場合、Schemeでこれをどのように記述しますか?私はしなければならないことを意味します

  • open-input-fileを呼び出す
  • 結果のポートから行を読み取ります
  • close-input-portを呼び出す

Haskellではdo表記を使用しますが、Schemeでそのような一連のアクションを指定するにはどうすればよいですか?

4

1 に答える 1

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上記のように、を使用して一連のステートメントを記述します。

于 2012-07-03T21:21:38.777 に答える