Common Lisp -Wikipedia、無料百科事典

before-content-x4

一般的なLISP

ilustracja
外観

1984年、1994年のANSI仕様

パラダイム

多paradigatic(機能的、オブジェクト指向、手続き型)

タイピング

ダイナミック(リクエストに応じて静的)

実装

Clisp、allegrocl、cmucl、gcl、lispworks、mcl、sbcl

デリバティブ

CLTL1、CLTL2、ANSI COMMON LISP

作成者

Komitet ANSI X3J13

ハードウェアプラットフォーム

マルチプラットフォーム

システムプラットフォーム

マルチプラットフォーム

Webサイト

一般的なLISP (多くの場合、短縮されます cl )-lispプログラミング言語方言、ANSI(x3.226-1994)によって作成された仕様として、実装ではありません。いくつかの実装があり、どちらも閉じられており、FOSSとして利用可能です。
Common LISPは、機能的プログラミングに焦点を当てた一般的な目的プログラミングのマルチパラダイム言語ですが、客観性を使用できるため、プログラマーに大きな自由が得られます。

一般的なLispはLisp方言です。 Sセンセーションを使用して、コード構造とデータ構造を説明します。関数と原因となるマクロは、最初の要素として関数(またはマクロ)の名前を含む文字の形で記録されます。

+  2  2 ))  ;合計2と2、返品4  setf  p  3.1415 ))  ;変数Pを3.1415に設定し、3.1415を返します  #+ また ))  37  42  ;表現にコメントします。結果は42です  ;数を正方形に上げる関数を作成します  defun  四角  バツ ))  *  バツ  バツ )))  ;上記の関数を引き起こします  四角  3 ))  ; 9を返します  ; Letの特別な形式は、新しいローカル変数を作成します。その範囲はブロックの終わりに限定されます。  させて  (() a  6 ))  b  4 )))  +  a  b )))  ; 10を返します  

タイプSkalanne [ 編集 | コードを編集します ]

数値タイプには、整数、浮動および複雑な数値、および通常の画分が含まれます。一般的なLISPは、任意のサイズと精度の数値を表すために多数を使用します。分数タイプは、他のほとんどの言語では利用できません。 CLの数を返すと、自動的に適切なタイプを与えます。

after-content-x4

CLの標識は、必ずしもASCII標準に含める必要はありません。これは、LISPが標準の前に作成されたという事実によるものです。いくつかの実装 [初め] ユニコード標準からの標識を許可します。

シンボリックタイプはリスプに共通していますが、それらの外では不明です。シンボルは、いくつかのデータスロットを備えたユニークな名前のオブジェクトです。
Lispaのシンボルは、他の言語の名前(可変値のストレージ、命名関数)と同様に使用されることがよくありますが、他にも多くの使用方法があります。 CLでは、使用場所に応じて、シンボルは関連する関数または値を返します。たとえば、一部のシンボルは自分自身を使用しています t nil またはパッケージからのすべてのシンボル キーワード

一般的なリスピーの論理値はシンボルで表されます t nil 、そうでない値 nil 、自動的に真実と見なされます。

データ構造 [ 編集 | コードを編集します ]

CLのシーケンシャルタイプには、リストとベクトルが含まれます。多くの関数は、たとえば、さまざまなシーケンシャルタイプで動作することができます 地図

CLの文字は、関数を使用して作成されます 短所 、時には短所(英語のセルもこの名前に短縮されます。 Cons Cell 、時には名前も使用されます ために 、。 ペア )。短所は、2つのスロットが呼ばれるデータ構造です CDR 。リストは、接続されたConsセルのチェーンです。スロットカーCON契約のリストには、リスト要素(たとえば、数字、符号、またはその他のリスト)が含まれており、CDRスロットはリストの次の要素、または特定のセルが文字の最後にあるときのnilシンボルを示します。文字は、木、グラフ、その他のデータ構造を実装するために使用できます。

CommonLISPは多次元ボードをサポートします( 配列 )そして、必要に応じて動的にサイズを変更できます。たとえば、マトリックスを実装するために、多次元ボードを使用できます。ベクター( ベクター )は一次元ボードです。ボードでは、すべてのデータ型(1つのボードに異なるタイプであっても)を保存することも、特定のタイプ、たとえば可変カット番号ベクトルを保存するために特化したボードを使用できます。標準は2つの特殊なプラークを定義します – それは標識ベクトルです、a ビットベクトル ビットベクトル )ビットを含むベクトルです。

