Использование профилировщика SBCL в моем собственном пакете
Я хочу профилировать некоторый код в моем пакете. Если я (require :sb-sprof)
в REPL (по умолчанию CL-USER
пакет), это работает. Однако, если я добавлю это в код внутри моего пакета, я получу Package SB-SPROF does not exist
ошибка.
Если я поставлю (:import-from #:sb-sprof with-profiling)
директива в моем defpackage
, Это ведет к The name "SB-SPROF" does not designate any package
,
Итак, как я могу включить профилирование?
1 ответ
Вам нужно оценить require
прежде чем сделать defpackage
вашего собственного пакета. defpackage
не будет автоматически require
SB-PROF
модуль для вас. Думать о require
как какая-то "фантазия" load
, который загружает модуль в изображение. Во время загрузки пакеты модуля создаются, и только после этого вы можете ссылаться на них из defpackage
или через ридер (sb-sprof:with-profiling
).
Часто, когда мне лень делать все правильно (или если это "одноразовое" решение), я использую небольшой скрипт "loadup.lisp", который проверяет наличие всех моих зависимостей, а затем загружает мои собственный код Это также гарантирует, что изображение может быть надежно воспроизведено из свежего листа.
Нечто подобное
;; Make sure, the dependencies are present
(ql:quickload '(whatever)) ;; Load a dependency via Quicklisp
(require :sb-something-else) ;; ... or via some implementation-dependent repository
(asdf:oos 'asdf:load-op 'some-module) ;; ... or via ASDF or ... or ... or ...
;; Now, load my own stuff
(load "packages")
(load "something-important-1")
...
Порядок этих операций важен; Вы не можете ссылаться на какие-либо пакеты из зависимых модулей в своих собственных объявлениях пакетов, пока эти модули не были загружены должным образом.