Emacs 使用字符串变量作为宏参数

Emacs 使用字符串变量作为宏参数,emacs,lisp-macros,Emacs,Lisp Macros,我想要这个代码: (setq name "foobar") (defun (intern name) ()) 做与以下相同的事情: (defun foobar ()) 我试过这个(从): 但是我得到了一个名为my name的函数,但是我想要我的foobar函数。我的目标是从keymap列表中定义模式 谢谢我无法用您的make my function宏重现您的问题,但请尝试以下方法: 您的宏工作正常。你是如何尝试调用它的?您应该这样调用:(使我的函数成为foo)。然后M-:(symbol函数'

我想要这个代码:

(setq name "foobar")
(defun (intern name) ())
做与以下相同的事情:

(defun foobar ())
我试过这个(从):

但是我得到了一个名为my name的函数,但是我想要我的foobar函数。我的目标是从keymap列表中定义模式


谢谢

我无法用您的
make my function
宏重现您的问题,但请尝试以下方法:


您的宏工作正常。你是如何尝试调用它的?您应该这样调用:
(使我的函数成为foo)
。然后
M-:(symbol函数'my foo函数)
显示函数定义:

(lambda nil
  (interactive)
  (message "It's work !"))
在定义宏之前,您最初的尝试不起作用的原因是
defun
是一个宏-它不计算其参数。因此
(defun(intern name)()
在语法上不正确:
defun
需要一个符号作为其第一个参数,
(intern name)
是一个列表,而不是一个符号


更新,在您的评论之后-

你的问题很不清楚。现在听起来像是要在一个上下文中调用
(make my function foo)
,其中有一个变量
my foo function
,其值是字符串

如果是这种情况,则使用以下方法:

(defmacro make-my-function (name)
  (list 'defun
        (intern (symbol-value (intern (format "my-%s-function" name))))
        ()
        (list 'interactive)
        '(message "It's work !")))

(setq my-foo-function "toto")
(make-my-function foo)

我无法想象这样一个用例,但我怀疑这也不是您想要做的。您似乎没有很好地指定所需的行为。

我想您误解了:我想这样调用我的宏:(将我的函数设为-variable-contain-the-name-as-string)而不是这样:(将我的函数设为foobar)我的主要问题是将字符串转换为符号宏不计算其参数,除非你告诉它。如果希望
(使我的函数a-variable-contain-the-name-as-string)
计算
a-variable-contain-the-name-as-string
,则宏体需要显式计算该参数。
(lambda nil
  (interactive)
  (message "It's work !"))
(defmacro make-my-function (name)
  (list 'defun
        (intern (symbol-value (intern (format "my-%s-function" name))))
        ()
        (list 'interactive)
        '(message "It's work !")))

(setq my-foo-function "toto")
(make-my-function foo)