Hasheは、キーと値の関係を保存して、キーに基づいて値をダウンロードするのが効率的になります。

名前スペース( パッケージ 、いくつかの言語でとして知られています 名前空間 )記号に対してのみ実装されます。名前空間のシンボル上の非適格文字の解析は、通常、コンピレーション中に行われますが、シンボリック式グラフのセマンティック分析の前でさえも行われます。名前スペースはシンボルをエクスポートして外部インターフェイスとしてマークすることができますが、厳格なカプセル化は決して提供されません。プライベートシンボル、および他の人のクラス、変数の再定義、またはコンパイラ自体の模範的な実装を常に参照することが常に可能です。これは、使用済みライブラリ、アプリケーション、コンパイラがオーガニック全体を形成する仮想マシン内にソフトウェアを作成する哲学です。

after-content-x4

構造 、C構造やPascal Recordsと同様に、任意の数とタイプのフィールドを持つ複雑なデータ構造を表します(呼び出されます スロタミ )。構造は異なります 普通 メタクラサの施設 標準クラス スロットへのアクセスの複雑さを計算します。最適な実装により、構造に保存された値をダウンロードすると、スロットの数に関係なく常に(1)が、構造を再定義できないこと、および構造の再定義後にコードを再併用する必要があるため、常に(1)になります。

クロー [ 編集 | コードを編集します ]

一般的なLISPオブジェクトシステムのクラスは、メタクラスを介したオブジェクトの動作と「メタスペシャリックプロトコル」の使用を変更する機能を備えており、SQLデータベースに自動的に追加および補完的なオブジェクトなど、クリエイターが計画しない動作を可能にします。 [2] または、結合伝播モデルを使用します [3] [4] スプレッドシート連想。

Meto -Special Protocol( モップ )) [5] ANSI標準には含まれていませんでしたが、 [6] その運用と模範的な実装を説明すると、LISPUの実装の中で事実上の標準になりました。

SmallTalkやC ++などの言語とは異なり、 方法 クラス名スペースに属さないでください。彼らはに属します 一般的な関数 パッケージ名(またはモジュールのスペースにあります 名前空間 )。最初の議論だけでなく、特別化することは可能です( 自己 これ )しかし、必要な各引数。 AMOPで説明されている巧妙なメモ化により、マッチング方法を決定することは比較的効率的です。

機能 [ 編集 | コードを編集します ]

CLでは、関数はデータ型として扱われます。これにより、たとえば、他の関数を引数としてダウンロードしたり、他の機能を返したりする関数を作成できます。標準のCLライブラリは、この可能性、たとえば関数を使用しています 選別 比較関数を引数として収集します。これにより、任意のタイプのデータをソートするだけでなく、キーに応じて複雑なデータ構造を並べ替えることもできます。

 選別  リスト  5  2  6  3  初め  4 ))  # ' > ))  ;比較演算子として>を使用してリストをソートします。  ;返品(6 5 4 3 2 1)。  選別  リスト  ' 9  a ))  ' 3  b ))  ' 4  c )))  ラムダ  バツ  ))  <   バツ ))   ))))  ;最初の要素要素に応じてリストをソートします。  ;戻り((3 b)(4 c)(9 a))。  ; lub:(sort(copy-seq '((9 a)(3 b)(4 c)))#' <:key# 'car)  ; 「キーワードパラメーター」を使用します。  

関数の評価モデルは非常に簡単です。パーサーが出会うとき (f a1 a2 a3 ...) 、シンボルfが次のとおりであると仮定します。

  1. 特別オペレーター(セットリストから)
  2. マクロは以前に定義されていました
  3. 関数名

fが関数の名前である場合、A1、A2、A3、A3などは左から右に評価され、関数が存在する場合、引数によって返される値で引き起こされます。また、Mマクロが設計されている場合、特別なフォームと関数の原因のみが残るまで繰り返されます。

関数の定義 [ 編集 | コードを編集します ]

大きい defun 関数を定義するために使用されます。定義には、関数の名前、その引数の名前、および関数の内容を構成する表現が含まれています(英語 )。

 defun  四角  バツ ))  *  バツ  バツ )))  

関数定義には、最適化設定または引数の種類に関する情報をコンパイラに提供する宣言が含まれる場合があります。また、LISPがインタラクティブなドキュメントを生成できるドキュメントのデータを含めることもできます。

 defun  四角  バツ ))  宣言する  整数  バツ ))  最適化  スピード  3 ))  デバッグ  0 ))  安全性  初め ))))  「引数xで与えられた数の正方形を計算します」  *  バツ  バツ )))  

