我正在尝试制作一个简单的表单,以自动在图像上加载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"))
问题在于,每当我尝试在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):
在此之前,没有任何打印品出现。也就是说,它似乎在第一行push
上出错。我的理解是它尚未加载包并尝试引用其符号。
如何更改表格以使其正常工作?表格下方也有类似情况。
P.S。当每一行以给定的顺序执行时,一切都将正常运行。
答案 0 :(得分:6)
错误来自read
,原因是
它尝试解析整个progn
格式和sees the asdf:
package prefix。
您必须先加载asdf
,读者才能看到带有
asdf:
软件包前缀和在使用slynk
之前加载:slynk
前缀,换句话说,就是将progn
表单(如您在PS中所说的)一一喂入Lisp。
另一种方法是将所有内容progn
放入
文件并加载。您还需要制作"20180708.712"
和4007
变量,例如
(defvar *sly-version* "20180708.712")
(defvar *slynk-port* 4007)
(load "load-and-start-slynk.lisp")
和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")
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"))
执行 不 。