2010-01-16 5 views
11

Je ne comprends pas pourquoi ce code se comporte différemment dans différentes implémentations:le format Lisp et la sortie de force

(format t "asdf") 
(setq var (read)) 

En CLISP il se comporte comme on pouvait s'y attendre, avec l'invite imprimée suivie par la lecture, mais SBCL lit, puis sorties. J'ai lu un peu sur Internet et changé:

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

Ce, encore une fois, fonctionne très bien dans CLISP, mais SBCL il encore se lit, puis les sorties. J'ai même essayé de le séparer en une autre fonction:

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

Et il lit encore, puis sort. Est-ce que je n'utilise pas correctement force-output ou est-ce juste une idiosyncrasie de SBCL?

Répondre

22

Vous devez utiliser FINISH-OUTPUT.

Dans les systèmes avec des flux de sortie tamponnés, il reste une certaine sortie dans le tampon de sortie jusqu'à ce que le tampon de sortie soit plein (alors il sera automatiquement écrit vers la destination) ou le tampon de sortie est explicitement vidé.

Common Lisp a trois fonctions: pour que

  • FINISH-OUTPUT, tente de faire en sorte que toute la production se fait et retourne ensuite.

  • FORCE-OUTPUT, commence la sortie restante, mais retourne IMMEDIATEMENT et n'attend PAS que toutes les sorties soient terminées.

  • CLEAR-OUTPUT, tente de supprimer toute sortie en attente.

également le T dans FORCE-OUTPUT et FORMAT ne sont malheureusement pas les mêmes.

  • force-output/finish-output: T est *terminal-io* et NIL est *standard-output*

  • FORMAT: T est *standard-output*

cela devrait fonctionner:

(format t "asdf") 
(finish-output nil) ; note the NIL 
(setq var (read)) 
+0

merci, cela a fonctionné! –

+0

Une autre option, selon [Practical Common Lisp] (http://www.gigamonkeys.com/book/practical-a-simple-database.html), est d'utiliser le global * * query-io * 'au lieu de t ou nul. – lindes

Questions connexes