匿名関数は、Lambdaスケールを使用して定義されます。 Lispaのプログラミングスタイルは、多くの場合、他の機能の引数として匿名関数を使用します。

機能の定義と操作に関連する多くの演算子があります。たとえば、関数は関数を使用してコンパイルできます コンパイル 。 CL実装の一部は、インタープリターの関数を起動します。コンピレーションの指示が発行されていない場合、その他はデフォルトでフライトでコンパイルします。

関数名スペース [ 編集 | コードを編集します ]

関数名スペースは、CLとスキームの主な違いである可変空間から分離されています。スペーススペースで名前を定義するオペレーターには、とりわけ含まれています defun だいたい ラベル

関数を別の関数の引数として使用するには、特別な演算子を引数として使用します 関数 、通常は# ‘に短縮されます。関数を使用する最初の例 選別 (上記)は、シンボルを介した関数を指します > # '>

スキーム評価モデルはより単純です – 名前スペースは1つだけで、フォームのすべての要素は任意の順序で評価されます – 議論だけでなく。その結果、ある方言で記述されたコードは、別の方言でより経験豊富なプログラマーにとって誤解を招く可能性があります。たとえば、多くのCLプログラマーは変数を説明する名前を使用しています(例: リスト どうにか )、関数の名前を局所的に観察することで問題を引き起こす可能性があります。値空間に関数を引き起こすには、関数を使用する必要があります Funcall どうにか 申し込み – 複雑なフォーム [a] 評価されたリストの最初の要素として、それらは無条件に許可されていません。これはまた、スキームと一般的なリスプ培養の違いと一見無関係になったようになりました – たとえば、CLクラスでは、インターフェイスのある別の「名前」空間にあります クラスを見つけます 、およびスキームでは、Meroonオブジェクトシステムなどのグローバル環境に追加されました。

問題は、機能の別の名前が利点であるかどうかは、リスプコミュニティの紛争の源であるかどうかです。これは通常呼ばれます debatąlisp-1対lisp-2 。これらの名前は、リチャードガブリエルとケントピットマンによる1988年の記事で発明されました [b] 両方のアプローチを比較する人 [7]

その他のデータ型 [ 編集 | コードを編集します ]

CLの他のタイプは次のとおりです。

  • パス パス名 )ファイルシステム内のファイルを表します。 CLのパスは、ほとんどのファイルシステムでルールを命名するよりも一般的です。つまり、LISPUのさまざまなオペレーティングシステムのファイルへのアクセスは通常同一です。
  • ストリーム ストリーム )入力と出力は、端末または開いたファイルなどのバイナリデータまたはテキストデータのソースで表されます。
  • 状態 これは、プログラムが答えることができるエラー、例外、またはその他のイベントを表すタイプです。

使用中のマクロは関数に似ています。導入された式が計算される関数とは異なり、これらの式の結果のみが関数に転送され、式はマクロに転送されます。マクロはソースコードの変換を表します。これは、SFiringのリストの形で新しいコードを返すためです。要するに、マクロはデータ(S次元)の形式でコードを取得し、別のコードを返すと言えます。

マクロにより、プログラマーは新しい構文形式の言語を作成できます。たとえば、マクロはように振る舞います それまで あなたはPerlaから書くことができます:

 defmacro  それまで  テスト  &体  ))  `` する  ()  テスト ))  、@ )))  ;;例  それまで  =  ランダム  ))  0 ))  書き込みライン  "こんにちは" )))  

