1

我在 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 时,在进程中加载​​我的库,因为我的asdf:load-op.sbclrc 文件中有

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

在劣质 lisp 中,并且 SLIME 卡住轮询,因为库没有加载,因为在我当前的设置中,SLIME/SBCL 不知道update-swank在加载 .lisp 文件时是什么 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获得了 update-swank ),然后复制了 CEPL 的创建者所做的并将函数导出到我的包中.lisp。我确保添加了函数,就像他在 cepl-utils 的第 20 行所做的那样https://github.com/cbaggers/cepl/blob/master/cepl-utils.lisp ......我顺便加载了我的库和

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

在我的 .sbclrc 文件中,我假设它是在我的.emacs 文件在 emacs 启动时加载粘液之前加载的(我(slime)在我的.emacs文件中有)...我刚刚测试了从我的adsf:load-op和运行 之后的粘液/swank 和什么我一直在尝试在这里没有错误地工作....但是我希望能够在 emacs 启动时自动加载我的库,而我通常这样做的方式是将...添加到我的....如果有人可以告诉我另一种在加载 swank 后在 emacs 启动时自动加载我的库的方法可以回答这个问题吗?in-package.sbclrcasdf:load-opasdf:load-op.sbclrc

4

2 回答 2

5

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

如果(find-package "FOO")返回 NIL,则您无法读取FOO::BAR.

两个解决方案是:

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

  • 从源代码中删除符号:

例子:

foo::*bar*

用。。。来代替

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

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

还:

(foo::bar :baz t)

用。。。来代替

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

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

于 2013-10-20T21:22:40.670 回答
1

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

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

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

您可以在此示例的 (run-demo) 函数的主循环中看到它

我也在这个视频中谈论它。虽然可能不够详细:)

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

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

[编辑] 好的,所以我通过将 (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-18T10:51:43.193 回答