Common lisp 在库中使用Swank函数
我在Ubuntu上使用SLIME/SBCL/Emacs和Quicklisp。我有下面定义的函数。我想将它添加到我的Lisp库的top.Lisp文件中,即每个库都依赖的文件,这样我就可以在我用库编写的所有函数中使用它,只需将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
(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)