Вызов defmacro с кавычкой - PullRequest
       6

Вызов defmacro с кавычкой

2 голосов
/ 18 августа 2010

У меня есть эта структура данных (в основном):

(setq ssm-list '(tasklist
  ((id . "10525295")
   (name . "Inbox")
   (sort_order . "0"))))

Это работает для получения имени:

(defun ssm-list-get-prop (list prop)
  (cdr (assoc prop (car (cdr list)))))

(ssm-list-get-prop slack-one-list 'name)

Что бы я хотел, это создать макрос, который создаст defun с именем ssm-list-name (или ssm-list-id), поскольку на самом деле в списке гораздо больше свойств.

Итак, я попробовал это:

(defmacro ssm-list-prop-defun (field)
  `(defun ,(intern (concat "ssm-list-" field))
      (one-list)
      (cdr (assoc ,field (car (cdr one-list))))))

(ssm-list-prop-defun 'name)
(ssm-list-prop-defun 'id)

Но последние два вызова с треском провалились с (wrong-type-argument characterp quote) Я пытался вставить symbol-name в макрос, но это не помогло.

Есть ли способ сделать это?

Ответы [ 2 ]

4 голосов
/ 18 августа 2010

Вы очень близки, незначительные правки дают вам рабочее решение. Проблема в том, что вы смешиваете символы и строки. Это будет работать:

(defmacro ssm-list-prop-defun (field)
                   ;; note that concat operates on strings
  `(defun ,(intern (concat "ssm-list-" field))
     (one-list)
          ;; note that you need a symbol here, so quote the 
          ;; result of the call to intern
          ;; and, if you're always using symbols, 
          ;; might as well use assq
     (cdr (assq ',(intern field) (car (cdr one-list))))))

;; pass in a string
(ssm-list-prop-defun "name")

А вот вариант, в котором используется символ:

;; variant that works off a symbol
(defmacro ssm-list-prop-defun (field)
  `(defun ,(intern (concat "ssm-list-" (symbol-name field)))
     (one-list)
     (cdr (assq ',field (car (cdr one-list))))))

(ssm-list-prop-defun name)
0 голосов
/ 18 августа 2010

Я думаю, что вы хотите прочитать о defstruct в пакете cl: (info "(cl) Structures") (или http://www.gnu.org/software/emacs/manual/html_node/cl/Structures.html#Structures)

...