首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在库中使用Swank函数

在库中使用Swank函数
EN

Stack Overflow用户
提问于 2013-10-18 10:36:16
回答 2查看 1.1K关注 0票数 1

我在Ubuntu上使用粘液/SBCL/Emacs和Quicklisp。我在下面定义了这个函数。我想将它添加到Lisp库的顶级.lisp文件中,即其他库所依赖的文件中,这样我就可以在与库一起编写的所有函数中使用它,只需将(update-swank)添加到函数中,而不必将下面的整个函数添加到使用它的每一段代码中。

代码语言:javascript
复制
(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文件中,我得到一个

代码语言:javascript
复制
READ error during COMPILE-FILE:
;   
   ;     Package SWANK does not exist.

在低劣的lisp中,由于库没有加载,所以file被阻塞轮询,因为在我当前的设置中,SLIME/SBCL不知道在加载.lisp文件时update-swank所在的swank是什么。我尝试将(in-package :swank)添加到update-swank所在的文件中,但得到了

代码语言:javascript
复制
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加载我的库。

代码语言:javascript
复制
(asdf:operate 'asdf:load-op :cl-test)
(in-package #:cl-test)

在我的.sbclrc文件中,我假设.emacs文件在emacs启动时加载黏液(我在.emacs文件中有(slime) ),...I刚刚测试了删除adsf:load-opin-package,从.sbclrc中删除adsf:load-opin-package,并在file /swank加载之后运行asdf:load-op,而我在这里所做的工作没有使用error....but,我希望能够在emacs启动时自动加载我的库,而我通常所做的方式就是将asdf:load-op添加到我的D19....If有人可以告诉我另一种方法,在emacs启动时,在swank加载之后自动加载我的库,这会回答这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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指定为依赖项。例如:

代码语言:javascript
复制
(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")

希望它有帮助:)

票数 1
EN

Stack Overflow用户

发布于 2013-10-20 21:22:40

如果在运行的Lisp中没有定义包,则不能使用该包。首先,您需要定义包,然后可以从该包中读取符号。当CL试图从未知包中读取符号时,不会创建包。

如果(find-package "FOO")返回零,则无法读取像FOO::BAR这样的符号。

解决这一问题的两个办法是:

  • 在读取包中的符号之前执行包定义。
  • 从源代码中删除符号:

示例:

代码语言:javascript
复制
foo::*bar*

代之以

代码语言:javascript
复制
(symbol-value (find-symbol "*BAR*" "FOO"))

上面在运行时查找符号并检索符号值。

另外:

代码语言:javascript
复制
(foo::bar :baz t)

代之以

代码语言:javascript
复制
(funcall (symbol-function (find-symbol "BAR" "FOO")) :baz t)

上面在运行时查找符号,检索函数并调用它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19447559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档