2017-08-21 1 views
4

J'ai remarqué qu'il n'y a pas de format directive qui appel force-output/finish-output.Appelez finition-sortie à partir du format

Pourquoi?

Cela semble utile dans l'interaction avec l'utilisateur, cf. Lisp format and force-output.

E.g., ~= pourrait se traduire par finish-output, et ~:= à force-output. Je ne pense pas clear-output a beaucoup de sens dans ce contexte, mais nous pourrait mapper [email protected]= pour l'exhaustivité.

PS. Cf. CLISP RFE.

+0

-entrée Effacer pourrait peut-être être utile avec des flux bidirectionnels? – coredump

Répondre

2

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)