У меня проблема с макросом lisp. Я хотел бы создать макрос , который генерирует случай переключения в соответствии с массивом.Макро и пересечение массива
Вот код для создания переключателя случая:
(defun split-elem(val)
`(,(car val) ',(cdr val)))
(defmacro generate-switch-case (var opts)
`(case ,var
,(mapcar #'split-elem opts)))
я могу использовать его с кодом, как это:
(generate-switch-case onevar ((a . A) (b . B)))
Но когда я пытаюсь сделать что-то вроде этого:
(defparameter *operators* '((+ . OPERATOR-PLUS)
(- . OPERATOR-MINUS)
(/ . OPERATOR-DIVIDE)
(= . OPERATOR-EQUAL)
(* . OPERATOR-MULT)))
(defmacro tokenize (data ops)
(let ((sym (string->list data)))
(mapcan (lambda (x) (generate-switch-case x ops)) sym)))
(tokenize data *operators*)
У меня ошибка: *** - MAPCAR: A proper list must not end with OPS
, но я не понимаю, почему.
Когда я печатаю тип ops
Я получаю SYMBOL
Я ожидал CONS
, это связано?
Кроме того, для моей функции tokenize
, сколько раз вычисляется лямбда (или макрос расширяется)?
Спасибо.
Использование 'MACROEXPAND-1', чтобы увидеть, какой код генерирует макрос. – Svante
Что вы пытаетесь сделать? Что такое 'data', и что вы хотите вернуть tokenize'? – Svante
[13]> (macroexpand-1 '(generate-switch-case + ((+. "PLUS")))) (CASE + ((+' "PLUS"))); – Thomas