在编译和加载后使 REPL 最终出现在给定的包中(Common Lisp)

Making the REPL end up in a given package after compiling & loading (Common Lisp)

我在 REPL 使用 (asdf:load-system "app" :force t) 来处理包含一些包定义的 ASD 文件和 (asdf:defsystem "app" ...) 指定文件 :components。加载后,REPL 位于 :cl-user 包中。你如何让 REPL 最终出现在不同的包中。在不同的地方(例如 ASD 或组件)添加 (in-package :my-pkg) 没有奏效。

加载或编译操作期间的包更改不会更改 REPL 的当前包。这在正常使用中会非常烦人。系统也不会和包一一对应,所以可能没有同名的包,系统可能有多个包。但是,为了开发方便,您可以向初始化文件(SBCL 的 ~/.sbclrc)添加一个函数,该函数加载系统并将 *PACKAGE* 设置为同名的包。例如,

(require :asdf) ;Quicklisp also requires ASDF, so you could put this after its init too
(defun l (system-name)
  (asdf:load-system system-name)
  (setf *package* (find-package system-name)))

该函数将在 CL-USER 包中。由于这仅供开发使用,因此可以交互处理不存在的系统或包的错误。请注意,您应该使用名称关键字而不是字符串来调用它,或者在调用 FIND-PACKAGE.

之前将名称字符串大写