2015幎の䞀般的なLisp゚コシステムのステヌタス

翻蚳者から

Common Lispには80幎代のラむブラリはなく、他にもラむブラリがないこずをよく耳にしたした。そのナヌザヌの倚くは、DARPAカタコンベで人工知胜に取り組んでおり、普通のプログラマヌの日垞のタスクをよく理解しおいない3.5人の教授です。 この蚘事は、叀いラむブラリに出くわすこずはできたすが、最新のアナログのみを䜿甚する必芁があるこず、既存のラむブラリが開発䞭であり、新しいラむブラリが垞に登堎しおいるこずを瀺しおいたす。



この蚘事の著者であるFernando Borrettiは、Common Lisp゚コシステムぞの積極的な貢献者であり、30以䞊のラむブラリの著者であり、そのほずんどはWeb開発甚です。



合栌した読者はCommon Lispの状況に関する䞀般的なアむデアを埗るこずができ、興味のある人はコヌドを曞くために必芁なものず、詊行タスクに必芁なラむブラリを理解でき、経隓豊富な開発者は最新の開発に぀いお孊び、コミュニティを支揎できるラむブラリを理解したす初心者の質問に答える方法に関するヒントを入手しお、このすばらしいテクノロゞヌぞの関心を殺さないようにしたす。 行こう







ナヌザヌず貢献者の芳点から2015幎8月のCommon Lisp゚コシステムに぀いお説明したす。



この蚘事の目的は、゚コシステムの抂芁を提䟛し、各゚リアでの統䞀を支揎するこずです。



各アプリケヌション領域に぀いお、゚コシステムのこの郚分を統合するための掚奚事項ず、将来の開発のための興味深い方向性が瀺されおいたす。



アプリケヌション開発





りェブ開発





バック゚ンド





WSGI / Rackの類䌌物であるClackは、2009幎から存圚しおおり、十分にテストされおおり、本番環境で動䜜したす。 3぀のWebフレヌムワヌク-Caveman2 、 Ningle 、およびLucerneはこれに基づいおいたす。



Clackは、特定のサヌバヌ実装に瞛られるこずなく、ナヌザヌがWebフレヌムワヌクたたはより優れたWebアプリケヌションフレヌムワヌクを䜜成できるようにするHTTPサヌバヌの抜象化です。



Clackを䜿甚するこずの重芁性を過小評䟡するこずはできたせん。たずえば、Hunchentootなどのアプリケヌションを盎接ビルドする堎合、Hunchentootに関連付けられたす。Wooなどの新しい高速サヌバヌが衚瀺される堎合は、アプリケヌション党䜓を曞き換えお䜿甚する必芁がありたす。 Clackのプラグむン clack-errorsなどを䜜成するず、Clackで䜜成されたフレヌムワヌクに関係なく、すべおのアプリケヌションで自動的に䜿甚できるため、無駄なコヌドの重耇が枛少したす。



Clackを䜿甚するず、HunchentootからWooぞの切り替えず驚異的な加速の喜びは、 libevをむンストヌルしお1぀の重芁な匕数を倉曎するだけのこずです。



結論



Hunchentootの盎接䜿甚を停止したす 。 フレヌムワヌクの1぀であるClackを䜿甚したす。



今埌の䜜業

䞻芁郚分は終了したした。今床は高レベルのものを䜜成したす。 Djangoのように、Clackアプリケヌションの拡匵可胜な管理フレヌムワヌクが良い䟋です。



フロント゚ンド





すべおは、JavaScriptでコンパむルするCommon Lispの機胜に関連しおいたす。 Common Lispはかなり倧きな蚀語ですが、いく぀かのオプションがありたす。







結論



統合する最善の方法は、既存のCL-in-JS実装の1぀を開発するこずです。



今埌の䜜業



CFFIに䌌おいたすが、CL-in-JSの実装甚であるため、ラむブラリの新しいバヌゞョンがリリヌスされたずきにJavaScriptラむブラリぞのバむンディングを曞き換える必芁はありたせん。



JavaScriptでCommon Lispをコンパむルするナヌティリティは実装に䟝存せず、ParenscriptからJSCLたたは他の実装ぞの移行を容易にしたす。



コマンドラむン





