在Common Lisp中的Progn中加载包

Mad*_*ist 3 lisp common-lisp

我正在尝试制作一个简单的表单,它将自动加载Slynk在图像上.

到目前为止,我有这个:

(progn 
    (load "/home/user/asdf.lisp")
    (format t "~% Loaded ASDF")
    (push "/home/user/.emacs.d/elpa/sly-20180708.712/slynk/" asdf:*central-registry*)
    (format t "~% Added SLYNK path to ASDF:*CENTRAL-REGISTRY*")
    (asdf:load-system :slynk)
    (format t "~% Loaded ASDF system")
    (slynk:create-server :port 4007  :dont-close t)
    (format t "~% Created SLYNK server on port 4007")
    (setf slynk:*use-dedicated-output-stream* nil)
    (format t "~% Set *USE-DEDICATED-OUTPUT-STREAM* to NIL"))
Run Code Online (Sandbox Code Playgroud)

问题是,每当我尝试在REPL中评估此表单时,我都会收到以下错误:

Error: "ASDF" is not a known package.

Restart actions (select using :continue):
 0: Return NIL
 1: Return to Top Level (an "abort" restart).
 2: Abort entirely from this (lisp) process.
[1] CL-USER(4): 
Run Code Online (Sandbox Code Playgroud)

在此之前尚未显示任何打印件.也就是说,它似乎在第一push行出错.我的理解是它还没有加载包并试图引用它的符号.

如何更改表单以使其工作?表格中有类似的情况.

PS当每一行按给定顺序自行执行时,一切都完美无缺.

sds*_*sds 6

该错误来自于read它尝试解析整个progn表单并查看asdf:包前缀.

使用 前缀asdf 之前,您必须阅读器看到asdf:包含前缀加载的代码 slynk 之前加载:slynk,换句话说,将progn表单逐个送到Lisp (正如您在PS中所说).

另一种方法是将所有内容放在progn一个单独的文件中并加载它.你也想做"20180708.712"4007变量,例如,

(defvar *sly-version* "20180708.712")
(defvar *slynk-port* 4007)
(load "load-and-start-slynk.lisp")
Run Code Online (Sandbox Code Playgroud)

并在load-and-start-slynk.lisp:

(load "/home/user/asdf.lisp")
(format t "~% Loaded ASDF")
(push (concatenate 'string "/home/user/.emacs.d/elpa/sly-"
                   *sly-version* "/slynk/")
      asdf:*central-registry*)
(format t "~% Added SLYNK path to ASDF:*CENTRAL-REGISTRY*")
(asdf:load-system :slynk)
(format t "~% Loaded ASDF system")
(slynk:create-server :port *slynk-port* :dont-close t)
(format t "~% Created SLYNK server on port ~D" *slynk-port*)
(setq slynk:*use-dedicated-output-stream* nil)
(format t "~% Set *USE-DEDICATED-OUTPUT-STREAM* to NIL")
Run Code Online (Sandbox Code Playgroud)

PS.只是为了展示如何滥用 Lisp权力,以下是如何做你想做的事情:

(defun load-and-start-slynk (port version)
  (load "/home/user/asdf.lisp")
  (format t "~% Loaded ASDF")
  (push (concatenate 'string "/home/user/.emacs.d/elpa/sly-" version "/slynk/")
        (symbol-value (find-symbol "*CENTRAL-REGISTRY*" '#:asdf)))
  (format t "~% Added SLYNK path to ASDF:*CENTRAL-REGISTRY*")
  (funcall (find-symbol "LOAD-SYSTEM" '#:asdf) :slynk)
  (format t "~% Loaded ASDF system")
  (funcall (find-symbol "CREATE-SERVER" '#:slynk) :port port :dont-close t)
  (format t "~% Created SLYNK server on port ~D" port)
  (setf (symbol-value (find-symbol "*USE-DEDICATED-OUTPUT-STREAM*" '#:slynk)) nil)
  (format t "~% Set *USE-DEDICATED-OUTPUT-STREAM* to NIL"))
Run Code Online (Sandbox Code Playgroud)

千万不能做到这一点.

  • 是的,但黑客很丑,请看PS. (3认同)
  • sds的建议只是把它全部放在你加载的文件中是一个很好的.然后你有一个单一的形式:`(加载"/home/user/slynk-loader.lisp")`说. (2认同)