我试图熟悉一个大型项目,最初可能是用Allegro Common Lisp编写的.我遇到过这段代码:
(load "epilog:lib;compile.lisp")
Run Code Online (Sandbox Code Playgroud)
可以请任何人解释这是什么意思?也许,如果有帮助,"epolig"是包"lib; compile.lisp"的名称是一个文件"lib/compile.lisp",或者我可以理解.
这是一种标准的做事方式吗?如果是这样,这段代码的意图是什么?SBCL不会将冒号识别为文件名中的特殊字符,即它会报告Couldn't load "epilog:lib;compile.lisp": file does not exist.
Rai*_*wig 15
逻辑路径名是标准的Common Lisp功能
它不是符号,而是逻辑路径名.
Common Lisp具有可移植的逻辑路径名功能.目的是从像/usr/local/lisp/src/epilog/lib/compile.lisp或lispm:>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/**/*.*"))
Run Code Online (Sandbox Code Playgroud)
以上只有一个翻译规则:
从EPILOG:**;*.*到/usr/local/sources/epilog/**/*.*.
它将逻辑主机及其所有子目录映射到UNIX文件系统中的目录.
人们可以有更多的规则:
但是,在这里,我们只使用一个转换规则.
这个例子解释了 - 第2部分
现在我们可以解析逻辑路径名:
CL-USER 41 > (pathname "epilog:lib;compile.lisp")
#P"EPILOG:LIB;COMPILE.LISP"
Run Code Online (Sandbox Code Playgroud)
我们来描述一下:
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
Run Code Online (Sandbox Code Playgroud)
如上所示,部件已经从我们的字符串中解析出来.
现在我们还可以看到逻辑路径名如何转换为真实的路径名:
将逻辑路径名转换为物理路径名
CL-USER 43 > (translate-logical-pathname "epilog:code;ui;demo.lisp")
#P"/usr/local/sources/epilog/code/ui/demo.lisp"
Run Code Online (Sandbox Code Playgroud)
所以,现在当你调用时(load "epilog:lib;compile.lisp"),Lisp将翻译逻辑路径名,然后真正从翻译的物理路径名加载文件.我们真正想要的是Lisp用于各种目的记住逻辑路径名 - 而不是物理路径名.例如,当文件有一个名为的函数时FOO,我们希望Lisp记录函数源的位置 - 但是使用逻辑路径名.这样,您就可以将一个编译文件,编译的应用程序或Lisp的图像到不同的计算机,更新的翻译,并立即将能够找到的来源FOO-如果它是可用的机器上或者在某处访问的网络上那台机器.
逻辑路径名需要翻译
要使用逻辑路径名,需要具有如上所述的逻辑路径名转换.它们通常自己存储在翻译文件中.定义转换,加载它然后您可以使用相应的逻辑路径名来编译和加载文件.使用它们的典型软件系统因此需要相应的翻译.有时需要根据文件路径进行编辑,但有时可以在加载翻译文件时进行计算.您将查看逻辑主机和翻译的定义位置和方式.
历史第2部分
在Symbolics Lisp机器上有一个站点范围的目录,可以在其中注册系统和逻辑路径名.然后,加载系统可以使用此中央目录查找系统定义,并且通常还会加载转换文件.因此,该机制告诉您系统的结构是什么(文件,版本,补丁,系统版本......),它告诉您它的位置(可以分散在多个主机或文件系统上).
逻辑路径名在新软件中使用不多 - 有时会在某些较旧的软件中遇到它们,特别是那些在Lisp机器上运行的软件 - 这个功能在整个系统中被广泛使用.