Prolog にて ローンパターン(Loan Pattern) を後述のように実装しましたが、より簡潔に書けないものでしょうか?

ここでの ローンパターンは、 リソースの解放を忘れないようにする仕組み を意図しています。 ( C#でいう using ステートメントJavaでいう try-with-resources ステートメント が近いかもしれません。 )


特に以下の点について、疑問が残りました。

  • 毎度 print_each のような定義をしない方法はないか
  • repeat の部分を簡潔に書けないか?
  • (そもそもこれはローンパターンになっているのか?)
main :-
    writeln('# Open!'),

    % 'test.txt' を開き、print_each 述語で処理する。
    open_each('test.txt', print_each),

    writeln('# Closed!').

% ファイルを読み込むごとに呼ばれる述語
% 【疑問点】毎度 print_each の定義しなければならないものか?
print_each(Term) :-
    % some process here...
    % 
    printf('%t', [Term]), nl.

open_each(FileName, Do) :-
    open(FileName, read, Stream),

    % 【疑問点】とくに以下は簡潔に書けないか?
    repeat,
    ( at_end_of_stream(Stream)
    ->  !
    ;   read(Stream, Term),
        call(Do, Term), 
        fail
    ),

    close(Stream).

:- main, halt.

以下は test.txt の中身です。

text(foobar).
text(fuba).
text(abafu).
text(syzzy).

実行例は以下のようになります。

# Open!
text(foobar).
text(fuba).
text(abafu).
text(syzzy).
# Closed!

環境: SWI-Prolog version 5.10.4 for amd64 です。

※ より Prolog らしいコードや用語の誤りなどありましたらコメントなどでご指摘お願いします