おそらく、この記事は前の2つより前に公開されたはずで、このシリーズではCommon Lispについての私のシリーズですが、決して遅くない方が良いでしょう。
むかしむかし、Paul Grahamの記事を読んでCLを学び始めたとき、私はlispが他の言語をよりよく理解できるという主張にかなり懐疑的でした。実際、CLを知っているプログラマはせいぜい他の言語を学ぶでしょう数週間、そしてこの言語を知っているほとんどの人が数年間それを書いたよりもさらに上に書くでしょう。
しかし今、私はこの声明がまだ真実であるという結論に達しました。
信じて
90年代半ば以降、つまりCommon Lispの標準化以来、プログラミング言語に新しいアイデアは登場していません。
SBCLなどの最新のCL実装のいずれかを選択した場合、実装によって提供される標準ANSI CLとその拡張機能を多少理解すると、次のようなプログラミングパラダイムを理解および理解できます。
- 命令型とそのバリエーション(CLにもあります!それに含まれる残りの制御フロー制御は、他のすべての言語に対応しています)
- 構造的(コメントなし)
- オブジェクト指向とそのバリエーション(クロージャーからCLOSまで)
- 機能的(CLは副作用のローカライズを奨励し、可能であれば副作用なしで記述します)
- イベント指向(コールバック、つまり関数オブジェクトになります)
- 一般化(ポリモーフィズムに関する記事の最後を参照)
- メタプログラミング(Lispです!プログラム自体は言語のオブジェクトです)
- ある程度まで、並列プログラミング
- など-以前のパラダイムを直接実装する言語ツールを使用し、マクロ、CLOS、 条件システムですべてを固定することで、論理パラダイムと組み込みプロローグから始まり、ビジュアルプログラミングで終わる、あらゆるものを言語に追加できます。
すべての主流言語、特にオブジェクト指向言語はCLのサブセットであり、独自の構文とタイピングの分野でいくつかの制限があることを直接確認します(
CL型システムは非常にシンプルですが、同時に、無限に強力で完全に解決不可能ですダイナミクスでも)。
私自身の経験から、FFIと組み込みアセンブラーを使用すると、Cと通常のアセンブラーを操作するよりも理解するのに役立つことがわかっています。
難解な言語を含む多くの関数型言語は、CLを知った後はそれほど難解に見えず、原則として手のひらになります。
ある程度まで、最新のCL実装は、すべての言語に共通のコード最適化手法、多くの低レベルの概念(上記Cを参照)、マルチスレッドプログラミング、および一般的に並列処理に役立ちます(Googleが
Map Reduceのアイデアをどこで得たのか誰もが知っていますか?) 、そして複雑なシステムを構築するという原則さえあります(もちろん、これには経験が必要です)。
私は言語とプログラミングの一般的な概念についてのみ話し、特定のフレームワークとライブラリ、および言語の概念自体に直行するものについては話していませんが、それらを習得することで生産性が向上し、Lispからあなたに馴染みのあるパターンに気づき、構造化することができます情報をより速く。 個人的には、しばらく前にCLの経験がXMLの本質と目的をよりよく理解するのに役立ちました。また、グラフィカルインターフェイスとGUIフレームワークを構築する組織と一般原則を理解するのに役立ちました。
Haskellもあります、はい、彼らは「啓発する」とも言います。 しかし個人的には、Haskellは実際にLispで利用可能ないくつかの基本概念に対する構文糖衣であり、より一般的な方法でしかないと考えています。これにより、目立たなくなり、当然、義務も少なくなります。 これらの概念は次のとおりです。
- パターンマッチング(まあ、 ADT 、はい、しかしADTは本質的にパターンマッチングにのみ必要です)、これは一種の動的なマルチディスパッチです。
- 怠azine、それはストリームとクロージャーに要約されます。
- ポリモーフィズム(実際、これはHaskellに型を持つこのすべての殻が存在する理由です)。 パラメトリック多相性は、概念的には、動的型付けのサブセットであり、アドホックは型ごとにディスパッチします(Lispでは、 通常の if + typepとCLOSなどのより強力なメカニズムの両方によって実現できます)。 誰かが言うだろう-しかし、彼はHaskellでコンパイル中だ! はい、しかし、これはそれほど特別なことではないと思います-試してみると、マクロを記述し、型の操作をコンパイル時とlispに転送できます(そして、いいえ、CLの「上」に新しい言語を発明する必要はありません。特定の形式は標準では指定されていませんが、すべての主要な実装に存在し、タイプに関する情報を提供する「字句環境」のオブジェクトを操作する必要があります)、一般的な用語ではCLタイプシステムのサブセットのみを操作する必要があります私はすでに上にあるので、ダイナミクスでも不溶性です オリリア。