Résumé de comp.lang.lisp:
Une explication de Steven Haflich
La langue ne définit pas de manière portable pour étendre l'ensemble des formats directives (autres) puis ~/.../
mais ce n'est pas vraiment la question ici. Le vrai problème est qu'il n'est pas bien défini pour appeler finish-output
ou des fonctions similaires à des endroits arbitraires pendant l'impression.
Si jolie impression est en cours, le flux reçu par une méthode pprint-dispatch
ou print-object
peut être un flux d'encapsulage - qui retarde la sortie temporairement jusqu'à ce qu'il puisse prendre des décisions sur les blancs et sauts de ligne. (Il y a aussi des problèmes potentiels si finish-output
ont été appelés dans une justification ~<
, mais cette directive est une boule de poils!) Que peut-on attendre finish-output
à faire si elle est appelée dans une jolie opération d'impression? Je ne pense pas que ce soit bien défini.
Le problème n'est pas particulier au format, bien sûr, mais une directive pour finish-output
du format serait tout simplement ajouter un autre bord tranchant à la langue . finish-output
etc. sont seulement sûr d'appeler quand complètement en dehors d'un appel réel ou implicite à cl:write
. Appelez-le comme une fonction à un point approprié dans votre code (où vous savez que l'exécution n'est pas à l'intérieur d'une écriture imbriquée) de sorte que l'intention est claire et vous ne confondez pas internes de l'imprimante.
Une suggestion de Rob Warnock
En fait, aucun changement à format
sont nécessaires. Il suffit d'ajouter cette fonction quelque part dans le COMMON-LISP-USER package:
(defun fo (stream arg colon-p atsign-p &rest params)
(declare (ignore arg params))
(cond
(colon-p (force-output stream))
(atsign-p (clear-output stream))
(t (finish-output stream))))
Puis:
(progn
(format t "enter var: ~/fo/" nil)
(read))
enter var: 456
456
Les problèmes avec ce ( portable!) Approche sont
- verbosité (
~/fo/
au lieu de ~=
)
- besoin de consommer un argument de format (
nil
dans l'exemple ci-dessus)
-entrée Effacer pourrait peut-être être utile avec des flux bidirectionnels? – coredump