我在Ubuntu上使用粘液/SBCL/Emacs和Quicklisp。我在下面定义了这个函数。我想将它添加到Lisp库的顶级.lisp文件中,即其他库所依赖的文件中,这样我就可以在与库一起编写的所有函数中使用它,只需将(update-swank)添加到函数中,而不必将下面的整个函数添加到使用它的每一段代码中。
(defun update-swank ()
"Grabs SWANK connections and tells it to handle requests.
Call this every loop in the main loop of your program"
(continuable
(let ((connection (or swank::*emacs-connection*
(swank::default-connection))))
(when connection
(swank::handle-requests connection t)))))当我这样做并重新启动emacs,在进程中加载我的库,因为我的asdf:load-op在我的.sbclrc文件中,我得到一个
READ error during COMPILE-FILE:
;
; Package SWANK does not exist.在低劣的lisp中,由于库没有加载,所以file被阻塞轮询,因为在我当前的设置中,SLIME/SBCL不知道在加载.lisp文件时update-swank所在的swank是什么。我尝试将(in-package :swank)添加到update-swank所在的文件中,但得到了
The name "SWANK" does not designate any package.当我的库在emacs启动时加载时,使用的是低劣的lisp。
我搜索了CEPL (从https://github.com/cbaggers/cepl/blob/master/cepl-utils.lisp获得了更新-swank),然后复制了CEPL的创建者所做的,并在我的packages.lisp中导出了这个函数。我确保函数是像cepl-utils的第20行中添加的那样添加的,这里是https://github.com/cbaggers/cepl/blob/master/cepl-utils.lisp......I加载我的库。
(asdf:operate 'asdf:load-op :cl-test)
(in-package #:cl-test)在我的.sbclrc文件中,我假设.emacs文件在emacs启动时加载黏液(我在.emacs文件中有(slime) ),...I刚刚测试了删除adsf:load-op和in-package,从.sbclrc中删除adsf:load-op和in-package,并在file /swank加载之后运行asdf:load-op,而我在这里所做的工作没有使用error....but,我希望能够在emacs启动时自动加载我的库,而我通常所做的方式就是将asdf:load-op添加到我的D19....If有人可以告诉我另一种方法,在emacs启动时,在swank加载之后自动加载我的库,这会回答这个问题吗?
发布于 2013-10-18 10:51:43
这是为了坐在游戏/实时演示的主循环内,因为这是阻止爬虫更新的原因。幸运的是,我们控制了循环,所以这很容易。现在您希望在库中使用这个(可能与opencv一起使用),因此您需要确定是什么阻塞了更新,这通常是某种“主循环”,如果您可以访问主循环,然后从其中调用update。
如果主循环是由外部库控制的,那么您也许可以将其放入一个函数中,该函数被调用为每个“循环”。所有你真正需要的是,它被称为足够频繁,以使爬虫感觉响应。
除此之外,您还可以尝试将swank的设置更改为在一个单独的线程上运行,尽管我没有这样做的经验,所以我无法告诉您这会有多好。
您可以在(运行-演示) 此示例的功能的主循环中看到它。
此外,我也谈到它,在这个视频里。虽然可能不够详细:)
事实上,你是“不存在”,这是非常奇怪的。这意味着斯旺克没有装载,但如果你使用的是黏液,那么斯旺克必须在那里!
附注:请记住,这是用于Slim,这意味着您正在使用它们与emacs或vim。如果您不使用Slime+emacs或Slim+vim,则此函数将无法工作!
编辑Ok,所以我把(ql:quickload :cepl)放在quicklisp的setup.lisp文件末尾复制了您的问题。这给了我“SWANK不存在的软件包”。解决这一问题的一个快速方法是在项目的asd文件中将swank指定为依赖项。例如:
(asdf:defsystem #:cepl
:serial t
:depends-on (#:cl-opengl
#:swank ;;<---HERE
#:lbm-sdl
#:varjo
#:cl-utilities
#:cl-ppcre
#:symbol-munger
#:classimp
#:temporary-file
#:md5)
:components ((:file "package")
(:file "maths/base-maths")
(:file "base-macros")
;; (:file "base-lispbuilder")
(:file "cepl-utils")希望它有帮助:)
发布于 2013-10-20 21:22:40
如果在运行的Lisp中没有定义包,则不能使用该包。首先,您需要定义包,然后可以从该包中读取符号。当CL试图从未知包中读取符号时,不会创建包。
如果(find-package "FOO")返回零,则无法读取像FOO::BAR这样的符号。
解决这一问题的两个办法是:
示例:
foo::*bar*代之以
(symbol-value (find-symbol "*BAR*" "FOO"))上面在运行时查找符号并检索符号值。
另外:
(foo::bar :baz t)代之以
(funcall (symbol-function (find-symbol "BAR" "FOO")) :baz t)上面在运行时查找符号,检索函数并调用它。
https://stackoverflow.com/questions/19447559
复制相似问题