2010-01-16 5 views
11

형식과 힘 출력 :리스프이 코드가 다른 구현에서 다르게 동작하는 이유를 이해하지 않습니다

예상되는대로 함께 프롬프트, 읽기 다음 인쇄 만에, 동작 CLISP에서
(format t "asdf") 
(setq var (read)) 

SBCL 읽으면 다음 출력. 나는 인터넷에서 비트를 읽고 변경 :

(format t "asdf") 
(force-output t) 
(setq var (read)) 

이 다시, CLISP에서 잘 작동하지만 SBCL에 여전히 다음, 출력을 읽고 . 심지어 다른 기능으로 분리하려고했습니다 :

(defun output (string) 
    (format t string) 
    (force-output t)) 
(output "asdf") 
(setq var (read)) 

그리고 여전히 읽은 다음 출력합니다. force-output을 올바르게 사용하지 않습니까? 아니면 SBCL의 단지 특이한 점입니까?

답변

22

FINISH-OUTPUT을 사용해야합니다.

버퍼링 된 출력 스트림이있는 시스템에서 일부 출력은 출력 버퍼가 가득 찰 때까지 출력 버퍼에 남아 있습니다 (출력이 자동으로 대상에 기록 될 때까지). 그렇지 않으면 출력 버퍼가 비게됩니다.

  • FINISH-OUTPUT 반환 모든 출력이 수행 될 수 있도록 시도하고 :

    커먼 리스프는 세 가지 기능이 있습니다.

  • FORCE-OUTPUT은 나머지 출력을 시작하지만 즉시 완료되고 모든 출력이 완료 될 때까지 기다리지 않습니다.

  • CLEAR-OUTPUT은 보류중인 출력을 삭제하려고 시도합니다.

또한 FORCE-OUTPUTFORMAT에서 T 불행하게도 동일하지 않다.

  • force-output/finish-output : T*terminal-io*하고 NIL*standard-output*

  • FORMAT입니다 :

    (format t "asdf") 
    (finish-output nil) ; note the NIL 
    (setq var (read)) 
    
    : T이 작동합니다 *standard-output*

입니다

+0

감사합니다. –

+0

또 다른 옵션은 [Practical Common Lisp] (http://www.gigamonkeys.com/book/practical-a-simple-database.html)에 따라 t 대신에'* query-io *'를 사용하는 것이다. 또는 없음. – lindes

관련 문제