Chcę uzyskać efekt zmiennej statycznej, używając defun
wewnątrz let
z leksykalnym wiązaniem do utworzenia zamknięcia. Jednak podczas kompilacji bajtowej pliku pojawia się ostrzeżenie. Czy robię coś złego, a jeśli nie, czy istnieje sposób na stłumienie tego ostrzeżenia?
Stworzyłem 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))
Kod działa zgodnie z oczekiwaniami: funkcja wyświetla increase-count
„Count is: n”, gdzie n zwiększa się za każdym razem, gdy jest wywoływane. Jednak podczas kompilacji bajtowej tego pliku pojawia się następujące ostrzeżenie:
In end of data:
mcve.el:11:1:Warning: the function ‘increase-count’ is not known to be
defined.
Wydaje mi się, że increase-count
należy to zawsze zdefiniować, zanim zostanie wywołane na końcu let-block. Czy tak nie jest?
defun
nie robi tego, co myślisz, zawsze tworzy definicję najwyższego poziomu. W końcu Elisp nie jest Schematem ...