在库中使用Swank函数

时间:2013-10-18 10:36:16

标签: common-lisp slime swank

我在Ubuntu Raring上使用SLIME / 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时,在此过程中加载我的库,因为我的.sbclrc文件中有asdf:load-op,我得到了

READ error during COMPILE-FILE:
;   
   ;     Package SWANK does not exist.

在劣质lisp中,并且SLIME卡住轮询,因为库没有加载,因为在我当前的设置中SLIME / SBCL不知道当{.1}}所在的.lisp文件时swank是什么加载。我尝试将update-swank添加到(in-package :swank)所在的文件中,但已获得

update-swank
当我的图书馆在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加载我的库btw

The name "SWANK" does not designate any package.

在我的.sbclrc文件中我假设在我的(asdf:operate 'asdf:load-op :cl-test) (in-package #:cl-test) 文件加载slime emacs启动之前加载(我.emacs文件中有(slime) ...我刚刚测试过移除了.emacsadsf:load-op以及我的in-package并在加载了slime / swank之后运行.sbclrc,我在这里尝试做的工作没有错误....但我希望能够在emacs启动时自动加载我的库,我通常这样做的方法是将asdf:load-op添加到我的asdf:load-op ....如果有人能告诉我另一种在加载swank之后在emacs启动时自动加载我的库的方法会回答这个问题吗?

2 个答案:

答案 0 :(得分:4)

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

如果(find-package "FOO")返回NIL,则您无法读取FOO::BAR之类的符号。

两个解决方案是:

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

  • 从源代码中删除符号:

示例:

foo::*bar*

替换为

(symbol-value (find-symbol "*BAR*" "FOO"))

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

此外:

(foo::bar :baz t)

替换为

(funcall (symbol-function (find-symbol "BAR" "FOO")) :baz t)

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

答案 1 :(得分:1)

这是为了阻止repl更新而进入游戏/实时演示的主循环。幸运的是,我们控制循环很容易。现在你想在你的库中使用它(可能使用opencv),所以你需要确定阻止更新的内容,如果你有权访问主循环然后调用update-swank,这通常是某种“主循环”。在那里。

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

除此之外,您可以尝试更改swank的设置以在单独的线程上运行,虽然我没有经验这样做,所以我无法告诉您这有多好用。

你可以在(run-demo)function of this example

的主循环中看到它

我也谈论它in this video。虽然可能没有足够的细节:))

你得到“swank不存在”的事实很奇怪。它表明swank没有加载,但如果你使用粘液,那么swank必须在那里!

P.S。请记住,这适用于Slime或Slim,这意味着您将它们与emacs或vim一起使用。如果你没有使用Slime + emacs或Slim + vim这个功能 将不起作用

[编辑] 好的,所以我在quicklisp的setup.lisp文件的末尾添加(ql:quickload:cepl)来复制你的问题。这给了我'包装SWANK不存在'。解决此问题的一种快速方法是将swank指定为项目的asd文件中的依赖项。例如:

(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")

希望有所帮助:)