2016-07-23 7 views
0

Как заменить имя символа на функцию, созданную в макросе? Я думаю, что здесь нет ничего очевидного. Например, я пытаюсь сделать макрос, который определяет некоторые переменные и функции, аналогичные приведенным ниже,Заменить имя символа в макросе

(cl-defmacro mac (pkg) 
    (let (
     ;; Define some variables 
     (sym (intern (concat pkg "-file"))) 
     (sym-def "default-file.el") 
     (sym-doc (concat "A custom var from `" pkg "'.")) 
     ;; Define some functions 
     (symfn (intern (concat pkg "-fn"))) 
     (symfn-doc (concat "A function for `" pkg "'."))) 

    `(list 
     (defcustom ,sym ,sym-def ,sym-doc 
     :group (quote ,(make-symbol pkg)) 
     :type '(choice (const :tag "None" nil) 
         file)) 
     (defun ,symfn() 
     ,symfn-doc 
     (interactive) 
     (fn ,sym))))) 

Функция вернула делает вызов из другой функции (fn) с подписью как

(defun fn (var) (symbol-value var)) 

Таким образом, это ожидание вызова, например (fn 'some-var). И я хочу, чтобы иметь возможность использовать макрос как

(mac "pack") 

И имеют следующую работу,

pack-file ; works: "default-file.el" 
(pack-fn) ; error: not a symbol 

Я пытался что-то вроде (quote ,sym), symbol-name и другие ... Но не могу похоже, все правильно.

+1

Расширение макроса должно вероятно быть 'progn' форма, для одной вещи. Вероятно, вы хотите, чтобы вызов 'fn' был' (fn ', sym) '. (У меня нет ничего с elisp на нем, но все остальное выглядит нормально). – tfb

+0

Вы упомянули об этом в вопросе, поэтому я держал пари, что это была проблема с пальцами ... – tfb

ответ

1

Вы хотите, чтобы звонок fn был (fn ',sym) (о котором вы упомянули, что вы пробовали в вопросе, но я подозреваю, что у вас что-то получилось).

Возможно, вы также захотите, чтобы расширение макроса было (progn ...) вместо (list ...).

(Это было первоначально комментарий: Я помещаю его здесь просто так есть ответ.)

 Смежные вопросы

  • Нет связанных вопросов^_^