在普通的lisp中加载文件

时间:2015-05-31 23:06:16

标签: import load lisp common-lisp sbcl

我已经学习/玩普通的lisp一段时间(几个月),而且我仍然难以理解如何从其他文件导入代码。我使用的是emacs / slime和SBCL,而且从我读过的内容来看,我需要使用" load"用于从另一个文件加载代码的函数。我还定义了包并将我要导入的包的名称放在":use"条款。但是,史莱姆一直在抱怨我试图加载的文件不存在(当它显然没有时)。我究竟做错了什么?例如:

(load "file.lisp")
(defpackage :package
  (:use :cl :file))
...

感谢。

1 个答案:

答案 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 - 图书馆经理 允许您自动安装项目的依赖项 例。仔细计划您的旅程并查看这些工具!