1

stdout をファイルに永続的にリダイレクトしようとしていますが、これを行うことについて見つけることができるすべての例には、標準出力グローバルを使用して let 内または with-open-file 内で行うことが含まれます。アプリケーション全体のリダイレクトを行う方法はありますか?

編集:標準出力でリダイレクトを実行しようとした方法は次のとおりです:

(Setf *log* (open "/Users/Mike/Desktop/some.txt" :direction :output :if-exists :append))
(Setf *standard-output* *log*)
(print "Test")

probe-fileこれは REPL への出力を停止しますが、印刷呼び出しからのファイル (存在し、によって表示される) には何も表示されません。

編集:ドリブル機能を使用してみました:

(Dribble "/Users/Mike/Desktop/some.txt")

(format t "hello")

しかし、次のエラーが表示されます。

エラー: ジェネリック関数に適用できるメソッドがありません: #STANDARD-GENERIC-FUNCTION CCL::STREAM-SET-COLUMN #x30200006557F (引数を指定して呼び出された場合): (# 0) 実行中: #、プロセス Listener(11) 内。cmd-/ と入力して続行します。中止するには、cmd-\ で利用可能な再起動のリストを表示します。続行する場合: もう一度呼び出してみてください タイプ :? 他のオプションについて。

4

1 に答える 1

5

あなたの問題はバッファリングに関係していると思います。試してくださいforce-output

(force-output *log*)

ストリームを閉じると自動的にバッファがフラッシュされ、Lisp は通常、通常の終了時にストリームを閉じるので、実際には何も失われず、ディスクに表示されるまでに時間がかかることに注意してください。

さらに、Common Lisp REPL の相互作用は、1 つだけではなく、多くの異なるストリーム変数に対して行われることに注意してください(ただし、それらの多くは他の変数のエイリアスです)。

実際、セッションのログを保存したい場合 (つまり、REPL を画面に表示し、トランスクリプトをファイルに保存する)、標準機能が提供されてdribbleいます - 試してみてください!

于 2014-06-18T21:47:56.980 に答える