Я пытаюсь построить функцию (или макрос), чтобы упростить получение и настройку данных глубоко в хеш-таблице (то есть хеш-код внутри хеш-кода, внутри хеш-кода и т. Д.).Я не думаю, что смогу сделать это с помощью макроса, и я не уверен, как это сделать с помощью eval.Я хотел бы иметь возможность сделать следующее:
(gethashdeep *HEROES* "Avengers" "Retired" "Tony Stark")
и получить это возвращение "Железный человек"
Все хэши создаются с:
(setf hashtablename (make-hash-table :test 'equal))
и заполняется оттуда.
Я могу сделать следующее, но хотел бы абстрагировать его, чтобы я мог программно извлечь значение с произвольной глубины:
;;pulling from a hash that's 2 deep
(gethash "Tony Stark" (gethash "Avengers" *HEROES*))
update - мой путь вэто:
(defun getdeephash (hashpath h k)
(let* ((rhashpath (reverse hashpath))
(hashdepth (list-length hashpath))
(hashcommand (concatenate 'string "(gethash \"" k "\"")))
(loop for i from 1 to hashdepth
do (setf hashcommand (concatenate 'string hashcommand "(gethash \"" (nth (- i 1) rhashpath) "\"")))
(setf hashcommand (concatenate 'string hashcommand " " h (make-string (- hashdepth 0) :initial-element #\Right_Parenthesis) ")"))
(values hashcommand)))