2011-12-07 46 views
8

以下の例は、カプセル化を行うための一例として、ポール・グレアムANSI Common Lispの中で与えられたを作成するときに別のファイルにdefpackageを入れた方が良いです:は、それがパッケージ

(defpackage "CTR" 
    (:use "COMMON-LISP") 
    (:export "COUNTER" "INCREMENT" "CLEAR")) 

(in-package ctr) 

;function definitions here 

しかしピーターSeibels実践Common Lispの中で、リンクhere、彼は言う:

パッケージは、読者によって使用されているので、あなたがそのパッケージに切り替えるIN-PACKAGE 表現を含むファイルをロードしたり、COMPILE-FILEをする前に、パッケージが を定義する必要があります。パッケージは と定義されている必要があります。 が必要なときにパッケージが存在することを確認するための最善の第一歩は、 を読む必要があるコードとは別のファイルにすべてのDEFPACKAGEを入れることです。これらのパッケージでは、

のように、パッケージごとに2つのファイルを作成することをお勧めします.1つはパッケージで、もう1つはコードです。 defpackagesを含むファイルは、(パッケージ内の "COMMON-LISP-USER")で始まる必要があります。

私には、パッケージとコードの前に同じファイルにdefpackageを置くのが、パッケージが使用前に定義されていることを確認する良い方法です。最初の方法は、1つのファイルにすべてを収集する方が簡単です。この方法を使ってパッケージを作成する際に問題がありますか?

答えて

8

私はのでdefpackage用に別のファイルを使用することは良い習慣 であることを考える:あなたはdefpackageであなたのファイルを«汚染»ません

  • エクスポート/シャドー/シンボルを見つけるのが簡単になります。 は、package.lispを参照する必要があります。
  • ASDFを使用する場合、順序について心配する必要はありません。ピーター・サイベルがそう言う

    (defsystem :your-system 
        :components ((:file "package") 
           ... the rest ...))` 
    
  • ;)

EDIT: 私は 新しいCLプロジェクトの作成を容易にquickprojectを言及するのを忘れてしまいました。

REPL> (quickproject:make-project "~/src/lisp/my-wonderful-project/" 
           :depends-on '(drakma cl-ppcre local-time))` 

このコマンドは、ディレクトリを作成します "~/src/lisp/my-wonderful-project/" と、次のファイルを:

  • package.lisp
  • my-wonderful-project.asd (filled)
  • my-wonderful-project.lisp
  • README.txt

したがって、私は同じ慣習を使うことが良いと思います。

+2

私は注文のことがそれらの最も重要な理由だと思うし、もう1つあります:パッケージは複数のファイルに分割されます。 –

+1

パッケージ定義を同じファイルに置くことができる単一ファイルプロジェクトの場合を除いて私はあなたに同意します。 AFAIK、それは標準によって禁じられていません。 –

+0

ASDFを使用するときに複数のファイルと順序が合います。最初の2点は個人の好みによく似ています。 – snowape

1

多くのプロジェクトでは、複数のソースコードファイル、1つの "packages.lisp"ファイル、1つの "project.asd"システム定義ファイルを使用する傾向があります。プロジェクトが複数のパッケージを必要とする場合、パッケージはすべてpackages.lispで定義され、関連するエクスポートがエクスポートされます。

0

独自のファイルにDEFPACKAGEを置く理由はあります。大きなパッケージを持っている場合は、複数の関連する機能グループがあり、機能グループごとに別々のソースファイルが必要な場合があります。そして、すべてのソースファイルは一番上に独自のIN-PACKAGEを持ちますが、それらはすべて外部DEFPACKAGEを「共有」します。その後、DEFPACKAGEが最初にロードされる限り、他のソースファイルをロードする順序は関係ありません。

私が現在取り組んでいる例では、パッケージ内に複数のクラスがあり、ソースファイルはクラスごとに分割されています。各クラスはクラス定義と関連する汎用関数とメソッド定義を持っています。