長幎にわたり、さたざたなナヌティリティがこの分野に登堎したしたが、その最埌の、最倧の衝動を受けたもの- ロズりェル -マネヌゞャヌ/むンストヌラヌおよびスクリプトランチャヌの実装です。 その優れた機胜の1぀は、たずえばドキュメントを生成するために、小さなスクリプトを実行可胜ファむルに簡単にコンパむルできるこずです。



たた、 cl- travisのいく぀かの問題を回避するためにTravisに実装CLをむンストヌルするためにも䜿甚されたす。



結論



cl-launchを終了し、 Roswellを䜿甚したす。



今埌の䜜業



その他のロズりェルスクリプト。



GUI





長い間、倧きな懞念は完党なGUI゜リュヌションの欠劂でした。 これでCommonQtずQtoolsができたした 。 1぀目は実際のアプリケヌションで長幎䜿甚され、2぀目はそれを簡単にするレむダヌです。



CommonQtを䜿甚する際の最倧の問題は、 Smokeが機胜するための芁件であり、特にLinux以倖のシステムでは、ラむブラリを機胜させるこずが難しい堎合がありたす。 これは、 qt-libsラむブラリに䟝存するQtoolsのおかげで解決されたす。 珟圚のプラットフォヌム甚のSmokeラむブラリをダりンロヌドし、アプリケヌションのカスタマむズず展開をはるかに簡単にしたす。



結論



CommonQtに焊点を圓お、 cl-cffi-gtkの改善を支揎し、他のラむブラリを廃止するこずを怜蚎しおください。



CLIMは興味深いものであり、ナヌザヌむンタヌフェむスを䜜成する方法を暡玢する最埌の詊みでしたが、2015幎には実行可胜なオプションではありたせん。



今埌の䜜業



CommonQtおよびQtoolsの䜿甚に関するその他のチュヌトリアルず䟋。



機械孊習





CLMLは非垞に甚途の広い゜リュヌションです。 Mathematical Systems Inc.によっお開発されたした。 、日本の䌚瀟。 Mike Maulはその埌、それをgithubに移怍し、コヌドを少しクリヌンアップしたした。 時系列チュヌトリアルが利甚可胜。



この分野のもう1぀の候補はmglです 。これは、著者がヒッグスボ゜ン機械孊習チャレンゞに勝぀ために䜿甚したものです。



数倀蚈算の分野では、私はい぀もAntikラむブラリに興味がありたしたが、残念ながら、GPLの䞋で普及させるGNU Scientific Libraryに䟝存しおいたす 。 mgl-matずLLAもありたす。



結論



LLAずmgl-matからの蚈算甚パヌツずCLMLずmglからの機械孊習パヌツを組み合わせるこずで、この分野のほずんどの問題を解決できたす。



今埌の䜜業



CLMLにはおそらく、蚈算を操䜜するための倚くのコヌドが含たれおおり、 SciPy型ずNumPy型の別のラむブラリに移動できたす。



デヌタベヌス





cl-dbiは、さたざたなデヌタベヌス固有のラむブラリcl-postgres、cl-mysqlなどぞのナニバヌサルむンタヌフェむスを提䟛したす。 SxQLは、安党で自動的にパラメヌタヌ化された SQLク゚リを構築するためのDSLを提䟛したす。



2぀の等しく完党なORMがありたす。このレビュヌの著者のCraneずcl-dbiの著者のIntegral です 。



結論



cl-dbi以倖の䜿甚を犁止したす。



今埌の䜜業



Oracleなどの他のデヌタベヌスのバむンディングが存圚したす。 cl-dbiのドラむバヌを䜜成するこずは、統䞀を促進および支揎する最良の方法です。



グラフィックス





グラフィックをプログラミングしたこずがないので、この分野の知識はほずんどありたせん。 CEPLず姉効プロゞェクトのVarjoがあり 、 ビデオチュヌトリアルの優れたコレクションがありたす。 もちろん、 cl-openglやcl-sdl2などの䜎レベルのラむブラリがありたす。



結論



CEPLはほが完成しおいるため、䜿甚を促進したす。



今埌の䜜業



pgのような高レベルのOpenGLラむブラリは玠晎らしいでしょう。



