Common Lisp Webアプリケーションの開発(パート2)

このレビューは、彼らのスタートアップの未来をこの素晴らしい言語に委ねることを決定(または決定)する人々のための小さなガイドです。 主にウェブ開発に重点が置かれるという事実にもかかわらず、私はCommon Lispに関連する何らかの一般的なトピックもカバーしようとします。 資料は、 AlterMoby自身のWeb開発経験から収集されます。



このレビューの第2部では、Lisp環境の基本構成に専念します。 簡単なLispシステムのインストールについて説明します。 さらに、ASDF依存関係管理システムについても簡単に説明します。

画像



先に進む前に、実験に必要な単純なLispシステムをセットアップする必要があります。 以下のインストール手順はDebian Lenny向けですが、おそらく他の多くのLinuxディストリビューション(Ubuntuなど)で動作します。



したがって、まずは、SBCL、Emacs、およびSLIMEのパッケージをインストールしてください。 SBCLは、このレビューの最初の部分で説明したCommon Lispコンパイラです。 Emacsは、プログラムコードを記述するテキストエディターです。 1つの重要な状況でない限り、このエディターを決してお勧めしません。 上記のパッケージの3番目であるSLIMEが書かれたのは彼のためです。 SLIME (Emacs用の優れたLisp対話モード)は、Lispと対話するためのクライアントサーバーシステムです。 SLIMEと呼ばれるクライアント部分は、(拡張モジュールとして)Emacsと統合されます。 SLIMEのサーバー側はSWANKと呼ばれ、Lispと直接対話します。 SLIMEクライアントとSWANKはTCPを介して相互に通信するため、Lispシステムをリモートで制御できます。



これらの3つのコンポーネントをインストールした後、それらを互いに紹介する必要があります。 これを行うには、次の行を〜/ .emacs構成ファイルに追加します。



(setq inferior-lisp-program "/usr/bin/sbcl") (require 'slime) (slime-setup)
      
      





これで、Lispシステムを安全に実行できます。 Emacsを開き、Mxスライムを紹介します(Emacsを初めて使用する場合は、 クイックスタートガイドを参照してください )。 すべてがうまくいけば、REPL(Lisp-console)が開きます。 ( + 1 1 )



ようなものを入力して、SBCLが起動してコマンドを実行していることを確認します。



スライムを使用すると、現在の式の計算、文字定義の検索、コードの書式設定、コンテキストプロンプトの実行などを行うことができます。 SLIMEを使用することの利便性は、ターミナルでの裸のSBCLの作業と比較して否定できないものになります。 後で、Emacsを使用した経験がある場合(以前にEmacsを使用したことがない人向け)、インターフェイスを微調整することができます。 たとえば、背景色とテキストの変更、Unicodeサポートの追加など。 さて、これはそれほど重要ではありません。主なことは、すでに動作可能な単純なLisp環境があることです。



すべてをゼロから作成することはできないため、既製のサードパーティライブラリが必要です。 したがって、それらの配布方法を理解しておくと役立ちます。 ほとんどのサードパーティライブラリは、Common Lispの世界で事実上の標準となっているASDF依存関係管理システムを使用しています。 ASDFをインストールする必要はありません-SBCLに付属しています。



それでは、ASDFとは何ですか? このシステムは、UNIXのmakeユーティリティと比較できます。 単一のファイルから大規模なフレームワークまでのさまざまなコード単位間の関係と依存関係を追跡し、それらのコンパイルとロードを調整します。 ほとんどのASDF互換ライブラリのルートディレクトリには、ソフトウェアシステム(ASDF用語)を説明するasdファイルが1つあります。 あらゆる種類の複雑なシステムは、いくつかのコンポーネントで構成されています。 コンポーネントはモジュールとして、つまり 他のコンポーネントのコンテナ、および別のファイル。 コンポーネントは他のコンポーネントに依存し、システムは他のシステムに依存します。 これらおよびその他のデータに基づいて、ASDFはターゲットシステムのコンパイルとロードの順序を決定します。



システムの構造と関係は、宣言型DSL(サブジェクト指向言語)を使用して記述されます。 このDSLの最も重要な部分はdefsystemディレクティブです。 簡単なasdファイルの例を示します。



 (in-package :asdf) (defsystem my-lib :name "my-lib" :version "0.1" :components ( (:module "common" :components ( (:file "common-file-1") (:file "common-file-2") (:file "common-file-3" :depends-on ("common-file-1" "common-file-2")))) (:module "main" :components ( (:file "main-file")) :depends-on (:common))) :depends-on (:my-base-lib))
      
      





ここで、最初の行には、パッケージ(Common Lispの名前空間の類似物-以降、この値では「パッケージ」という語が使用されます)ASDFに切り替えるディレクティブが含まれています。 これは、1つのヒープ内のシステム記述とその実装コードに干渉しないように、便宜上行われます(代替として、このために新しいパッケージmy-lib-asdを作成できます)。 次に、my-libシステムが定義されます。これは2つのモジュールを含み、システムに依存するmy-base-libです。 通常、各モジュールは、構造的または機能的な機能によって結合されたソースファイルのあるディレクトリに対応しています。 この例では、最初のモジュールは「common」と呼ばれ、独立した「common-file-1」および「common-file-2」の3つのファイルが含まれ、これら2つの「common-file-3」に依存しています。 2番目のモジュールは「メイン」と呼ばれ、単一の「メインファイル」ファイルを含み、「共通」モジュールに依存します。



「my-lib」システムを起動するには、次のコマンドを入力する必要があります。



 (asdf:oos 'asdf:load-op :my-lib)
      
      





このコマンドは、最初に各システム(my-lib、my-base-lib、および後者が依存するコンポーネント)の各コンポーネントの関連性をチェックします。 無関係なコンポーネントは再コンパイルされ、実際のコンポーネントはすぐにメモリにロードされます(つまり、それらの文字は処理され、適切なパッケージに追加されます)。 ターゲットシステムが依存するすべてのシステムまたはコンポーネントが見つからない場合、ブートエラーが発生します。



次に、ASDFがasdファイルを探す場所をどのように知っているかを見てみましょう。 システムのコンパイルまたは起動時に、ASDFはasdf変数に保存されているディレクトリのリストをスキャンします。* central-registry *、必要なasdファイルの存在を確認します(その名前はターゲットシステムの名前と一致する必要があります)。 したがって、新しいシステムをロードする前に、ルートディレクトリへのパスをこのリストに追加できます。 より合理的なアプローチは、利用可能なすべてのシステムのasdファイルへのシンボリックリンクを含む特別なディレクトリを割り当てることです。 この目的のために、ディレクトリ/ usr / share / common-lisp / systems /が適切であり、パスがasdfに追加されます:* central-registry *デフォルト。



ASDFに関する基本的な知識があれば、インターネット上で過剰に利用可能な多くのサードパーティライブラリを既に使用できます(ここでは、Common Lisp専用の最大のポータルであるCLikiが最も重要なガイドになります)。 残っている質問は1つだけです。必要なライブラリをインストールする方法、依存関係を自動的に追跡およびダウンロードする方法などです。 ASDFには基本的な機能しかなく、インストールプロセスを自動化することはできません。 幸いなことに、この問題を解決するのに十分なASDF拡張があります。 特に、これらにはASDF-INSTALLが含まれます。 これらの拡張機能にもかかわらず、最初はそれらを使用せず、依存関係を手動でインストールすることをお勧めします。 これにより、使用するライブラリの内部関係を十分に理解できます。



All Articles