Привет.
Хочу решит такую задачу:
есть
(defstruct sensordata date press velo volume) ;в реальной задаче 24 слота, но я оставил 4 для удобства чтения
(defparameter *test-data* (list (make-sensordata
:date "8575" ;для моего вопроса совершенно не важно, дата здесь или нет
:press (read-from-string "1")
:velo (read-from-string "1")
:volume (read-from-string "1"))
(make-sensordata
:date "345345"
:press (read-from-string "2")
:velo (read-from-string "2")
:volume (read-from-string "2"))
(make-sensordata
:date "345345"
:press (read-from-string "3")
:velo (read-from-string "3")
:volume (read-from-string "3"))
))
предметная область (на 50% это статистические расчеты) требует частого вычисления выражений от аргументов, которые в свою очередь являются результатами вычисления выражений типа
(mapcar #'sensordata-press *test-data*)
Писать кучу однотипных функций не очень хочется, потому я попробовал написать макрос (пока что «в лоб», без различных проверок):
(defmacro map-function-on-structures-slot (function-name structure-name structure-slot-name list-of-structures)
(let ((slot-access-name (concatenate 'string (symbol-name structure-name) "-" (symbol-name structure-slot-name))))
`(,function-name `(function ,(intern ,slot-access-name)) ,list-of-structures)))
в результате вычисления
(map-function-on-structures-slot mapcar sensordata velo *test-data*)
#'SENSORDATA-VELO is not of type (OR
SYMBOL
FUNCTION), and can't be FUNCALLed or APPLYed
[Condition of type TYPE-ERROR]
Вопросы:
- как я понимаю, я меня типичная для «непонимающих» макросы ошибка. В чем она заключается и как её исправить?
- на сколько уместно выбрана структура данных (список состоящий из структур) для данной задачи (стат. обработка данных снятых с датчиков в единицу времени)?
Спасибо.