У меня проблема с макросом 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
сколько раз оценивается лямбда (или макрос расширяется)?
Спасибо.