eval-when-compile:defsubst vs defmacro vs define-inline
私はいくつかの単純な関数をinit.elで定義しました、例えば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/")))) これはの良いユースケースのように思われましたdefsubst: (defsubst my-cache-file (x) ...) その後、コンパイルについて学び始め、さらに最適化したいと思いました。私は単純に試しました: (defsubst my-cache-file (x) (eval-when-compile (expand-file-name x my-cache-directory))) しかし、コンパイラーは(正しく)フリー変数について不平を言ったxので、代わりに呼び出しコードをラップしました。 (setq savehist-file (eval-when-compile (my-cache-file "savehist"))) (setq backup-directory-alist `(("." . ,((eval-when-compile …