この領域には、特にさたざたなメッシュや他の3D圢匏を操䜜するためのラむブラリが倚くありたす。



競争力





cl-asyncは、おそらく競合に関連するあらゆるものに察する最も完党な゜リュヌションです。 たた、 Node.jsの背埌にあるラむブラリlibuvの䞊に構築されおいたす。



この分野の他の泚目すべきラむブラリ







軍団のような図曞通は、特定の堎合の競争を簡玠化したす。



結論



今埌の䜜業



この分野には、新しいアむデアの䜙地がたくさんありたす。



ファむル圢匏





Common Lispには、すべおの䞀般的なファむル圢匏のラむブラリがありたす。







JSONラむブラリに新しく远加されたのは、非垞に高速なJSONゞェネレヌタヌおよびパヌサヌであるJonathanです。



結論



XMLおよびJSONラむブラリが倚すぎるため、遞択が麻痺しおしたいたす。



今埌の䜜業



YAMLパヌサヌ。cl-yamlがlibyamlに䟝存しないようにするため、配垃がはるかに簡単になりたす。



システムの盞互䜜甚





UIDFずASDFの互換性レベルには、ホスト名のク゚リから倖郚プログラムの実行および環境倉数の操䜜たで、あらゆる機胜を移怍するための膚倧なナヌティリティのセットが含たれおいたす。



結論



すべおにUIOPを䜿甚したす。 cl-fadを䜿甚しないでください。 OSICATを䜿甚しないでください。



今埌の䜜業



この分野で興味深いプロゞェクトは、LLVM IRを文字列ずしお、たたはLLVM APIバむンディングを䜿甚しお生成するDSLです。 これにより、信じられないほど匷力なマクロシステムを備えたアセンブラヌ蚀語ずしおCommon Lispを䜿甚できるようになりたす。 たずえば、高床に最適化されたSIMDベクトル化数倀コヌドをJITコンパむルするには。



その他





ベンチマヌク





HaskellでCriterionのようなフレヌムワヌクを䜜成するこずは、倧きな前進です。



解析





ここでは、通垞esrapを遞択したす。これは、Lispのような文法蚘述からパヌサヌを生成したす。 この分野でさらに倚様性が必芁です。 最近、高速ベクトル解析ラむブラリであるproc-parseがリリヌスされたした。



ロギング





Common Lispにはlog4clやvomなどの優れたロギングナヌティリティがあるこずを陀いお、これに぀いおはあたり蚀えたせん。



開発





型システム





繰り返したすが、ここで蚀うこずは䜕もありたせん。ただし、Common Lispには非垞に優れた型システムがあり、そのシステムは最倧限に䜿甚されおいたせん。



結論



CLOSには、Flavorsの珟存するバヌゞョンの䞭で競合他瀟はいたせん。これは、Common Lispでの実際の唯䞀のOOP実装です。



今埌の䜜業



私はよくtrivial-typesを芋たす。これは倚くの単玔な型指定子を含むラむブラリです。 このCDRを含むより倧きなラむブラリがあれば䟿利です。



テスト䞭





倚くのテストフレヌムワヌクがありたすが、䞻なものはFiveAM以降のProveです。



既存のラむブラリの䞭で、Proveは良い候補です。 拡匵可胜なレポヌトゞェネレヌタヌは玠晎らしいものであり、拡匵性に察する䞀般的なアプロヌチにより、テストフレヌムワヌクの問題に察する優れた゜リュヌションずなりたす。



その他の叀いラむブラリは、rtやlisp-unitなどのフレヌムワヌクに䟝存しおいたすが、それらはもはや機胜したせん。



結論



FiveAMおよびProve以倖のテストフレヌムワヌクの䜿甚を犁止したす。



今埌の䜜業



珟圚の状況では、新しいテストフレヌムワヌクを曞くず逆効果になりたす。 䜜業は、既存のものの統合に焊点を合わせる必芁がありたす。



クラりドテスト





Common Lispは、 TravisやCoverallsなどのサヌビスの䜿甚をサポヌトしおおり、それぞれクラりドでコヌドをテストし、カバレッゞを远跡したす。 このための2぀の䞻芁なラむブラリはcl-travisずcl-coverallsであり、どちらも非垞に䜿いやすいです。 私の経隓では、Common Lispプロゞェクトのカバレッゞのテストず远跡は、Pythonプロゞェクトの同じものよりも間違いなく簡単です。



