Reelaboración
Este paso corrige un comportamiento sutil en el ejemplo de mensajería.
Estábamos pasando la cadena “¡Hola mundo!\n” como mensaje. El “\n” es un tipo especial de carácter, un carácter de “escape”. Le indica a la impresión de salida que comience una nueva línea. En Scheme, también forzará que un mensaje enviado a la barra de estado aparezca como un cuadro GUI.
El ayudante send-to-gui envía mensajes a un cuadro de diálogo de Lumi.
Actualice el contenido y los destinos del mensaje para que el ejemplo se comporte de forma coherente.
Eliminando el carácter de escape y ampliando las funciones:
#!/usr/bin/env lumi-scheme-interpreter-0.1
(load "/path/to/your/messaging.scm")
(define (scheme-hello-world)
(let ((message "Hello world!"))
(send-message message 'dialog-box)
(send-message message 'status-bar)
(send-message message 'error-console)
(send-message message 'terminal)))
(scheme-register-procedure "scheme-hello-world"
"Hello world!"
"A Scheme procedure plug-in refactored"
"Mark Sweeney"
"Under GNU GENERAL PUBLIC LICENSE Version 3"
"2024")
(scheme-menu-register
"scheme-hello-world"
"<Image>/Funky")Reemplace los números mágicos con las constantes proporcionadas por Lumi (por ejemplo, MESSAGE-BOX y ERROR-CONSOLE).
Luego divida la validación en dos funciones para que pueda reutilizarse desde múltiples sitios de llamadas.
- (¿es-cadena-válida?) Para verificar que una cadena sea una cadena y no una cadena vacía, dentro de una función de envío a*.
- (¿es-válida-visualización-de-salida?) Para verificar que un destino de salida determinado sea válido, en la función de enviar-mensaje.
Reelaborar la biblioteca:
(define (send-to-status-bar message)
(is-valid-string? message)
(lumi-message-set-handler MESSAGE-BOX)
(lumi-message message)
(lumi-message-set-handler ERROR-CONSOLE))
(define (send-to-dialog-box message)
(is-valid-string? message)
(lumi-message-set-handler MESSAGE-BOX)
;; Añadir un salto de línea para forzar un cuadro de mensaje
(lumi-message (string-append message "\n"))
(lumi-message-set-handler ERROR-CONSOLE))
(define (send-to-error-console message)
(is-valid-string? message)
(lumi-message-set-handler ERROR-CONSOLE)
(lumi-message message))
(define (send-to-terminal message)
(is-valid-string? message)
(display message)
(lumi-message-set-handler ERROR-CONSOLE))
;; Propósito: Envía un mensaje al destino de salida adecuado
(define (send-message message output)
(is-valid-output-display? output)
(cond
((eq? output 'error-console) (send-to-error-console message))
((eq? output 'dialog-box) (send-to-dialog-box message))
((eq? output 'status-bar) (send-to-status-bar message))
((eq? output 'terminal) (send-to-terminal message))))
;; Propósito: Comprueba que el mensaje es una cadena no vacía
(define (is-valid-string? message)
;; Comprobar si el mensaje es una cadena no vacía
(if (or (not (string? message)) (string=? message ""))
(error "Message must be a non-empty string")))
;; Propósito: Comprueba que el mensaje se envía a una salida válida
(define (is-valid-output-display? output)
;; Comprobar si la salida es uno de los destinos de visualización esperados
(if (not (member output '(dialog-box status-bar error-console terminal)))
(error "Invalid output destination: " output)))Conclusión
Al reelaborar nuestra biblioteca de mensajes, la hemos hecho más sólida y confiable. Solucionamos el problema oculto con el carácter de nueva línea, introdujimos constantes para una mayor claridad y ampliamos la funcionalidad agregando soporte para la barra de estado y las salidas del cuadro de diálogo. Además, separar la lógica de validación en funciones más pequeñas y enfocadas garantiza que nuestro código sea más fácil de mantener y ampliar en el futuro.
Esta revisión demuestra cómo pequeños cambios pueden mejorar la estructura general y la funcionalidad de nuestra biblioteca, allanando el camino para una mayor flexibilidad y reutilización a medida que nuestro proyecto crece.