4

私は現在、パッケージ、システムなどに頭を悩ませようとしています。

パッケージ、システム、モジュール、ライブラリを読みました - WTF? 数回、私はまだそれを正しくするのに苦労していると思います.

Lispソースファイルを2つのファイルに分割したいだけで、一方が他方を「使用」する場合 - どうすればよいですか? このためのシステムを構築する必要がありますか? モジュールを使用する必要がありますか? …? 私は Node.js のバックグラウンドを持っています。

var foo = require('./foo');

file にエクスポートされたものへの参照を取得しますfoo.js。Lispでこれに最も近いものは何ですか?

ASDFはシステム用であり、少なくともそのドキュメントによると、Quicklispの一部としてバンドルされていることを理解しています。

ASDF は、アクティブな Common Lisp 実装の最近のすべてのリリースと、quicklisp […] にバンドルされています。

わかりました、Quicklisp はライブラリ用ですが、それらの関係は何ですか? Quicklisp は他の言語では「パッケージ マネージャー」のようなものですか? もしそうなら、ASDFは正確に何を提供しますか?

たくさんの質問をして申し訳ありませんが、Lisp アプリケーションを構築する方法を理解するのに苦労していることを示しているだけだと思います。どんな助けでも大歓迎です:-)

4

2 に答える 2

8

システム

大規模なシステムを構築するには、システム管理ツールを使用します。「無料」のものはASDFです。

ライブラリまたはアプリケーションの一部をリストするシステム宣言が必要になります。通常、それは独自のファイルに入ります。次に、システムをロードするか、システムをコンパイルします。それを行う方法のチュートリアルがあるはずです。

単純な Lisp システムには、次のファイルが含まれる場合があります。

  • システム、そのパーツ、その他必要なもの (他のシステム) を記述したシステム ファイル
  • 使用される名前空間を記述するパッケージ ファイル
  • 基本的なツール ファイル (マクロで使用される関数の例)
  • マクロを一覧表示するマクロ ファイル (残りのソフトウェアの前にコンパイル/ロードするために使用)
  • 機能を持つ 1 つ以上の他のファイル。

Quicklisp はそれとは独立しています。ソフトウェア配布ツールです。

ファイルをコンパイルしてロードするためのクイックハック

ただし、システムツールを使用せずに、昔ながらの方法でファイルをコンパイルしてロードすることもできます。

(defparameter *files*
  '("/yourdir/foo.lisp" "/yourdir/bar.lisp"))

(defun compile-foobar ()
  (mapc #'compile-file *files*))

(defun load-foobar ()
  (mapc #'load *files*))

(defun compile-and-load ()
  (mapc (lambda (file)
           (load (compile-file file)))
        *files*))

実際にはそれ以上のこともあるかもしれませんが、多くの場合それで十分です。独自の構築ツールを作成するのは簡単なはずです。典型的なシステムツールは、構造化された方法でより複雑なソフトウェアを構築するためのより多くの機能を提供します。これらのツールのアイデアの多くは、少なくとも 35 年前にさかのぼります。たとえば、Lisp Machine マニュアルを参照してください。ここでは、1984 年版で、 Maintaining Large Systemsの章があります。

ファイルの役割

単純な Common Lisp では、ファイルの役割とそのセマンティクスはそれほど複雑ではないことに注意してください。

ファイルは名前空間ではなくクラス/サブクラスまたはオブジェクトに関連付けられておらモジュールでもありません。必要に応じて、Lisp 構造をファイルに混在させます。ファイルは任意の大きさにすることができます (たとえば、1 つの複雑なライブラリには、30000 行の単一のソース ファイルとして提供されるバージョンがあります)。標準的なセマンティクスでファイルが役割を果たす唯一の実際の場所は、ファイルをコンパイルするときです。ファイルのコンパイルにはどのような副作用がありますか? コンパイラはどのような最適化を行うことができますか?

それ以外では、開発環境はファイルのグループのロードやコンパイルなどのサービスを提供し、コンパイル エラーの概要を提供し、定義のソースの場所を記録し、定義などを見つけることができると想定されています。ASDFのようなツールがシステム部分を処理します。

于 2015-06-12T17:25:06.877 に答える
2

Common Lisp には関数がありますが、require非推奨です。コードを 1 つまたは複数の部分に分割し、REPL で対話的に使用する場合は、コードを異なるファイルに配置してから、loadそれぞれのファイルに配置できます。代わりに、完全な Lisp プロジェクトを作成したい場合は、新しいパッケージを作成するための簡単な出発点を提供するquickprojectパッケージが非常に便利であることがわかりました。

于 2015-06-12T16:25:28.320 に答える