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

时间:2016-09-24 08:50:07

标签: emacs lisp-macros

我想要这段代码:

choice = 2; changeRGB(img, choice);

做同样的事情:

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

我试过这个(来自This question):

(defun foobar ())

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

由于

2 个答案:

答案 0 :(得分:0)

我无法使用make-my-function宏重新创建您的问题,但请使用backquote进行尝试:

(defmacro make-my-function (name)
  `(defun ,(intern (format "my-%s-function" name)) ()
    'interactive
    '(message "It works!")))

答案 1 :(得分:0)

你的宏工作正常。你是怎么试图调用它的?您应该这样调用: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) ,其值是一个字符串。

如果是这种情况,请使用:

EXT:fluid_styled_content/Resources/Private/Partials/Mediagallery.html

我无法想象这样一个用例,但我怀疑这也不是你想做的事情。您似乎没有详细说明所需行为是什么。