Common lisp 调用load时filespec中出现奇怪的符号

Common lisp 调用load时filespec中出现奇怪的符号,common-lisp,Common Lisp,我试图熟悉一个大型项目,可能最初是用Allegro Common Lisp编写的。我遇到了这段代码: (load "epilog:lib;compile.lisp") 请任何人解释一下这是什么意思?也许,如果这有帮助的话,“epolig”是一个包的名称,“lib;compile.lisp”是一个文件“lib/compile.lisp”,或者我可以理解 这是做某事的标准方式吗?如果是这样的话,这条守则的用意是什么?SBCL不将冒号识别为文件名中的特殊字符,即它报告无法加载“epilog:lib;

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

(load "epilog:lib;compile.lisp")
请任何人解释一下这是什么意思?也许,如果这有帮助的话,“epolig”是一个包的名称,“lib;compile.lisp”是一个文件“lib/compile.lisp”,或者我可以理解


这是做某事的标准方式吗?如果是这样的话,这条守则的用意是什么?SBCL不将冒号识别为文件名中的特殊字符,即它报告
无法加载“epilog:lib;compile.lisp”:文件不存在。
逻辑路径名是标准的公共lisp功能。

CL-USER 43 > (translate-logical-pathname "epilog:code;ui;demo.lisp")
#P"/usr/local/sources/epilog/code/ui/demo.lisp"
它不是一个符号,而是一个逻辑路径名

CommonLisp有一个便携工具。其目的是从物理路径名(如
/usr/local/lisp/src/epilog/lib/compile.lisp
lispm:>sources>epilog>lib>compile.lisp.432
或任何其他类型的路径名(只要想想Unix、Mac OS X、Windows等之间的差异即可)

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

历史

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

因此,这就像早期的文件“URI”功能—统一资源标识符

所解释的示例

“epilog:lib;compile.lisp”
是逻辑路径名的名称

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

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

假设我们有一个逻辑主机尾声,只有一条翻译规则。此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 41 > (pathname "epilog:lib;compile.lisp")
#P"EPILOG:LIB;COMPILE.LISP"
将逻辑路径名转换为物理路径名

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计算机上运行的软件-在整个系统中广泛使用了此功能