(其他人已回答你的直接问题灰。但是,这可能会回答你的问题背后的问题,并说出你真正想做的事情。如果不是看到其他的答案。)
你做不需要一个宏可言,做你想做的。只需使用defalias
或fset
即可。每个是函数。
(defun foo (cmd &optional search)
(let ((fn (intern (concat "fn-" cmd))))
(defalias fn `(lambda (&optional args)
(let ((str (symbol-name ',fn))
,@(when search
'((dir "~"))))
(message "Called %S from %S" str
(or (and (bound-and-true-p 'dir) dir)
default-directory)))))))
(dolist (x '("f1" "f2")) (foo x))
然后(symbol-function 'fn-f1)
回报:
(lambda (&optional args)
(let ((str (symbol-name 'fn-f1)))
(message "Called %S from %S" str (or (and (bound-and-true-p dir) dir)
default-directory))))
如果您使用词汇结合(即,将局部变量绑定-*- lexical-binding: t -*-
置于定义此代码的文件的顶部,然后您不需要任何反引号。例如:
(defun foo (cmd &optional search)
(let ((fn (intern (concat "fn-" cmd))))
(defalias fn (lambda (&optional args)
(let ((str (symbol-name fn))
(dir (if search "~" default-directory)))
(message "Called %S from %S" str dir))))))
(dolist (x '("f1" "f2")) (foo x))
如果你这样做,那么每个功能fn-f1
和fn-f2
被定义为一个封闭,它看起来像这样:
(symbol-function 'fn-f1)
(closure
((fn . fn-f1)
(search)
(cmd . "f1")
t)
(&optional args)
(let ((str (symbol-name fn))
(dir (if search "~" default-directory)))
(message "Called %S from %S" str dir)))
而且(foo "f3" :SEARCH)
定义一个函数fn-f3
(封闭)封装否则自由变量search
与非nil
值:SEARCH
的绑定,使得局部变量dir
变为绑定到"~"
:
(symbol-function 'fn-f3)
(closure
((fn . fn-f3)
(search . :SEARCH) ;; <==============
(cmd . "f3")
t)
(&optional args)
(let ((str (symbol-name fn))
(dir (if search "~" default-directory)))
(message "Called %S from %S" str dir)))