結論



cl-travisにはいく぀かの問題がありたす。たずえば、実装をむンストヌルするためにsudoが必芁なため、Travisの新しいDockerベヌスのむンフラストラクチャを䜿甚できたせん。



Roswellはこの問題を解決するため、cl-travisでRoswellを䜿甚するこずをお勧めしたす。 ここでは、RoswellずTravisの䜿甚に関するチュヌトリアルを芋぀けるこずができたす。



今埌の䜜業



Circle CIなどの倚くのサヌビスのサポヌトは垞に圹立ちたす。 チュヌトリアルも良い远加になりたす。



ドキュメント





Read the Docsスタむルのオンラむンで自動的に曎新されるドキュメントには、 docparserを䜿甚しおプロゞェクトAPIの説明を匕き出すQuickdocsがありたす。



ドキュメントゞェネレヌタヌは意倖ず少ないです。 Codexを䜿甚しおドキュメントを生成したす。 圢匏に䟝存しないドキュメントの内郚衚珟を提䟛するラむブラリであるCommonDocで蚘述されおいたす。 CodexはSphinxに䌌おいるように蚭蚈されおいたす。ドキュメントは散文で曞かれおおり、マクロを䜿甚しお、自動的に取埗したAPIドキュメント関数、マクロ、クラスなどをテキストに挿入したす。



結論



READMEからQuickdocsを参照したり、新芏ナヌザヌにアドバむスするなどしお、Quickdocsの䜿甚を促進したす。



今埌の䜜業



CodexずCommonDocの䜜業を継続し、CommonDocの改善䞻に新しい出力圢匏ずマクロはCodexに反映されたす。



Unicode





これは、ほずんどの実装で本質的に解決された問題です。 UTF-8以倖の゚ンコヌディングがむンストヌルされおいるず、問題に遭遇する堎合がありたすが、これは、SBCLなどで簡単に修正できたす。



(setf sb-impl::*default-external-format* :utf-8)
      
      







Cラむブラリを操䜜した堎合でも、他のUnicodeの問題に遭遇したこずはありたせん。



結論



ABCLなど、䞀郚の実装はUnicodeサポヌトに遅れをずっおいたす。



今埌の䜜業



Unicodeサポヌトは、 cl-unicodeラむブラリを改善するこずで解決できたす。



パッケヌゞ管理





Quicklispは、 Common Lispの事実䞊のパッケヌゞマネヌゞャヌです。 これで十分です。 動䜜するものを砎壊しないでください。



結論



すべお順調です。



今埌の䜜業



QuickdocsやqlotなどのQuicklispベヌスのナヌティリティ。



ビルドシステム





ASDFは、Common Lispの事実䞊のビルドシステムです。 誰もが圌女を䜿甚しおいたす。



各プロゞェクトには、システム定矩ず呌ばれる.asdファむルがあり、プロゞェクトのメタデヌタ䜜成者、メンテナヌ、ホヌムペヌゞなどずそのコンポヌネントを瀺したす。



私にずっお、これはCommon Lispの䞻な魅力的な機胜の1぀です。 Pythonのような蚀語では、各ファむルは必芁なものをむンポヌトし、プロゞェクトはファむル間の䟝存関係の巚倧なグラフになりたす。 ASDFでは、定矩された順序でプロゞェクトファむルをリストするだけです。 たたは、ファむル間の䟝存関係を指定しお、ASDFに順序自䜓を蚈算させるこずができたす。 䞀番䞋の行は、䟝存関係が明確か぀明確に衚瀺されるこずです。



しかし、十分な動揺。 䞻なこずは、誰もアナログを䜜成したくないからではなく、ASDFが数幎前にすべおの遞択肢を砎壊したためです。 そしおそれは良いこずです。



結論



すべお順調です。



今埌の䜜業



ASDFの远加コンポヌネント、たずえばC / C ++ファむルのビルド甚。 Lispラむブラリが必芁ずする倖郚Cラむブラリをロヌドするためのプラットフォヌムに䟝存しないパッケヌゞマネヌゞャは非垞に䟿利です。



開発環境





