Common lisp 在库中使用Swank函数

Common lisp 在库中使用Swank函数,common-lisp,slime,swank,Common Lisp,Slime,Swank,我在Ubuntu上使用SLIME/SBCL/Emacs和Quicklisp。我有下面定义的函数。我想将它添加到我的Lisp库的top.Lisp文件中,即每个库都依赖的文件,这样我就可以在我用库编写的所有函数中使用它,只需将(update swank)添加到函数中,而不必将下面的整个函数添加到使用它的每段代码中 (defun update-swank () "Grabs SWANK connections and tells it to handle requests. Call

我在Ubuntu上使用SLIME/SBCL/Emacs和Quicklisp。我有下面定义的函数。我想将它添加到我的Lisp库的top.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时,由于我的.sbclrc文件中有
asdf:load op
,因此在此过程中加载我的库时,我得到一个

READ error during COMPILE-FILE:
;   
   ;     Package SWANK does not exist.
在低级lisp中,SLIME无法轮询,因为库没有加载,因为在我当前的设置中,SLIME/SBCL在加载
update swank
所在的.lisp文件时不知道swank是什么。我尝试将
(在package:swank中)
添加到
更新swank
所在的文件中,但没有成功

The name "SWANK" does not designate any package.
在emacs启动时加载我的库时,使用lisp

我搜索了CEPL(我从中获得更新swank),然后复制了CEPL的创建者所做的工作,并将该函数导出到my packages.lisp中。我确保添加了这个函数,就像他在cepl utils的第20行中添加的一样。顺便说一句,加载我的库

(asdf:operate 'asdf:load-op :cl-test)
(in-package #:cl-test)

在我的.sbclrc文件中,我假设在我的
.emacs
文件在emacs启动时加载slime之前加载了该文件(我的
.emacs
文件中有
(slime)
)…我刚刚测试了在包和我的
.sbclrc
中删除
adsf:load op
并在加载slime/swank后运行
asdf:load op
,我在这里尝试的操作没有错误…但我希望能够在emacs启动时自动加载我的库,并按照我的方式运行通常是通过将
asdf:load op
添加到我的
.sbclrc
…如果有人能告诉我在加载swank后在emacs启动时自动加载我的库的另一种方法,这将回答这个问题?

这是为了位于游戏/实时演示的主循环中,因为这是阻止repl的原因更新。幸运的是,我们可以控制循环,所以这很容易。现在,您希望在库中使用它(可能与opencv一起使用),因此您需要确定是什么阻止了更新,这通常是某种“主循环”,如果您可以访问主循环,则从中调用update swank

如果主循环由一个外部库控制,那么您可以将其放入一个函数中,该函数在每个“循环”中都会被调用。你真正需要的是经常给它打电话,让repl感觉有反应

除此之外,您可以尝试更改swank的设置以在单独的线程上运行,尽管我没有这样做的经验,所以我无法告诉您该如何工作

您可以在(运行演示)的主循环中看到它

我也在谈论它。尽管可能不够详细:)

事实上,你得到的“斯旺克不存在”是非常奇怪的。这表明swank没有加载,但如果您使用的是粘液,则swank必须在那里

p、 请记住,这是用于Slime或Slim的,这意味着您将它们用于emacs或vim。如果您不使用Slim+emacs或Slim+vim,此功能将不起作用

[编辑] 好的,我复制了您的问题,将(ql:quickload:cepl)放在quicklisp的setup.lisp文件的末尾。这给了我一个“包装行头不存在”的说法。解决这个问题的一个快速方法是在项目的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")
(asdf:defsystem#:cepl)
:序列号t
:取决于(#):cl opengl

#:swank;;这是为了放置在游戏/实时演示的主循环中,因为这正是阻止repl更新的原因。幸运的是,我们控制了循环,因此很容易。现在您希望在库中使用它(可能与opencv一起使用)因此,您需要确定是什么阻止了更新,这通常是某种“主循环”,如果您可以访问主循环,则从中调用updateswank

如果主循环由一个外部库控制,那么也许你可以把它放在一个函数中,每个“循环”都会被调用。你真正需要的是它被频繁调用,以使repl感觉有响应

除此之外,您可以尝试更改swank的设置以在单独的线程上运行,尽管我没有这样做的经验,所以我无法告诉您该如何工作

您可以在(运行演示)的主循环中看到它

我也谈到了这一点。尽管可能不够详细:)

事实上,你得到的“swank不存在”是非常奇怪的。这表明swank没有加载,但如果你使用的是粘液,那么swank一定在那里

p、 请记住,这是用于Slime或Slim的,这意味着您正在将其与emacs或vim一起使用。如果您没有使用Slime+emacs或Slim+vim,则此功能将不起作用。

[编辑] 好的,我复制了您的问题,将(ql:quickload:cepl)放在quicklisp的setup.lisp文件的末尾。这给了我“Package 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")
(asdf:defsystem#:cepl)
:序列号t
:取决于(#):cl opengl

#:swank;;如果在运行的Lisp中没有定义包,则无法使用此包。首先需要定义包,然后才能从该包中读取符号。当CL尝试从未知包中读取符号时,不会创建包

如果
(查找包“FOO”)
返回NIL,则无法读取类似
FOO::BAR的符号

有两种解决办法:

  • 在读取包中的符号之前执行包定义

  • 从源代码中删除符号:

例如:

foo::*bar*
替换wi
(foo::bar :baz t)
(funcall (symbol-function (find-symbol "BAR" "FOO")) :baz t)