それらを含むソースコードを通常評価またはコンパイルできるように、すべてのマクロを開発する必要があります。マクロは、構文ツリー(LISP Sスケール)を取得して返す関数と見なすことができます。それらは、評価者またはコンパイラの前に最終的なソースコードを作成するために発生します。マクロは完全に機能的な一般的なリスピーと書かれており、利用可能な機能を使用できます。 CLのBackQoute( `)を使用した上記の記録は、テンプレート内のコードを置き換える通常のケースを簡素化します。

マクロ衛生と変数の捕獲 [ 編集 | コードを編集します ]

一般的なLISPIマクロを使用すると、原因環境に存在するシンボルを挿入し、コンテキストに存在する変数を使用してコードの生成を可能にします。これらはまさにコールされています非衛生的なマクロ。

このプラクティスは、予期せぬ異常なエラーを引き起こす可能性があります。スキームのようなリスプの方言は、so -calledを使用してそれらを避けてください衛生マクロ。一般的なリスピーでは、通常、一意のシンボルを使用して不要な傍受を避けることができます(関数によって生成されます Gensym ) – それらの使用は、既存のシンボルとの衝突を引き起こすことはありません。

クラシックマクロが便利かもしれません ジェンシムで

defmacro  ジェンシムで  (() &休み  syms ))  &体  ))  `` させて  ループ  ために    syms  収集  リスト   `` Gensym  シンボル名  ))))  、@ )))  

別の問題は、マクロの開発における既存の関数/マクロを不注意に曖昧にすることです。たとえば、次の(間違った)コードで:

 マクロレット  (() する  ... ))  ...  何か他のもの  ... )))  それまで  =  ランダム  ))  0 ))  書き込みライン  "こんにちは" ))))  -   

マクルの近く それまで 呼び出しフォームに開発されます する これは、構築されたマクロを参照する必要があります する 。ただし、これに関連して、 する それは完全に異なる意味を持つことができます。

他のリスプ方言との比較 [ 編集 | コードを編集します ]

一般的なLISPは、最も人気のあるLispu方言であるため、スキームと最も頻繁に比較されます。スキームの前にはCLが先行しており、Lispiの同じ伝統からだけでなく、いくつかの共通の作成者がいます。GuyraldJaySussmanが設計したGuy L. Steeleは、共通のLispu標準化委員会を主導しました。
一般的なLISPは、EMACS LISPやAutolisp(特定の製品に設定された拡張機能の言語)とは異なり、一般的な目的プログラミングの言語です。スキームと同様に、彼は語彙変数範囲を使用しています。しかし、スキームとCLコミュニティの間には文化的な違いがいくつかあり、ケント・ピットマンによると、スキームがLISP言語の家族に属しているかどうかについて疑問があります [8]

ZaltispやFranz Lispのように、デザインが一般的なLispaを指すLispu方言のほとんどは、通訳者の動的変数範囲とコンパイラーの語彙範囲を使用しています。 Algol 68(多くの人が良いアイデアと見なされていた)に触発されたスキームは、字句範囲の変数の排他的な使用を導入しました。 CLはダイナミックレンジもサポートしますが、そのような変数は「特別」として明確に宣言する必要があります。 ANSI CLの通訳者とコンパイラの範囲に違いはありません。

一般的なLISPと呼ばれることもあります lispem-2 スキーム lispem-1 、関数と変数に対するCLによる個別の名前の使用を参照します。 (実際、Clは持っています 多くの 名前、所有権(英語 プロパティリスト )、通常のマクロとコンパイラ、動的および機能的価値)CLのサポーターとスキームの間で、多くの名前を使用することの欠点と利点について長期的な論争があります。スキーム(ほとんどの場合)では、関数名で変数の衝突名を与えることを避ける必要があります。スキームで記述された関数には、多くの場合、名前の引数があります lis LST どうにか 欲望 それらが構築された-in関数と競合しないように リスト 。 CLでは、引数を関数に転送する場合、その名前を参照する必要があります。 選別 その上。

CLは、Boolic変数のサービスの面でスキームとも異なります。スキームは、特別な#Tおよび#Fの値を使用して、真実と虚偽を表します。 CLは、古いキツネの慣習によると、シンボルTとNILを使用します。NILは空のリストも意味します。 CLで、 なんでもいい ナイル川以外の値は、次のような条件付き表現によって真実として扱われます もしも スキームの#f以外の値と同じです。これにより、一部のオペレーターは予測として機能し、さらなる計算のために有用な価値を返すことができます。

最後に、スキームの標準化文書には、CL標準はそうではありませんが、テール再帰の最適化が必要です。 CL実装のほとんどは、テール再帰の最適化を提供しますが、通常はプログラマが最適化指令を使用している場合にのみです。結局のところ、CLプログラミングスタイルは、スキームスタイルが好む再帰の広範な使用を支持するものではありません – スキームプログラマーがテール再帰の助けを借りて表現するものは、CLプログラマーはむしろ反復的な表現の助けを借りて表現したいと思います。 する ドリスト ループ または(最近)パッケージを使用しています 反復

一般的なLISPは、1つの実装(PERLなど)ではなく、仕様(ADAやCなど)によって定義されます。多くの実装があり、標準はそれらが異なる可能性のある領域を表現しています。

さらに、実装には通常、標準に含まれていない機能を提供するライブラリパッケージがあります。特にポータブルな方法でこれらのプロパティをサポートするために、多くのフリーソフトウェアライブラリが作成されています Common-lis.net そしてプロジェクト 一般的なLISPオープンコードコレクション 。ウィキもあります クリキ 図書館と実装に関する情報の交換におけるプログラマーを支援します。

1984年にANSI CLが定義されたとき、ファイル形式、ネットワークプロトコルなどの標準形式の一部として定義する一般的な習慣はありませんでした。そのため、ネットワークソケットでさえANSI CLで定義されていません。それにもかかわらず、コミュニティによって認識される事実上の基準があります マクリム グラフィックインターフェイスとしてまたは usocket ネットワークソケットのインターフェイスとして。また、実装間の互換性を保証するインターフェイスよりもわずかに多いライブラリのクラスもあります Cliki.net

一般的なLISPは、インクリメンタルコンパイラを使用して実装用に設計されています。コンパイルを最適化する標準宣言(インライン関数など)は、言語仕様に示されています。 CL実装のほとんどは、マシンコード機能をコンパイルします。その他は、速度を犠牲にしてバイナリコードの移植性を高めるバイトコードにコンパイルされます。 LISPが解釈されるだけであるという誤った意見は、おそらく一般的なLispu環境がインタラクティブなコマンドラインを保証し、機能を1つずつコンパイルするという事実によって引き起こされました。

CLISPなどのいくつかの普遍的な実装は、 [4] 均一なスクリプトの通訳。 IEは、Perlaインタープリターや均一なコーティングなど、透明な方法でシステムによって引き起こされます。

実装リスト [ 編集 | コードを編集します ]

無料のCL実装には以下が含まれます。

  • もともとカーネギーメロン大学で執筆されたCMUCLは、現在、ボランティアのグループがフリーソフトウェアとして保持しています。 CMUCLは、ネイティブコードにクイックコンパイラを使用します。 Intel X86用のLinuxおよびBSDで利用できます。アルファ用のLinux;ネイティブプラットフォームでは、Solaris、Irix、HP-ux。
  • Steel Bank Common Lisp(SBCL)、CMUCLの支部。 「一般的に言えば、SBCLは、CMU CLとは異なり、携帯性をより重視しています。」 [5] 。 SBCLは、HP/UXを除き、CMUCLと同じプラットフォームで動作します。さらに、PowerPCのLinuxで動作します。 SPARCおよびMIPS、およびMac OS X. Microsoft Windows Systemsの実験的サポート。
  • BYTEコードに統合するポータブル実装であるCLISPは、Microsoft Windowsおよびその他のシステムだけでなく、多くの普遍的および普遍的なシステム(Mac OS Xを含む)で動作します。
  • GNU Common Lisp(GCL)、GNUプロジェクトの標識の下でのコンパイラCL。 ANSI標準とまだ完全には互換性がないため、GCLはMaxima、Axiom、ACL2数学ツールを含むいくつかの優れた言語プロジェクトで選択された実装です。 GCLは、さまざまなアーキテクチャの11のGNU/Linuxで動作し、Windows、Solaris、FreeBSDの下
  • Cに埋め込むために設計された埋め込み可能な一般的なLISP(ECL)
  • OpenMCl [6] 、Macintosh Common Lispuのフリー/オープンソースブランチ。名前が示すように、OpenMCLはMacintoshの最初のネイティブでしたが、現在はPowerPCおよびIntel X86-64のMas OS X、Darwin、GNU/Linuxで動作しています。
  • Movitzは、オペレーティングシステムなしでX86コンピューターでLispi環境を実装しています。
  • System PodLogシステムは、POP-11、およびオプションでProlog、および標準ML(SML)を使用したCLのバージョンを実装し、POP-11およびオプションのPoplogaおよびMLA標準を使用してCLバージョンを実装し、混合言語プログラミングを可能にします。また、コンパイラと通信するエディターであるEMACSに似た統合された統合があります。
  • Javaに関連する:

商業実装には以下が含まれます:

  1. タイプ(cons(eql lambda)t)を除く
  2. LISP-1とLISP-2の名前は、両方のキャンプの対立中に通常の大きな感情を呼び起こすLispiとスキームのイデオロギーの違いからシンボルによって指定された多くのスペースの概念を分離するために選択されました。
after-content-x4