调用load时filespec中的奇怪符号

时间:2012-12-01 17:06:23

标签: common-lisp

我正在尝试熟悉一个大型项目,最初可能是用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.

1 个答案:

答案 0 :(得分:15)

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

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

Common Lisp具有可移植的logical pathname工具。目的是从物理路径名(如/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并且不记得这些东西到底在哪里:在本地机器上?但是哪里?在文件服务器上?但是哪里?因此,在每个网络上都有一个注册表,用于从真实文件位置到逻辑路径名的转换。

所以这就像早期的URI&#39;文件设施 - 统一资源标识符&#39;。

示例解释

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

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

逻辑路径名翻译

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

我们假设我们有一个只有一个翻译规则的逻辑主机EPILOG。此/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机器上运行的软件 - 这个功能在整个系统中被广泛使用。