Есть ли способ временно импортировать несколько функций из пакета в текущий пакет с использованием стандартных функций / макросов common-lisp?
Я не мог найти один и должен был свернуть свой собственный. Я бы не хотел ничего кодировать или вводить другую языковую конструкцию, если стандарт уже обеспечивает такую функциональность.
(defmacro with-functions (functions the-package &body body)
"Allows functions in the-package to be visible only for body.
Does this by creating local lexical function bindings that redirect calls
to functions defined in the-package"
`(labels
,(mapcar (lambda (x) `(,x (&rest args)
(apply (find-symbol ,(format nil "~:@(~a~)" x)
,the-package)
args)))
functions)
,@body))
Пример использования:
(defclass-default test-class ()
((a 5 "doc" )
(b 4 "doc")))
#<STANDARD-CLASS TEST-CLASS>
CL-USER>
(with-functions (class-direct-slots slot-definition-name) 'sb-mop
(with-functions (slot-definition-initform) 'sb-mop
(slot-definition-initform
(car (class-direct-slots (find-class 'test-class))))))
5
CL-USER>
РЕДАКТИРОВАТЬ: Включены некоторые предложения Райнера в макрос.
Я решил сохранить возможность поиска во время выполнения за счет стоимости поиска во время выполнения, чтобы найти функцию в пакете.
Я пытался написать макрос с импортом, который использовал shadowing-import и unintern, но я не смог заставить его работать. У меня были проблемы с читателем, который сказал, что импортированные функции еще не существовали (во время чтения) до того, как код, который импортировал функции, был оценен.
Я думаю, что заставить его работать с shadowing-import и unintern лучше, так как это будет намного чище, быстрее (без возможности поиска во время выполнения) и работать с функциями и символами в пакетах.
Мне было бы очень интересно посмотреть, сможет ли кто-нибудь написать макрос с импортом с помощью unintern и shadowing-import.