defalias 的嵌套宏不起作用,但 macroexpand 输出有效? - Emacs Elisp

Nested macros for defalias don't work, but macroexpand output works? - Emacs Elisp

我正在尝试为我的包实现带有可自定义前缀的用户命令别名。我写了两个嵌套的宏来完成这个。 trs-defalias-from-suffix 宏 returns 是正确的值,就像创建了别名一样,但是当我使用 M-x 搜索它时 none 存在。但是,当我使用 C-x C-e 手动执行 macroexpand 输出时,代码有效。它创建一个别名。

据我所知,这是不可能的。另外,可能有更好的方法来实现我的目标。

我想知道如何使宏工作,and/or一种更好的方法来制作可定制的前缀别名。

目标是取原函数
trs-refile
并使用不同的前缀创建别名,例如 "foobar-"
foob​​ar-refile

如果这看起来是一个奇怪的目标,那是因为我想要一个短前缀,但需要将 "trs-" 更改为更长的内容才能被 MELPA 接受。

#+begin_src elisp
(setq trs-alias-prefix "foobar") ; an example value, because I didn't include the defcustom code.

(defun trs-alias-oldname (suffix)
  "Reconstruct original function name from SUFFIX."
  (make-symbol (concat "trs-" suffix)))
(defun trs-alias-newname (suffix)
  "Make new function name from SUFFIX."
  (make-symbol (concat trs-alias-prefix "-" suffix)))
(defun trs-alias-name-list (suffix)
  "Make a list of new and old function names from SUFFIX."
  (list (trs-alias-newname suffix) (trs-alias-oldname suffix)))

(defmacro trs-defalias-from-names (newname oldname)
  "Make a defalias with NEWNAME and OLDNAME."
  `(defalias ',newname ',oldname))

(defmacro trs-defalias-from-suffix (suffix)
  "Make a defalias from SUFFIX."
  (let ((trs-alias-name-list (trs-alias-name-list suffix)))
    `(trs-defalias-from-names ,(car trs-alias-name-list) ,(nth 1 trs-alias-name-list))))

(trs-defalias-from-suffix "refile")
(trs-defalias-from-suffix "refile-up")
(trs-defalias-from-suffix "delete-this-buffer-and-file")
(trs-defalias-from-suffix "store-link-fold-drawer")
(trs-defalias-from-suffix "dired-zinks")
(trs-defalias-from-suffix "duplicate-heading-to-other-window")
(trs-defalias-from-suffix "region-ends-n-newlines")

(macroexpand '(trs-defalias-from-suffix "refile")) ; this returns the same as below
(defalias (quote leo-refile) (quote trs-refile)) ; this works
#+end_src

这些是类似的问题,可能已经包含答案: elisp macro to write a function?

然而,在我深入学习宏之前,我很高兴知道我正朝着正确的方向前进。

make-symbol returns 一个 uninterned 符号。

使用intern获取规范的内部符号。

符号的 打印表示 在两种情况下都是相同的(即符号的名称),这就是为什么评估 macroexpand 输出的打印表示会给出一个不同的结果(因为 lisp reader 实习符号名称)。