format common-lisp bufferedstream

Llamar acabado-salida del formato



common-lisp bufferedstream (1)

Resumen de comp.lang.lisp :

Una explicación de Steven Haflich

El lenguaje no define una forma portátil de extender el conjunto de directivas de formato (aparte de ~/.../ ), pero ese no es realmente el problema aquí. El verdadero problema es que no está bien definido llamar a finish-output o funciones similares en lugares arbitrarios durante la impresión.

Si la impresión bonita está en progreso, la transmisión recibida por un pprint-dispatch print-object o de print-object puede ser una secuencia encapsuladora, que retrasa la salida temporalmente hasta que pueda tomar decisiones sobre el espacio en blanco y los saltos de línea. (También hay problemas potenciales si se llamó a finish-output dentro de una justificación ~< , ¡pero esa directiva es una bola de pelo!) ¿Qué esperaríamos que hiciera finish-output si se llama dentro de una bonita operación de impresión? No creo que esté bien definido.

El problema no es particular al formato, por supuesto, pero una directiva para finish-output del formato simplemente agregaría otro borde afilado al lenguaje. finish-output etc. solo es seguro llamar cuando está completamente fuera de una llamada real o implícita a cl:write . Llámelo como una función en un punto apropiado de su código (donde sabe que la ejecución no está dentro de una escritura anidada), por lo que la intención es clara y no se arruinan las partes internas de la impresora.

Una sugerencia de Rob Warnock

En realidad, no se necesitan cambios en el format . Simplemente agregue esta función en algún lugar del paquete COMMON-LISP-USER :

(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))))

Entonces:

(progn (format t "enter var: ~/fo/" nil) (read)) enter var: 456 456

Los problemas con este enfoque ( portátil ) son

  • verbosidad ( ~/fo/ lugar de ~= )
  • necesidad de consumir un argumento de formato ( nil en el ejemplo anterior)

Noté que no hay una directiva de format que llamaría force-output / finish-output .

¿Por qué?

Parece ser útil en la interacción del usuario, cf. Formato Lisp y salida de fuerza .

Por ejemplo, ~= podría traducirse en finish-output , y ~:= force-output . No creo que el resultado clear-output tenga mucho sentido en este contexto, pero podríamos mapear ~@= para completarlo.

PD. Cf. CLISP RFE .