Ho definito alcune semplici funzioni in init.el, ad esempio my-cache-file
:
(defconst my-cache-directory
(expand-file-name ".cache" user-emacs-directory)) ; ~/.emacs/.cache
(defun my-cache-file (x)
(expand-file-name x my-cache-directory)) ; ~/.emacs/.cache/x
(setq savehist-file
(my-cache-file "savehist"))
(setq backup-directory-alist
`(("." . ,(my-cache-file "backups/"))))
Sembrava un buon caso d'uso per defsubst
:
(defsubst my-cache-file (x) ...)
Poi ho iniziato a conoscere la compilazione e volevo ottimizzare ulteriormente. Ho ingenuamente provato:
(defsubst my-cache-file (x)
(eval-when-compile (expand-file-name x my-cache-directory)))
ma il compilatore si è lamentato (giustamente) della variabile libera x
, quindi ho inserito il codice chiamante:
(setq savehist-file
(eval-when-compile (my-cache-file "savehist")))
(setq backup-directory-alist
`(("." . ,((eval-when-compile (my-cache-file "backups/"))))
Tuttavia, l'ultimo chiamante dovrebbe probabilmente valutare l'intero elenco al momento della compilazione, quindi ho tirato eval-when-compile
su:
(setq backup-directory-alist
(eval-when-compile `(("." . ,(my-cache-file "backups/")))))
Vorrei evitare di sporcare il mio codice con più eval-when-compile
chiamate del necessario e mi chiedo se c'è un approccio migliore che potrei adottare usando le macro o define-inline
. La documentazione rende il define-inline
suono promettente:
Le funzioni definite tramite define-inline presentano numerosi vantaggi rispetto alle macro definite da defsubst o defmacro:
- Possono essere passati a mapcar (vedi Funzioni di mappatura).
- Sono più efficienti.
- Possono essere utilizzati come moduli di luogo per memorizzare valori (vedere Variabili generalizzate).
- Si comportano in modo più prevedibile di cl-defsubst (vedi Elenchi di argomenti nelle estensioni Lisp comuni per GNU Emacs Lisp).
Ma la sintassi sembra ingombrante e non riesco a trovare un singolo esempio di come viene utilizzato in natura. Né posso trovare alcuna spiegazione della sua affermazione che defsubst è meno efficiente.
Qualcuno ha usato define-inline
o c'è un'altra macro che dovrei esaminare o dovrei semplicemente attenermi defsubst
?
defmacro
o unadefine-inline
soluzione, quindi probabilmente mi prenderò cura di loro. Sarebbe bello avereval-when-compile
inserito l'espressione risultante.