4

私は、おそらく最初はAllegroCommonLispで書かれた大規模なプロジェクトに慣れようとしています。私はこのコードに出くわしました:

(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

論理パス名は標準のCommonLisp機能です

これはシンボルではなく、論理パス名です。

Common Lispには、移植可能な論理パス名機能があります。/usr/local/lisp/src/epilog/lib/compile.lisp目的は、またはまたは他のタイプのパス名のような物理パス名から抽象化することですlispm:>sources>epilog>lib>compile.lisp.432(Unix、Mac OS X、Windowsなどの違いを考えてみてください)。

目的は、ソフトウェアに1つの単一パス名スキームと1つの論理ファイル編成を使用することです。使用しているマシンやファイルの場所に関係なく、必要なのは実際のファイル編成から論理的なLisp編成へのマッピングだけです。

歴史

この機能は、さまざまなオペレーティングシステムとさまざまなファイル(DEC VMS、IBM MVS、Multics、Unix、Lisp Machines、MS DOS、Macなど)があった時代から生まれました。Lispマシンはネットワーク化されており、あらゆる種類のコンピュータと通信できたため、それらすべてのネイティブファイル構文を学習しました。さまざまな研究所(MIT、Xerox、SRIなど)では、ネットワーク上にさまざまなマシンとさまざまなファイルサーバーがありました。しかし、Lispユーザーはロードepilog:src;load.lispしたいと思っていましたが、実際にどこにあるのか覚えていませんでした。ローカルマシン上で?しかしここで?ファイルサーバー上?しかしここで?そのため、各ネットワークには、実際のファイルの場所から論理パス名への変換用のレジストリがありました。

つまり、これはファイル用の初期の「URI」機能(Uniform Resource Identifiers)のようなものです。

説明された例

"epilog:lib;compile.lisp"論理パス名の名前です。

  • epilog論理ホストの名前です
  • lib;ディレクトリパスです
  • compileファイル名です
  • lispファイルタイプです

論理パス名の変換

必要なのは、論理パス名と物理パス名の間の変換です。

変換ルールが1つだけの論理ホストEPILOGがあるとします。このLispのすべてのファイルは、このマシン上にあります/usr/local/sources/epilog/。そのため、いくつかのUnix規則を使用します。

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

上記の変換ルールは1つだけです。

から。EPILOG:**;*.*_/usr/local/sources/epilog/**/*.*

論理ホストとそのすべてのサブディレクトリをUNIXファイルシステムのディレクトリにマップします。

より多くのルールを持つことができます:

  • ドキュメントは別の場所にある可能性があります
  • より大きなファイルシステムにデータファイルがある可能性があります
  • コンパイルされたfaslファイルは別の場所に保存される可能性があります
  • 他の物理ディレクトリの論理サブディレクトリを使用する場合があります

ただし、ここでも、1つの変換ルールのみを使用します。

説明された例-パート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が物理パス名ではなく論理パス名を記憶していることです。たとえば、ファイルに。という名前の関数がある場合、FOOLispが関数のソースの場所を記録するようにしますが、論理パス名を使用します。このようにして、コンパイルされたファイル、コンパイルされたアプリケーション、またはLispイメージを別のコンピューターに移動し、翻訳を更新すると、FOOそのマシンまたはネットワーク上のどこかにアクセス可能な場合は、ソースをすぐに見つけることができます。そのマシン。

論理パス名には変換が必要です

論理パス名を操作するには、上記のような論理パス名の変換が必要です。多くの場合、それらは単独で翻訳ファイルに保存されます。翻訳を定義してロードすると、対応する論理パス名を使用してファイルをコンパイルおよびロードできます。したがって、それらを使用する一般的なソフトウェアシステムには、対応する翻訳が必要です。ファイルパスに応じて編集する必要がある場合もありますが、翻訳ファイルの読み込み中に計算できる場合もあります。論理ホストと変換がどこでどのように定義されているかを確認する必要があります。

歴史パート2

Symbolics Lispマシンには、システムと論理パス名を登録できるサイト全体のディレクトリがあります。システムをロードすると、この中央ディレクトリを使用してシステム定義を検索でき、通常は翻訳ファイルもロードされます。したがって、このメカニズムは、システムの構造(ファイル、バージョン、パッチ、システムバージョンなど)を示し、システムがどこにあるか(複数のホストまたはファイルシステムに分散している可能性があります)を示します。

論理パス名は、新しいソフトウェアではあまり使用されていません。特定の古いソフトウェア、特にLispマシンで実行されているソフトウェアで時々発生します。この機能はシステム全体で広く使用されていました。

于 2012-12-01T17:43:10.920 に答える