ASDF already has a build-image command, and I believe you could do what you want by creating a "shell" system that depends on the packages you want (sb-bsd-sockets, sb-posix, sb-introspect, sb-cltl2), and build an image for that system. See `image-op` in the ASDF manual. If that doesn't work for you, please post again to explain why it won't, and we can try to improve things.
Best, R
On 17 Nov 2020, at 4:20, Pierre Neidhardt wrote:
Hi!
Generating a core with pre-loaded packages (namely sb-bsd-sockets, sb-posix, sb-introspect, sb-cltl2, asdf) is a common optimization technique for faster REPL startups. The technique is detailed in the SLIME and SLY manuals.
Some may argue that modern machines are fast enough. But from personal experience even on very fast hardware, I find that it makes for a much smoother experience, especially for people using SLIME / SLY as their shell :)
I've implemented my own Emacs helper (https://github.com/joaotavora/sly/pull/366), but in https://bugs.launchpad.net/sbcl/+bug/1904042 it was suggested to bring the issue to ASDF which might be the most appropriate place where to share a helper for everyone, independently of the Lisp implementation or editor.
So what about adding a function the would dump an optimized core a bit like I did in the SLY pull request:
--8<---------------cut here---------------start------------->8--- (defvar *default-core-extra-modules* '(asdf))
(defun asdf:dump-core (&key (path *asdf-default-core-location*) (extra-modules *default-core-extra-modules*)) ... ;; Complete the extra-modules with implementation specific modules, as documented in the SLIME / SLY manuals. (cond ((sbcl-p) (append '(sb-bsd-sockets sb-posix sb-introspect sb-cltl2) extra-modules)) ((ccl-p) ... --8<---------------cut here---------------end--------------->8---
Then all the user would have to do is:
--8<---------------cut here---------------start------------->8--- CL-USER> (asdf:dump-core) --8<---------------cut here---------------end--------------->8---
And restart their REPL, assuming they've configured their REPL to use this new core.
It can also be useful to only replace an existing core if the modules or the Lisp version are different. This would allow the user to systematically run `asdf:dump-core` before starting their REPL, thus automatically ensuring they run an optimized core.
--8<---------------cut here---------------start------------->8--- ;; In Emacs: (setq sly-lisp-implementations '((sbcl (lambda () (call-process "sbcl" nil t nil "--no-userinit" "--eval" "(require :asdf)" "--eval" "(asdf:core-dump)" "--quit") `(("sbcl" "--core" path-to-core)))))) --8<---------------cut here---------------end--------------->8---
Thoughts?
-- Pierre Neidhardt https://ambrevar.xyz/