我学习/使用 common lisp 已有一段时间(几个月),但我仍然难以理解如何从其他文件导入代码。我正在使用 emacs/slime 和 SBCL,根据我的阅读,我需要使用“加载”函数从另一个文件加载代码。我还定义了包并将要导入的包的名称放在“:use”子句中。然而,粘液一直提示我试图加载的文件不存在(当它明显存在时)。我究竟做错了什么?示例:
(load "file.lisp")
(defpackage :package
(:use :cl :file))
...
谢谢。
最佳答案
你不一定需要定义一个包来使用来自其他人的代码 文件。简单的说, package 是一种将您的代码与其他代码进行抽象和分离的方法。它是 并非旨在保留有关哪个文件取决于哪个文件的信息。
组织你的文件(通常有很多文件都驻留在 一个包),你需要一个叫做系统的东西,至少在 ASDF 术语中是这样。
在我们谈论 ASDF 之前,我想指出您的 load
方法可以是
也用过,虽然它更适合玩具、简单的草图或
在 REPL 中使用。您可以手动加载
东西——它应该可以工作。如果没有
为你工作,首先尝试指定文件的完整路径。接下来你
如果指定完整路径有帮助,可以做的是确保您的 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"))))
在这里你可以有一些关于你的项目的元数据,最重要的 thing — 有关项目结构的信息。我觉得很漂亮 不言自明。
如何获得ASDF?对你来说是个好消息,因为你提到你正在使用 SBCL,它已经安装了。
通常,每种编程语言都有某种生态系统,即 允许您定义程序的结构(文件之间的依赖关系 和外部依赖项——库等)。这是一件重要的事情 学习。在 Common Lisp 世界中,这样的生态系统是由以下组合形成的 ASDF 和 Quicklisp — 图书馆管理员 允许您自动安装项目的依赖项,例如 例子。仔细计划您的旅程并查看这些工具!
关于import - 用普通的 lisp 加载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30563632/