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

问题描述 投票:1回答:1

我在REPL中使用(asdf:load-system "app" :force t)来处理包含一些包定义的ASD文件和指定文件:component的(asdf:defsystem "app" ...)。加载后,REPL位于:cl-user包中。你如何让REPL最终成为另一个包。在各个地方(例如,ASD或组件)添加(包装内:my-pkg)无效。

common-lisp read-eval-print-loop
1个回答
2
投票

在加载或编译操作期间的包更改不会更改REPL的当前包。这在正常使用中会非常烦人。系统也不与包1对1对应,因此可能没有具有相同名称的包,并且系统可能具有多个包。但是,为了方便开发,您可以向init-file(~/.sbclrc for SBCL)添加一个函数,该函数加载系统并将*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之前将名称字符串加满。

© www.soinside.com 2019 - 2024. All rights reserved.