4

我正在尝试熟悉一个大型项目,可能最初是用 Allegro Common Lisp 编写的。我遇到了这段代码:

(load "epilog:lib;compile.lisp")

谁能解释一下这是什么意思?也许,如果这有帮助,“epolig”是一个包的名称“lib;compile.lisp”是一个文件“lib/compile.lisp”,或者我可以理解。

这是做某事的标准方式吗?如果是这样,这段代码的意图是什么?SBCL 不将冒号识别为文件名中的特殊字符,即它报告Couldn't load "epilog:lib;compile.lisp": file does not exist.

4

1 回答 1

15

逻辑路径名是标准的 Common Lisp 功能

它不是一个符号,它是一个逻辑路径名。

Common Lisp 有一个可移植的逻辑路径名工具。目的是从物理路径名或任何其他类型的路径名中抽象出来/usr/local/lisp/src/epilog/lib/compile.lisplispm:>sources>epilog>lib>compile.lisp.432想想 Unix、Mac OS X、Windows 等之间的区别)。

目的是为您的软件使用一个单一的路径名方案和一个单一的逻辑文件组织。无论您在哪台机器上以及文件在哪里,您所需要的只是从真实文件组织到逻辑 Lisp 组织的映射。

历史

这个工具来自有许多不同的操作系统和许多不同的文件(DEC VMS、IBM MVS、Multics、Unix、Lisp Machines、MS DOS、Macs ......)的时代。Lisp 机器是联网的,可以与各种计算机通信——因此他们学习了所有这些计算机的本机文件语法。在不同的实验室(MIT、Xerox、SRI,...),网络上有不同的机器和不同的文件服务器。但是 Lisp 用户想要加载epilog:src;load.lisp却不记得这些东西到底在哪里:在本地机器上?但是哪里?在文件服务器上?但是哪里?因此,在每个网络上都有一个注册表,用于从真实文件位置到逻辑路径名的转换。

所以这就像一个早期的文件“URIs”工具——统一资源标识符。

举例说明

"epilog:lib;compile.lisp"逻辑路径名的名称。

  • epilog是逻辑主机的名称
  • lib;是目录路径
  • compile是文件名
  • lisp是文件类型

逻辑路径名翻译

您需要的是逻辑路径名和物理路径名之间的转换:

假设我们有一个只有一个翻译规则的逻辑主机 EPILOG。此 Lisp 的所有文件都在这台机器上,位于/usr/local/sources/epilog/. 所以我们使用一些 Unix 约定。

CL-USER 40 > (setf (logical-pathname-translations "EPILOG")
                   `(("**;*.*" "/usr/local/sources/epilog/**/*.*")))
(("**;*.*" "/usr/local/sources/epilog/**/*.*"))

上面只有一个翻译规则:

EPILOG:**;*.*/usr/local/sources/epilog/**/*.*

它将逻辑主机及其所有子目录映射到 UNIX 文件系统中的目录。

可以有更多规则:

  • 文档可能在不同的地方
  • 较大的文件系统上可能有数据文件
  • 编译的 fasl 文件可能存储在其他地方
  • 它可能使用来自其他物理目录的逻辑子目录

但是,同样,这里我们只使用一个翻译规则。

示例解释 - 第 2 部分

现在我们可以解析一个逻辑路径名:

CL-USER 41 > (pathname "epilog:lib;compile.lisp")
#P"EPILOG:LIB;COMPILE.LISP"

让我们描述一下:

CL-USER 42 > (describe *)

#P"EPILOG:LIB;COMPILE.LISP" is a LOGICAL-PATHNAME
HOST           "EPILOG"
DEVICE         :UNSPECIFIC
DIRECTORY      (:ABSOLUTE "LIB")
NAME           "COMPILE"
TYPE           "LISP"
VERSION        NIL

正如你在上面看到的,这些部分是从我们的字符串中解析出来的。

现在我们还可以看到逻辑路径名如何转换为真实路径名:

将逻辑路径名转换为物理路径名

CL-USER 43 > (translate-logical-pathname "epilog:code;ui;demo.lisp")
#P"/usr/local/sources/epilog/code/ui/demo.lisp"

因此,现在当您调用 时(load "epilog:lib;compile.lisp"),Lisp 将翻译逻辑路径名,然后真正从翻译后的物理路径名加载文件。我们还真正想要的是,用于所有目的的 Lisp 都记住逻辑路径名 - 而不是物理路径名。例如,当文件有一个名为 的函数时FOO,我们希望 Lisp 记录函数源的位置 - 但使用逻辑路径名。通过这种方式,您可以将已编译的文件、已编译的应用程序或 Lisp 映像移动到另一台计算机上,更新翻译,然后它将能够立即找到源FOO- 如果它在该机器上可用或在可访问的网络上的某个地方可用那台机器。

逻辑路径名需要翻译

要使用逻辑路径名,需要像上面那样进行逻辑路径名转换。通常它们自己存储在翻译文件中。定义翻译,加载它,然后您可以使用相应的逻辑路径名来编译和加载文件。使用它们的典型软件系统,因此需要相应的翻译。有时需要根据您的文件路径进行编辑,但有时可以在加载翻译文件时计算它们。您将查看逻辑主机和翻译的定义位置和方式。

历史第 2 部分

在 Symbolics Lisp 机器上,有一个站点范围的目录,可以在其中注册系统和逻辑路径名。加载一个系统然后可以使用这个中央目录查找系统定义,它通常还加载一个翻译文件。因此,该机制告诉您系统的结构是什么(文件、版本、补丁、系统版本……),并告诉您它的位置(可以分散在多个主机或文件系统上)。

逻辑路径名在较新的软件中使用得不多——你有时会在某些较旧的软件中遇到它们,尤其是那些在 Lisp 机器上运行的软件——这个特性在整个系统中被广泛使用。

于 2012-12-01T17:43:10.920 回答