import - 用普通的 lisp 加载文件

标签 import load lisp common-lisp sbcl

我学习/使用 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/

相关文章:

scheme - 使用 Racket 仅搜索一个列表 "1"

javascript - 在另一个 JavaScript 文件中使用一个 JavaScript 文件

ant - 从Gradle脚本中的build.xml导入的Ant任务自动运行

java - 迭代时 HashMap 抛出奇怪的异常

java - 无法导入jar文件

java - 如何序列化包含java中对象的对象?

header - 如何在 LISP 中添加头文件

java - 如何使用 Bukkit API 调用类方法?

performance - 编写一个简单的 JMeter 脚本

ruby-on-rails - Ruby 1.9 中的动态变量作用域