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-"
foobar-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 实习符号名称)。
我正在尝试为我的包实现带有可自定义前缀的用户命令别名。我写了两个嵌套的宏来完成这个。 trs-defalias-from-suffix 宏 returns 是正确的值,就像创建了别名一样,但是当我使用 M-x 搜索它时 none 存在。但是,当我使用 C-x C-e 手动执行 macroexpand 输出时,代码有效。它创建一个别名。
据我所知,这是不可能的。另外,可能有更好的方法来实现我的目标。
我想知道如何使宏工作,and/or一种更好的方法来制作可定制的前缀别名。
目标是取原函数
trs-refile
并使用不同的前缀创建别名,例如 "foobar-"
foobar-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
这些是类似的问题,可能已经包含答案:
然而,在我深入学习宏之前,我很高兴知道我正朝着正确的方向前进。
make-symbol
returns 一个 uninterned 符号。
使用intern
获取规范的内部符号。
符号的 打印表示 在两种情况下都是相同的(即符号的名称),这就是为什么评估 macroexpand
输出的打印表示会给出一个不同的结果(因为 lisp reader 实习符号名称)。