我正在优化我的emacs配置,可以为列表中的所有主题动态创建交互式功能。
以下是我尝试制作的结构的简化版本。
;; List containing names of functions that I want to create
(setq my/defun-list '(zz-abc
zz-def
zz-ghi))
;; Elisp macro to create an interactive defun whose name
;; is passed as the macro argument
(defmacro my/create-defun (defun-name)
`(defun ,defun-name ()
(interactive)
(let ((fn-name (symbol-name ',defun-name)))
(message "Testing creation of function %s" fn-name))))
;; Loop to call the above macro for each element in the list
;; DOES *NOT* WORK
(dolist (name my/defun-list)
(my/create-defun name))
但是,如果我手动展开循环,它将起作用:
;; WORKS
(my/create-defun zz-abc)
(my/create-defun zz-def)
(my/create-defun zz-ghi)
但是以下内容在我传递符号名称的地方不起作用(这可能是循环自行展开时发生的情况)。注意宏参数之前的引号。
;; DOES *NOT* WORK
(my/create-defun 'zz-abc)
(my/create-defun 'zz-def)
(my/create-defun 'zz-ghi)
更新资料
感谢@wvxvw的帮助,我终于可以正常工作了!
正如@wvxvw所建议的那样,我不会为任何用例批量生成defun。这是一个特殊的用例,对于一个名为的主题XYZ
,我想生成一个defun load-theme/XYZ
来完成以下任务:
- 禁用所有其他可能处于活动状态的主题
- 呼唤
load-theme
了XYZ
- 做更多与该主题相关的自定义工作;我通过列表为每个主题传递自定义设置
my/themes
。
@wvxvw我不明白这个建议。我只有一个defun创建宏,我想在一个循环中多次调用它。手动展开的示例旨在显示在我尝试找出此问题时有效的方法和无效的方法。我的目标是拥有列表而不是列表,并为各种主题创建交互功能。目前
—
Kaushal Modi 2015年
cons
,列表仅由es 组成,但我计划将其转换为具有每个主题的自定义属性的列表。
好吧,您调用了
—
奥马尔(Omar)
(my/create-defun name)
3次,因此您应该定义一个称为name
3次的函数。
defuns
放进去progn
。progn
允许为顶级形式(在某种意义上,适用于顶级形式的所有内容progn
也适用于其内容)。但是我会质疑以这种方式创建函数的原理:为什么不拥有一个以lambda作为值的has-table?