我正在尝试遵循本教程: http ://cl-cookbook.sourceforge.net/sockets.html
由于端口包,我无法让它工作。首先(in-package :port)
不起作用,它说找不到包。所以我将其更改为,(clc:clc-require :port)
但这会导致另一个错误:
INTERN("STRUCTURE-KCONSTRUCTOR"): #<PACKAGE SYSTEM> is locked ...
在ubuntu下我应该怎么做才能让它工作?
不幸的是,cl-cookbook 仍然引用 CLOCC 的 PORT。我特别推荐反对 PORT 和一般的 CLOCC。
好消息是存在更新、更好的套接字库,使用它们不会有太多麻烦。以下是您的选择:
usocket是一个可移植库,它抽象了各种 Lisp 实现中的套接字特性。它是 trivial-sockets 的精神继承者,如今许多 Common Lisp 库都依赖于 usocket。
我向新用户推荐 usocket。
另一个竞争者是iolib,它使用 FFI 重新实现套接字,而不是在实现的设施上构建。它还具有其他雄心勃勃的创新,例如替代 Common Lisp 路径名、I/O 多路复用和它自己的流抽象。
愿意阅读源代码和单元测试的程序员会发现 iolib 很有趣,但它仍然处于不断变化的状态并且缺乏文档。
我向狂热的黑客推荐 iolib。
许多安装方法是可能的。作为 Ubuntu 用户,您可以只使用 aptitude:
$ aptitude install cl-usocket
$ clisp
[1]> (asdf:operate 'asdf:load-op :usocket)
请注意 Debian 和 Ubuntu 中的 Common Lisp 包通常已经过时并且与上游有很大不同。如果您正在在线寻求帮助,如果您切换到这些软件包的上游版本,您将获得更多有用的响应。
我个人使用 Debian,但运行clbuild而不是 Lisp 的 Debian 软件包。请注意,clbuild 需要上游 CLISP,而不是 Ubuntu 提供的 CLISP。
使用apt-get install cl-port
.
看看asdf-install。设置好之后,lisp 包的安装非常简单:
(require 'asdf-install)
(asdf-install:install 'package-name)
无论如何,clisp 已经不再使用了。看看SBCL,它是最广泛使用的通用 lisp 实现。
此外,要学习 common lisp,您最好从Practical Common Lisp作为一本优秀且免费的书开始。
require
和in-package
是两个不同的东西。
require
将某些代码加载到正在运行的 lisp 映像中,以使其可用(如果它不存在)。in-package
将“当前”命名空间更改为某个包,以便您可以在没有包前缀的情况下调用该包中的对象(例如split
,而不是cl-ppcre:split
)。当然,这个包必须已经“存在”在运行时中。