@@ -210,6 +210,24 @@ package scripts."
210
210
(load fasl))
211
211
fasl))
212
212
213
+ ; ;; Copy-paste from UIOP, except we ignore options we don't recognize.
214
+ (defun package-dependencies (defpackage-form)
215
+ " Return a list of packages depended on by the package
216
+ defined in DEFPACKAGE-FORM. A package is depended upon if
217
+ the DEFPACKAGE-FORM uses it or imports a symbol from it."
218
+ (nub
219
+ (with-collectors (dep)
220
+ (loop :for (option . arguments) :in (cddr defpackage-form) :do
221
+ (case option
222
+ ((:use :mix :reexport :use-reexport :mix-reexport :implement )
223
+ (dolist (p arguments) (dep (string p))))
224
+ ((:import-from :shadowing-import-from )
225
+ (dep (string (first arguments))))
226
+ #+ package-local-nicknames
227
+ ((:local-nicknames )
228
+ (loop :for (nil actual-package-name) :in arguments :do
229
+ (dep (string actual-package-name)))))))))
230
+
213
231
(defun hot-reload (system package path)
214
232
" Hot-reload package inferred system SYSTEM.
215
233
First, try to compile and load just SYSTEM's file. This should work
@@ -222,19 +240,23 @@ compilation speed. Also, override ASDF internals so files that already
222
240
exist are just symlinked from the old cache."
223
241
(declare (ignorable package ))
224
242
(set-compiler-policy)
225
- (nlet retry (( count 1 ) )
243
+ (nlet retry ()
226
244
(handler-bind (#+ sbcl
227
245
(sb-int :package-at-variance-error
228
246
(lambda (e)
229
247
(flags :dbg " Delete package due to package variance" )
230
248
(delete-package (package-error-package e))
231
- (retry (1- count ))))
232
- (package-error
233
- (lambda (e)
234
- (flags :dbg " Package error: ~a " e)
235
- (when (and (> count 0 )
236
- (not (find-package (package-error-package e))))
237
- (flags :dbg " Loading system due to package error" )
238
- (fast-load-system system)
239
- (retry (1- count ))))))
249
+ (retry)))) )
250
+ (let ((*macroexpand-hook*
251
+ (lambda (expander form env)
252
+ (if (and (listp form)
253
+ (member (car form) ' (cl :defpackage uiop :define-package)))
254
+ (if-let ((deps (package-dependencies form)))
255
+ ` (progn
256
+ (eval-when (:compile-toplevel :load-toplevel :execute )
257
+ (dolist (p ' ,(remove-if #' find-package deps))
258
+ (fast-load-system p)))
259
+ , (funcall expander form env))
260
+ (funcall expander form env))
261
+ (funcall expander form env)))))
240
262
(fast-load-script path))))
0 commit comments