2

我想要这个代码:

(setq name "foobar")
(defun (intern name) ())

做同样的事情:

(defun foobar ())

我试过这个(来自这个问题):

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

但是我得到了一个名为 my-name-function 的函数,但我想要 my-foobar-function。我的目标是从键盘映射列表中定义未成年人模式。

谢谢

4

2 回答 2

0

我无法用你的make-my-function宏重新创建你的问题,但用反引号试试:

(defmacro make-my-function (name)
  `(defun ,(intern (format "my-%s-function" name)) ()
    'interactive
    '(message "It works!")))
于 2016-09-24T13:15:40.237 回答
0

你的宏工作正常。你是如何尝试调用它的?你应该像这样调用:(make-my-function foo). 然后M-: (symbol-function 'my-foo-function)向您展示函数定义:

(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)

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

于 2016-09-24T14:39:03.107 回答