【发布时间】:2011-11-18 08:25:15
【问题描述】:
我正在尝试编写一个可以生成一组函数的宏,我可以使用这些函数以更有效的方式访问项目目录。如果您查看以下宏,您应该很清楚我要做什么。
(defmacro create-project-cmd (project-name project-dir &optional subdir-list)
(if (null subdir-list)
`(fset (intern ,project-name) #'(lambda () (interactive) (dired ,project-dir)))
`(dolist (dir ,subdir-list)
(fset (intern (concat ,project-name "-" dir))
#'(lambda () (interactive) (dired (concat ,project-dir "/" dir)))))))
这里的问题是最后一行中的“dir”应该与 dolist 子句中的“dir”绑定。而且由于elisp中没有闭包,当我调用一个生成的函数时,它会抱怨dir is void。
从代码中可以看出,我伪造了“project-dir”的闭包。对于“dir”,我不能以同样的方式伪造它。尽管 lexical-let 可以让它在这里工作,但我试图避免它,因为它有一些内存问题,而且我不想养成使用它的习惯(也许我在这里太挑剔了)。
我没有很好的方法来处理这个问题。大家有什么好的建议吗?
【问题讨论】:
标签: emacs macros closures elisp