Hacker News のソース コードが、関数定義の単純なリストを含む 1 つの大きなファイルに過ぎないことに驚きました。 Git ハブ - news.arc
それは関数型プログラミングの典型ですか?OOP プロジェクトでよくあるように、潜在的に深いディレクトリ構造にある多くの短いファイルにソースがあるのは珍しいことですか?
FP のモジュールは OOP の名前空間と同じですか?
Hacker News のソース コードが、関数定義の単純なリストを含む 1 つの大きなファイルに過ぎないことに驚きました。 Git ハブ - news.arc
それは関数型プログラミングの典型ですか?OOP プロジェクトでよくあるように、潜在的に深いディレクトリ構造にある多くの短いファイルにソースがあるのは珍しいことですか?
FP のモジュールは OOP の名前空間と同じですか?
多くの関数型プログラミング言語 (FPL) があり、それらは大きく異なります。Lisp の方言 (Scheme、Common Lisp、Logo、Arc など) も同様です。
多くの場合、それらはクラス (または同様の概念) を中心に編成されておらず、クラスは多くの場合名前空間と混同されていません。
一部のオブジェクト指向言語では、プログラムは多くのクラスで構成され、クラス階層 (または類似のもの) がディレクトリ構造にマップされ、各クラスが 1 つまたは複数のファイルになります。これにより、多くのファイルで構成されるソフトウェア システムと、これらのファイル/クラスを階層としてブラウズする IDE が生まれます。(これは、コードがブラウザによってアクセスされ、ファイルに基づいて取得されない元の Smalltalk とは異なります)。
たとえば、Common Lisp では、クラスは名前空間ではなく、メソッドは単一のクラスに関連付けられません (複数のメソッドがあるため)。Lisp シンボルの名前空間を提供する「パッケージ」と呼ばれる別の構造があります。そこでは、典型的なソフトウェアシステムは、いくつかの関連機能をバンドルしたファイルで構成されています。通常、より大きな機能単位は独自の名前空間を取得します。
たとえば、グラフィック ツールキットには、ui-backend、ui-user、ui-system、ui-drawing、ui-animation などの複数の名前空間がある場合があります。ui-drawing 名前空間は、いくつかのファイルで使用できます: ui-draw-2d-objects.lisp、ui-draw-3d-objects.lisp、ui-draw-macros.lisp など。単一のファイル ui-draw-2d-objects.lisp は、2D オブジェクト (線、多角形、円、ビットマップなど) を描画するために必要なすべてのクラス、メソッド、および変数をバンドルします。
開発システムは、ナビゲーションを提供する責任があります。しかし、多くの場合、ナビゲーションは階層的ではなく、シンボルの検索と取得に基づいています。その場合、ファイルの大きさはそれほど重要ではありません。ファイルが適切な機能をグループ化し、関連する機能を何らかの方法で識別できるように内部的に編成することがより重要です。
たとえば、すべての長方形描画関数を識別したい場合は、REPL を使用します。
LispWorks では、描画プリミティブはパッケージ "GP" または "GRAPHICS-PORTS" にあります。次に、パッケージ「GP」に「draw-rect」を含むすべてのシンボルを教えてくれるよう LispWorks に依頼できます。
CL-USER 10 > (apropos "draw-rect" "GP")
GRAPHICS-PORTS::%DRAW-RECTANGLE (defined)
GRAPHICS-PORTS::DRAW-RECTANGLE-BOUNDS (defined)
GRAPHICS-PORTS::%DRAW-RECTANGLES (defined)
GRAPHICS-PORTS::DRAW-RECTANGLES-BOUNDS (defined)
GRAPHICS-PORTS:DRAW-RECTANGLES (defined)
GRAPHICS-PORTS:DRAW-RECTANGLE (defined)
上記のリストは、これらのシンボルのそれぞれに定義された機能があり、単一のコロンが付いているシンボルが「エクスポート」されていることを示しています。
次に、これらの記号を使用して、引数リスト、ソース コード、ドキュメントなどの詳細情報を見つけることができます。Common Lisp は、DOCUMENTATION、DESCRIBE、ED などの標準関数も提供します。
したがって、ここでの開発は、いくつかのクラス階層に編成された多数の小さなファイルに基づいているのではなく、モジュールと名前空間の階層として、各名前空間が 1 つまたは複数のファイルに格納された大量の機能をバンドルしています。その後、IDE は非階層的なブラウジングと検索をサポートします。
いいえ、モジュラー プログラミングは FP でも非常に一般的です。モジュール性の同じ一般原則が適用されます。
たとえば、Haskell では次のように言えます。
import qualified Parsec as P
これにより、名前空間に Parsec 解析ライブラリが提供されますP
。
モジュールと名前空間が「OOP の名前空間と同じ」かどうかは、関数型言語と OOP 言語に依存します。(ML モジュールは他の言語とは少し異なります。)