Такая задачка. Есть список вида
(("name1" "value1") ("name2" "value2") ... ("name_n" "value_n"))
"name_i" и "value_i" - строковые элементы, "name_i" - некоторый уникальный в пределах списка идентификатор (ключ), "value_i" - значение которое ассоциировано с ключом. n - достаточно велико
Нужен макрос вида
(with-values ((var-i "name_i")*) lst body*)
где lst - исходный список, var-i переменные в которые записывается значения "value_i" ассоциированные с "name_i". body - фрагмент программы из которого можно обращаться к переменным var-i.
Например
(let ((lst '(("name" "Ivan Pupkin") ("age" "21") ("sex" "male")))) (with-values ((name "name") (age "age")) (print name) (print age)))
Должно напечатать
"Ivan Pupkin" "21"
Мой кривой вариант:
(defmacro with-values ( decls ast body )
(let ((let-body nil) (when-body nil))
(dolist (decl decls) (push `(,(car decl) nil) let-body) (push `(when (string= (car l) ,(cadr decl)) (setq ,(car decl) (cadr l))) when-body))
(setq when-body (append '(progn) when-body))
(print `(let ,let-body (dolist (l ,ast) ,when-body) ,body))))
Внимание вопрос: А как это реализовать правильно ?
PS понимаю, что хеши для таких задач лучше подходят, но менять исходную структуру данных не могу :)