byte-compilation – Defun inside let con enlace léxico da una advertencia de compilación de bytes "no se sabe que la función esté definida"

Pregunta:

Quiero obtener el efecto de una variable estática usando defun dentro de let con enlace léxico para crear un cierre. Sin embargo, al compilar el archivo en bytes, aparece una advertencia. ¿Estoy haciendo algo mal o, si no es así, hay alguna forma de suprimir esta advertencia?

He creado un MCVE:

;; -*- lexical-binding: t -*-

(let ((count 0))
  (defun increase-count ()
    (interactive)
    (setq count (1+ count))
    (message "Count is: %d" count))

  ;; The warning happens here.
  (increase-count))

El código funciona como se esperaba: la función increase-count imprime "El recuento es: n" donde n aumenta cada vez que se llama. Sin embargo, al compilar este archivo en bytes, aparece la siguiente advertencia:

In end of data:
mcve.el:11:1:Warning: the function ‘increase-count’ is not known to be
    defined.

Me parece que el increase-count siempre debe definirse antes de que se llame al final del bloque let. ¿No es este el caso?

Respuesta:

La forma del compilador de bytes para decidir si una función será definida o no es muy "ingenua" y se engaña incluso en su caso "obvio". Pero puede escribirlo de una manera que le permita al compilador entender lo que sucede:

(defalias 'increase-count
  (let ((count 0))
    (lambda ()
      (interactive)
      (setq count (1+ count))
      (message "Count is: %d" count))))

Por supuesto, sería incluso mejor mejorar la lógica del compilador de bytes: los parches son bienvenidos para eso.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım