2014-06-18 2 views
1

stdout을 파일로 영구적으로 리디렉션하려고 시도하지만이 작업에 대해 찾을 수있는 모든 예제는 let 내부 또는 open file 표준 출력 글로벌을 사용합니다. 응용 프로그램을 리디렉션 할 수있는 방법이 있습니까?CCL (Common Lisp) 파일에 stdout을 영구적으로 리디렉션

편집 :

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

이것은 REPL에 출력을 정지하지만, 아무것도 (존재 수행하고 probe-file으로 볼 수있는 파일에 표시하지 : 여기에 내가 표준 출력 리디렉션을 수행하려고했습니다 어떻게)를 호출합니다.

편집 : 나는 드리블 기능을 사용하여 시도했다 :

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

(format t "hello") 

을하지만 다음과 같은 오류 얻을 :

Error: There is no applicable method for the generic function: #STANDARD-GENERIC-FUNCTION CCL::STREAM-SET-COLUMN #x30200006557F when called with arguments: (# 0) While executing: #, in process Listener(11). Type cmd-/ to continue, cmd-. to abort, cmd-\ for a list of available restarts. If continued: Try calling it again Type :? for other options.

+0

'(setf * standard-output * ...)가 작동하지 않습니까? –

+0

@JoshuaTaylor 예, 제 질문에 대한 답변을 추가했습니다. 그것은 반발에 대한 출력을 멈추지 만, 그 파일에 int는 나타나지 않습니다. – Mike2012

+0

음, 출력을 생성해야하는 것은 표시되지 않습니다. 그렇게 한 후에 출력물을 생산하지 않는 것은 무엇입니까? 여러 스레드로 작업하고 있습니까? (예를 들어, SLIME을 쓰고 있다면 다중 쓰레드를 사용하지 않고서도 쓰레드 중 하나에서 \ * 표준 출력 *을 \ * log *으로 만 설정할 수 있습니다.) –

답변

5

내가 당신의 문제가 버퍼링과 관련이있다 생각합니다. force-output보십시오 : 폐쇄 스트림을 자동으로 버퍼를 플러시, 정상 종료에 일반적으로 가까운 스트림을 lisps, 그래서 아무것도 실제로 손실되지

(force-output *log*) 

참고, 그냥 디스크에 나타나는 시간이 걸립니다.

또한 Common Lisp REPL 상호 작용은 단지 하나가 아니라 many different stream variables을 통해 수행됩니다 (많은 경우 다른 사람의 별칭 임).

실제로 세션의 로그를 저장 (예 : REPL을 화면에 유지하고 사본을 파일에 저장)하려면 표준 시설이 dribble에 의해 제공됩니다. 시도해보십시오!

+0

고마워요! 이것은 작동하지만 아직 가지고있는 한 가지 문제는 실제로 파일에 푸시되기 전에 버퍼를 플러시해야한다는 것입니다. 오류 로깅을 위해이 기능을 사용하고 싶습니다. (오류 처리기에서 버퍼를 플러시 할 수 있기 때문에) 잡힌 오류가 발생해도 문제가 없습니다. 그러나 잡히지 않은 오류가 발생하면 로그에 누락 될 수 있습니다. 여하튼 모든 표준 출력을 강제로 플러시 할 수 있습니까? – Mike2012

+1

버퍼가'close'에서 플러시되므로 아무 것도 잃지 않습니다. 나는 집에서 양조 한 해결책을 진행하기 전에'드리블 '을 시도해 볼 것을 권장합니다. – sds

+0

귀하의 조언에 다시 한번 감사드립니다. 드리블을 사용해 보았지만 오류가 발생했습니다 (다른 편집에서 올렸습니다). 내가 드리블을 잘못 사용하지 않는다면, 드리블의 특정 구현과 관련이있을 것 같습니까? 로그 파일 경로 만 전달하는 것 같습니다. – Mike2012