Cha*_*ois 6 lisp import load sbcl common-lisp
我一直在学习/玩普通 lisp 一段时间(几个月),但我仍然很难理解如何从其他文件导入代码。我正在使用 emacs/slime 和 SBCL,从我读过的内容来看,我需要使用“加载”函数从另一个文件加载代码。我还定义了包并将我想要导入的包的名称放在“:use”子句中。但是,slime 一直抱怨我尝试加载的文件不存在(当它显然存在时)。我究竟做错了什么?例子:
(load "file.lisp")
(defpackage :package
(:use :cl :file))
...
Run Code Online (Sandbox Code Playgroud)
谢谢。
您不一定需要定义一个包来使用其他文件中的代码。简而言之, 包 是一种将您的代码与其他代码抽象和分离的方法。它并非旨在保留有关哪个文件取决于哪个文件的信息。
要组织您的文件(通常有许多文件都驻留在一个包中),您需要一个称为系统的东西,至少在 ASDF 术语中是这样。
在我们谈论 ASDF 之前,我想指出您的load方法也可以使用,尽管它非常适合玩具、简单的草图或在 REPL 中使用。你可以手动load操作——它应该可以工作。如果它不适合您,请首先尝试指定文件的完整路径。如果指定完整路径有帮助,您可以做的下一件事是确保您的 CL 实现知道在文件名是相对的情况下在哪里搜索文件。但这是一个不同的话题,也不是很有趣。
通常情况下,航空自卫队是时下用来组织各种各样的项目,从小到大。您应该研究文档以了解如何使用 ASDF,但即使是简单的示例也可以告诉您很多信息:
(asdf:defsystem "hello-lisp"
:description "hello-lisp: a sample Lisp system."
:version "0.0.1"
:author "Joe User <joe@example.com>"
:licence "Public Domain"
:components ((:file "packages")
(:file "macros" :depends-on ("packages"))
(:file "hello" :depends-on ("macros"))))
Run Code Online (Sandbox Code Playgroud)
在这里你可以有一些关于你的项目的元数据,以及最重要的东西——关于项目结构的信息。我认为这是不言自明的。
如何获得ASDF?对您来说是个好消息,因为您提到您正在使用 SBCL,它已经安装。
通常,每种编程语言都有某种生态系统,它允许您定义程序的结构(文件之间的依赖关系和外部依赖关系——库等)。学习是一件很重要的事情。在 Common Lisp 世界中,这样的生态系统是由 ASDF 和Quicklisp组合形成的——例如,库管理器允许您自动安装项目的依赖项。仔细计划您的旅程并查看这些工具!