我已经学习/玩普通的lisp一段时间(几个月),而且我仍然难以理解如何从其他文件导入代码。我使用的是emacs / slime和SBCL,而且从我读过的内容来看,我需要使用" load"用于从另一个文件加载代码的函数。我还定义了包并将我要导入的包的名称放在":use"条款。但是,史莱姆一直在抱怨我试图加载的文件不存在(当它显然没有时)。我究竟做错了什么?例如:
(load "file.lisp")
(defpackage :package
(:use :cl :file))
...
感谢。
答案 0 :(得分:3)
您不一定需要定义包以使用其他代码 文件。简单的说, package 是一种抽象和分离代码与其他代码的方法。它' S 不是为了保留哪个文件取决于哪个文件的信息。
组织文件(通常有许多文件都在其中 一个包),你需要一个叫做系统的东西,至少在ASDF术语中。
在我们谈论ASDF之前,我想指出您的load
方法可以
也用过,虽然它非常适合玩具,简单的草图,或用于
在REPL使用。您可以手动load
- 它应该有效。如果它没有
为你工作,首先尝试指定文件的完整路径。你接下来的事情
如果指定完整路径有帮助,可以确保你的CL实现
如果文件名是相对的,则知道在哪里搜索文件。但这是一个
不同的话题,而且不是很有趣。
通常使用ASDF 如今要组织各种项目,从小到大。你应该 研究文档以了解如何使用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"))))
在这里,您可以获得有关您的项目的一些元数据,最重要的是 东西 - 关于项目结构的信息。我觉得它很漂亮 不言自明的。
如何获得ASDF?对你好消息,因为你提到你正在使用 SBCL,它已经安装好了。
通常,每种编程语言都有某种生态系统 允许您定义程序的结构(文件之间的依赖关系) 和外部依赖 - 库等。这是一件很重要的事情 学习。在Common Lisp世界中,这样的生态系统是由组合形成的 ASDF和Quicklisp - 图书馆经理 允许您自动安装项目的依赖项 例。仔细计划您的旅程并查看这些工具!