SLIMEはEmacsに基づいたCommon Lispの開発環境であり、最も広く普及しおいたす。 Emacsで䜜成されおいるずいう事実は問題です。なぜなら、新しいナヌザヌにSLIMEを䜿甚するためにEmacsを孊ぶ必芁があるこずを䌝えるこずこれは完党に真実ではありたせんは、CLを孊ぶための重倧な人為的な障害だからです。



結論



SLIMEを䜿甚するには、䟵入障壁を枛らしたす。



今埌の䜜業



Emacs以倖の環境では倧きな害はありたせん。 Swankサヌバヌで動䜜するAtomのプラグむンは非垞に䟿利です。



おわりに





特定の問題





コミュニケヌション





Common LispでWebアプリケヌションを䜜成し、Clackを知らない人の数は倚すぎたす。 明らかに、優れたラむブラリに぀いお朜圚的なナヌザヌに通知するこずには問題がありたす。



遞択の麻痺





特定の領域でコヌドを蚘述するためにどのラむブラリを䜿甚するかを尋ねられた堎合、その領域で最適なラむブラリのみを掚奚する必芁がありたす。 「X、Y、Zも取るこずができる」ず蚀うこずは、遞択の逆説を悪化させるだけです。



誰かがグラフィカルむンタヌフェむス甚のラむブラリを芁求した堎合、「 QtoolsでのCommonQt 」ず答え、「しかしcl-cffi-gtkたたはLTKを䜿甚するこずもできたす...」を远加しないでください。



Webアプリケヌションに䜕を䜿甚するか尋ねられたら、Clackのフレヌムワヌクの1぀ぞのリンクを共有しおください。 Hunchentoot、Wookie、Woo、たたはその他のサヌバヌに぀いお話さないでください。



䜿甚する開発環境を尋ねられた堎合は、それらをSLIMEに向けおください 。 CLISPでのみ動䜜する2005幎の泥だらけのプロゞェクトに぀いおは話さないでください。



そしお最も重芁なこずは、どの実装を䜿甚するか尋ねられたら、 SBCLたたはCCLず答えおください 。 「たあ、埋め蟌みにはECLを、JVMにはたらくためにABCLを䜿甚するこずもできたす」ず蚀わないでください。 それらは、初心者にクむックスタヌトを䞎えるためではなく、より狭いケヌスで䜿甚するためのものです。



開発





Quicklispダりンロヌド





以䞋は、1月から7月たでのQuicklispからの100の最も人気のあるプロゞェクトのダりンロヌド総数です。







リポゞトリ





Githubの新しいCommon Lispリポゞトリのこのフィヌドを賌読したした 。 たた、 Newsbeuterデヌタベヌスぞのク゚リ甚のコヌドをいく぀か䜜成したした。



 (ql:quickload (list :dbi :yason :local-time :group-by)) (defvar *connection* (dbi:connect :sqlite3 :database-name (merge-pathnames #p".newsbeuter/cache.db" (user-homedir-pathname)))) (let* ((output (merge-pathnames #p"lisp-github.json" (user-homedir-pathname))) (query (dbi:prepare *connection* "SELECT pubDate FROM rss_item WHERE feedurl = ?")) (results (mapcar #'(lambda (result) (local-time:unix-to-timestamp (getf result :|pubDate|))) (dbi:fetch-all (dbi:execute query "http://planet.lisp.org/github.atom"))))) (with-open-file (stream output :direction :output :if-exists :supersede :if-does-not-exist :create) (yason:encode (mapcar #'(lambda (group) (list (local-time:format-timestring nil (first group) :format (list :year #\- :month #\- :day)) (1- (length group)))) (group-by:group-by-repeated results :keys (list #'identity) :tests (list #'(lambda (ab) (= (local-time:day-of a) (local-time:day-of b)))))) stream)))
      
      







2015幎3月23日から2015幎8月20日たでに、882のリポゞトリが䜜成されたした。







謝蟞





Unicodeサポヌトに関するコメントを寄せおくれたJavier Olaecheaに、 深町栄倪郎ずフラン゜ワルネリドヌ 、そしおHaskell゚コシステムの状態に関する最初の蚘事を寄せたGabriel Gonzalezに感謝したす 。



All Articles