NikodemusのCommon Lisp FAQ

NikodemusのCommon Lisp FAQ


最終曎新2012-04-13

これは非垞に非公匏のCommon Lisp FAQで、Nikodemus Siivolaの䞻芳的な意芋を反映しおいたす。 このテキストは、むンタヌネットおよびcomp.lang.lispにある他のFAQに䞀郚基づいおいたす。
あなたが私があなたのテキストを䜿ったず思うなら、私はそれを認めおうれしいので、nikodemus @ random-state.netに曞いおください。
このFAQの珟圚のバヌゞョンは、次のアドレスで入手できたす。
http://random-state.net/files/nikodemus-cl-faq.txt
http://random-state.net/files/nikodemus-cl-faq.html
FAQはcomp.lang.lispでも定期的に公開されおいたす。

最初の


Common Lisp CL クリスプ Lisp

「Common Lisp」は、ANSIによっお暙準化された蚀語の名前です。
「CL」は、以前の名前の最も奜たしい省略圢です。
「Clisp」はCommon Lisp実装の1぀の名前であるため、適切な略蚘ではありたせん。
「Lisp」は、CLが属する蚀語のカテゎリです。
「LISP」は玄20幎間曞かれなくなりたした。CommonLispはLispず略されるこずがよくありたす。
コンテキストから正確に䜕が議論されおいるかが明らかです。

それで䜕

ここで蚀語に぀いお読むこずができたす
http://random-state.net/features-of-common-lisp.html

Common Lispを孊ぶには

  1. Common Lispに関する良い本を読んでください。
  2. それを䜿い始めおください。

倚くの人々は、最初の道を耇数回蟿ろうずしたすが、2番目の道は忘れたす。
たあ、真実は、あなたがそれを䜿い始めなければ蚀語でプログラムするこずを孊ぶこずができないずいうこずです。 そしお、かなり倧きなプログラムで䜜業しないず、䞀般に倚くのこずを正しく理解するこずは䞍可胜です。

回避すべき萜ずし穎は䜕ですか

優れた本は、蚀語の機胜ずトリックに぀いお説明したすが、倚くの人が぀たずく心理的および瀟䌚的なポむントがいく぀かありたす。

  1. Lispマクロを孊ぶのはおかしい。
    Lispマクロはクヌルなものですが、初心者に䞎える力はしばしば混乱を招きたす。
    倚くの堎合、問題の症状は、これが行われる理由を明確に理解せずに䜕かを実行しようずするこずです。 マクロを䜿甚しお実行できるこずはすべお、マクロなしで実行できるこずを忘れないでください。 もちろん、それはそれほど実甚的ではないかもしれたせんが、その蚘憶は倩から地に䜎䞋したす。
    走るこずを孊ぶ前に、歩くこずを孊ぶ。 特にそれ以来、飛ぶこずができたす。
  2. Lispは完璧ではなく、これはニュヌスではありたせん。
    Lispに期埅を寄せる人もいたすが、がっかりしおいたす。 他の人は、LispをX蚀語ず比范し、前者が䜕かに負けおいるこずを発芋したす。
    どちらも正しく掚論し、合理的な䞻匵をするこずができたすが、これらの人々がどこか、たずえば#lispで䞻匵を鳎らし始めるず問題が始たりたす。
    掚論が正しい堎合、問題はすでに100回議論されおいる可胜性が高く、誰もそれを再議論する力や垌望を持っおいたせん。
    議論が間違っおいるか、実際よりも理論的である堎合、毎幎䞍満を持っおいる新参者がそのような質問を絶えず提起するずいう事実にもかかわらず、誰も再議論する力や欲求を持っおいたせん。
    これは、むンタヌネット䞊でLispに぀いお悪口を蚀うこずを犁じおいるずいう意味ではありたせんが、...初心者の堎合は、すべおが悪いず蚀っお、人々が䞡手を広げお来るこずを期埅しないでください。 たずえあなたが癟倍正しいずしおも。
    コミュニティのために倚くのこずを行っおきた高霢者からの苊情には、もっず倧きな重みがありたす。
  3. 経隓豊富な公共の盗聎者は倚くのトロルを芋たす。
    たくさんのトロリヌ 戞惑う初心者は時々トロルのように芋えたすが、これはほずんどの堎合、ほずんどのトロルがLispの初心者を装うからです。
    したがっお、人々はあなたがトロルであるず考え、それに応じお察応するかもしれたせん。
    これを避ける最善の方法は瀌儀正しくするこずです。 誰かがあなたが間違っおいる、たたは間違っおいるず蚀った堎合、圌が正しいか、たたはあなたが間違っおいるか間違っおいる可胜性が高いず考えおください。


どの本から始めたすか

Peter Seibelによる「Practical Common Lisp」PCLずも呌ばれたすから始めたす。 プログラミング蚀語を既に知っおいる堎合、これは良い出発点です。 この本は、電子圢匏および印刷圢匏で入手できたす。

http://www.gigamonkeys.com/book/

別の良い本は、Common LispA穏やかなシンボリック蚈算入門、David Touretzkyです。 プログラミングの初心者たたはPCLが耇雑すぎるず感じる人は、この本を読むべきです。 それから始める堎合、それでもPCLを読んでください。 すでにPCLを読んですべおを理解しおいる堎合は、これを安党にスキップできたす。 この本は、電子圢匏および印刷圢匏で入手できたす。

http://www.cs.cmu.edu/~dst/LispBook/index.html

良い本はただたくさんありたすが、これら2぀は初心者に最適です。 Lispの土地は悪くありたせんが、私の謙虚な経隓では誀解を圢成する可胜性がありたす。 それで始めるなら、ずにかくPCLを読んでください。

蚀語仕様の電子バヌゞョンであるHyperspecたたはCLHSを必ずチェックしおください。 これは単なる貎重なリファレンスです。

http://www.lispworks.com/documentation/HyperSpec/index.html

すぐにガむドを読むために急がないでください。 それがどこにあるかを知っおいるだけで、CLに぀いお考えられるすべおの質問に察する公匏の回答が含たれおいたす。 これは、特定のオペレヌタヌが䜕をしおいるかを知るのに最適な堎所です。 さらに、必芁な機胜が蚀語で実装されおいるかどうかを調べるために調べる䟡倀がありたす。

たた、実装に付属のドキュメントを無芖しないでください。 SBCLの堎合、マニュアルは次の堎所にありたす。

http://www.sbcl.org/manual

どの実装を採甚すればよいですか

必芁なものに䟝存したすが、始めたばかりの堎合は関係ありたせん。 ただし、特定のグルヌプからの支揎を埅っおいる堎合は、このグルヌプが䜿甚する実装を䜿甚しおください。

孊習するに぀れお、情報に基づいた遞択ができるようになりたす。 実装間の移行はそれほど難しくないので、これは痛みを䌎う疑いの原因ではありたせん。

私はSBCLに非垞に䞍満です。

http://www.sbcl.org/

SBCLは、オヌプン゜ヌスが付属し、倚くのプラットフォヌムWindowsを含むで実行され、コンパむラが含たれ、ANSI互換性を非垞に真剣に考え、䞀般に䞖界に喜びず平和をもたらすため、優れおいたす...私はSBCLの開発者の1人であり、私の䌚瀟であるSteel Bank Studio Ltdは圌に商業的なサポヌトを提䟛しおいるこずに蚀及しおください。

䜕らかの理由でSBCLがあなたに合わない堎合は、次のリストを怜蚎するこずを提案できたす。

開く


コマヌシャル


ラむブラリはどこにありたすか CPANたたはRubyGemsの類䌌物はありたすか

QuickLispはRubyGemsに非垞に䌌おいたす

http://www.quicklisp.org/

倧量のラむブラリを提䟛し、それらの間の䟝存関係を管理したす。 これは非垞に必芁なツヌルです。

CPANに最も近いのは「Cliki」ず「common-lisp.net」です。

http://www.cliki.net/
http://www.common-lisp.net/

...しかし、本圓に良いものはありたせん。

䜿甚するIDE

SBCLを䜿甚する堎合は、EmacsずSlimeを䜿甚しおください。

http://www.common-lisp.net/project/slime/

Emacsを䜿甚したこずがない堎合でも、努力しおSlimeを䜿甚しおください。孊習曲線はそれほど急ではなく、すべおのコマンドはメニュヌからアクセスできたす。

Quicklispを䜿甚しおSlimeを構成できたす。以䞋の「環境のセットアップ方法」セクションを参照しおください。 Mx slime-cheat-sheetで調査を開始できたすが、これはスラむム機胜のほんの䞀郚です。

別の実装を䜿甚しおいる堎合は、開発者が掚奚するIDEを䜿甚しおくださいただし、Slimeはほずんどすべおの実装で動䜜したす。

Lispでの実甚的な䜜業のために、゚ディタは少なくずも次のこずを行う必芁がありたす。



スラむムは、䞊蚘のすべおを実行できたす。

Vimが奜きなら、VimをCommon Lispで曞かれたSlimeパヌトにリンクするSlimvをチェックしおください

http://www.vim.org/scripts/script.php?script_id=2531
https://bitbucket.org/kovisoft/slimv/
http://kovisoft.bitbucket.org/tutorial.html

...しかし、Vim / Slimvを䜿甚しおいないため、保蚌できたせん。

環境をセットアップする方法は


SBCLの入手、Slime、Quicklispのセットアップに関する良いガむド執筆時点はここにありたす

http://mohiji.nfshost.com/2011/01/modern-common-lisp-on-linux/
http://mohiji.nfshost.com/2011/01/modern-common-lisp-on-osx/

WindowsでClispを構成するためのガむドラむン。 ただし、広倧なものを受け入れるこずはできたせん。

http://mohiji.nfshost.com/2011/01/modern-common-lisp-on-windows/

GUIはありたすか

はい、いいえ。 誰もが䜿甚するGUIはありたせん。

ほずんどの商甚LispにはGUIラむブラリが付属しおおり、これらの実装の支持者は提䟛されたラむブラリを奜むようです。 ただし、そのようなラむブラリのコヌドは、Lispの間で移怍できたせん。 商甚実装を䜿甚しおいお、コヌドの移怍性に関心がない堎合は、開発者が提䟛するツヌルを遞択しおください。 ラむブラリの䜜成方法に応じお、コヌドを異なるオペレヌティングシステムに移怍できたす。これはおそらくたさに必芁なものです。

オヌプン゜ヌスキャンプにはいく぀かの解決策もありたす。

CommonQtは、Common LispをQtのスモヌクラむブラリにバむンドするものです。

http://common-lisp.net/project/commonqt/

LTKはTkの䞊に構築されたす。

http://www.peter-herth.de/ltk/

CL-GTK2ずCLGはGTK +にバむンドされおいたすが、これらの開発の珟状に぀いおは䜕も蚀えたせん。 GTKサヌバヌを芋る䟡倀もありたす。

http://common-lisp.net/project/cl-gtk2/
http://sourceforge.net/projects/clg/ http://www.gtk-server.org/

CLIMCommon Lisp Interface Managerは、GUI甚のほが暙準化されたAPI仕様であり、䞊蚘のGUIずはたったく異なりたす。 すべおが芪しみやすく理解できるず期埅しないでください。

http://random-state.net/files/how-is-clim-different.html

倚くの人は、これがGUIを構築するのに最適であるず断蚀したすが、他の人はそれがたったくないこずを䞻匵しおいたす。 ほずんどの商甚LispにはCLIMが実装されおいたすが、McCLIMず呌ばれるポヌタブルなオヌプンラむブラリがただありたすが、最近はあたり開発されおいたせんが、非垞に䟿利です。

http://common-lisp.net/project/mcclim/

CLXは、X11に匹敵する抜象化レベルを提䟛する、X11ぞの移怍可胜な䜎レベルLispむンタヌフェむスです。

http://www.cliki.net/CLX
https://github.com/sharplispers/clx

GUIの問題に厳密に制限されおいない堎合、OpenGL、GLU、およびGLUT APIぞの移怍可胜なバむンディングであるCL-OPENGLに぀いお蚀及しなければ、間違っおいたす。

http://common-lisp.net/project/cl-opengl/

どんなフォヌラムがありたすか

もちろんフォヌラムではありたせんが、Common LispのブログアグリゲヌタヌであるPlanet Lispがありたす。 たくさんの興味深い情報が、過剰にありたせん。

http://planet.lisp.org/

LispForumはちょうど良いフォヌラムです。

http://www.lispforum.com/

しかし、私は頻繁に行ったこずがないので、保蚌したせん。

Usenet / Googleグルヌプにはただcomp.lang.lispグルヌプがありたすが、トロヌルが密集しおいたす。 そこに曞いおいる著者は非垞に読み曞きができたすが、䞍敬な憶枬は普通の出来事です。 これらのグルヌプを読むのは難しいかもしれたせんが、Lispを䜿甚するためにそれらを読む必芁はありたせん。

http://groups.google.com/group/comp.lang.lisp

専門のメヌリングリストは、S / N比がはるかに優れおいたす。 すべおの実装は、独自のナヌザヌを䜜成し、メヌリングリストを参照しようずしたすが、ほずんどのラむブラリも独自のメヌリングリストを䜜成したす。 SBCLの堎合、たずえば次のずおりです。

https://lists.sourceforge.net/lists/listinfo/sbcl-help

オヌプン゜ヌスの開発者ずナヌザヌの間では、freenode.orgの#lispチャンネルが人気です。 ただし、lispはこのトピックに非垞に厳しい順守を持っおいるこずに泚意しおください。このトピックは「Lispで」ではなく、Common Lispです。 より柔軟なルヌルを備えた#lispcafeチャネルがありたす。

ゲヌム開発者のコ​​ミュニティは非垞に掻発ですが、私は特にそれに粟通しおいたせん。 Googleがお手䌝いしたす。

䞀般的なLispプロフェッショナルは、プロリストでコミュニケヌションをずりたす。 Lispの他の方蚀の議論は話題倖であり、初心者からの質問は受け入れられたせん。

http://lists.common-lisp.net/mailman/listinfo/pro

蚀語プロパティ


ファむルをコンパむルする方法は

簡単な答え Lispを起動しお次を入力

 (compile-file "/path/to/myfile.lisp") 


次に、ほずんどの堎合、コンパむルされたファむルをロヌドロヌド...する必芁がありたす。

展開された答えほずんどのコンパむル枈み蚀語は非察話型です-コマンドラむンたたはIDEからファむルをコンパむルしおから、コンパむル枈みファむルを実行したす。 Lispでは、これはそうではありたせん。

䞀般に、プロゞェクトを実行可胜ファむルに倉換できたすが、通垞の䜜業セッションは、予想どおり、線集-コンパむル-実行サむクルずは異なりたす。

通垞、察話は、察話的にコヌドを远加する䜜業セッションを含む実行䞭のLispプロセスず行われたす。

䟋

  1. Emacsを開き、 Mx slime䜿甚しおSlimeずLisp Mx slime起動したす。
  2. たずえば、ASDFを䜿甚しお、既存のコヌドをロヌドしたす。
  3. 目的のファむルを開き、関数を線集しおCc Ccを抌すず、再コンパむルが行われたす。
  4. Slime REPLに行き、倉曎をテストしたす;
  5. 手順3から繰り返したす。


䞊蚘の略語ASDFは「別のシステム定矩機胜」の略です。 このシステムでは、単䞀のコマンドでダりンロヌドたたはコンパむルするために、耇数のファむルを単䞀のシステムに収集する方法を指定できたす。 メむクのようなもの。

実行可胜ファむルを䜜成する方法は

答えは、䜿甚しおいる実装によっお異なりたす。 ドキュメントを参照しおください。 SBCLに぀いお話す堎合

 ;;    SBCL,    save-lisp-and-die. ;;     - MY-FUNCTION. (save-lisp-and-die "my.exe" :executable t :toplevel 'my-function) 


機胜ず適甚-違いは䜕ですか、䜕を䜿甚したすか

簡単な答え FUNCALLを䜿甚できる堎合はどこでも、他の堎合はAPPLY䜿甚したす。

詳现な回答 FUNCALL呌び出すFUNCALL匕数FUNCALL数がわかっおいる必芁がありたす。 APPLY およびMULTIPLE-VALUE-CALL は、匕数の数に関する情報を必芁ずしたせん。

 (defun map-list-with-1 (function list arg) (mapcar (lambda (elt) (funcall function elt arg)) list)) (defun map-list-with-n (function list &rest args) (mapcar (lambda (elt) (apply function elt args)) list)) 


APPLYを䜿甚しおMAP-LIST-WITH-1を蚘述する必芁はありたせんFUNCALL呌び出すFUNCALLほが確実に効率的です。

察照的に、 MAP-LIST-WITH-Nは、呌び出し元ぞの匕数の数が䞍明であるため、 FUNCALLを䜿甚しお蚘述できたせん。 APPLY䜿甚する必芁がありたす。

SET、SETQ、SETF-違いは䜕ですか、䜕を䜿甚したすか

簡単な答え垞にSETFを䜿甚しSETF 。

詳现な回答昔々、Common Lispがただ存圚しおいなかったずき、字句倉数はなく、動的倉数のみがありたした。 そしお、 SETQもSETFもSETF 、 SETだけがありたした。

今日曞かれおいるこず

 (setf (symbol-value '*foo*) 42) 


そのように蚘録された

 (set (quote *foo*) 42) 


最終的にSETQ SET Quotedに枛少しSETQ

 (setq *foo* 42) 


その埌、字句倉数が出珟し、 SETQを䜿甚しおそれらを割り圓おるようになったため、 SETQはSET単なるラッパヌではなくなりたした。

埌に、誰かがデヌタ構造に倀を割り圓お、他の蚀語のL倀をミラヌリングする䞀般的な方法ずしおSETF SETフィヌルドを発明しSETF 

 x.car := 42; 


ずしお曞かれおいたす

 (setf (car x) 42) 


察称性ず䞀般性のために、 SETFにはSETQ機胜も含たれおSETQたす。 SETQは䜎レベルのプリミティブであり、 SETFは高レベルの操䜜であるずSETFたす。

その埌、シンボリックマクロが登堎したした。 シンボリックマクロは透過的であるため、割り圓おられた「倉数」が実際にシンボリックマクロである堎合にSETFがSETQように動䜜するようにSETFれたした。

 (defvar *hidden* (cons 42 42)) (define-symbol-macro foo (car *hidden*)) foo => 42 (setq foo 13) foo => 13 *hidden* => (13 . 42) 


そしお今、私たちは最近自分自身を芋぀けたす SETずSETQは本質的にSETQあり、叀い方蚀から残されおおり、おそらく、次のCommon Lispから脱华されるでしょう。

垞にSETF䜿甚しSETF 。

'1 2 3たたはlist 1 2 3

短い答え曞く

 (list 1 2 3) 


違いがわかるたで。 曞くなら

 '(1 2 3) 


砎壊的に倉曎しないでください぀たり、 SORTたたはNREVERSEを䜿甚しお。

展開された答え最初に、䞀重匕甚笊は倉換するマクロです

 'anything 


で

 (quote anything) 


読みながら

 '(1 2 3) === (quote (1 2 3)) 


第二に、 QUOTEは匕数を蚈算せずに返す特別な挔算子です。 だから

 '(1 2 3) 


リテラルリストを返したす。 ほずんどの蚀語ず同様に、リテラルデヌタを倉曎するず、未定矩の結果が生じたす。 たずえば、コンパむラはリテラルを含む定数を連結できたす。

 (let ((a '(1 2 3)) (b '(1 2 3))) (eq ab)) ; => T  NIL 


その結果、Aを倉曎するずBも倉曎できるずいう事実がありたすが、なぜQUOTE適しおいるのでしょうか。 たずえば、コンパむラが結合できる䞍倉の倧きなリストがある堎合、それらをリテラルずしおマヌクするず、コンパむラに結合する暩利が䞎えられたす。

* EARS *ずは䜕ですか

倉数の宣蚀に䜿甚するもの、 DEFVARたたはDEFPARAMETER 、垞に* SUCH NAME *を実行したす。 たた、ロヌカル倉数にはこれを行わないでください。

 (defvar *-* ...) (defvar -- ...) 


なんで それでも特別な倉数が䜕か分からない堎合は、読んでいる本を読み続け、終了したら戻っおください。ただし、今は耳を䜿っおください。

耳は、非垞に簡単な2぀の単玔な間違いから保護したす。

゚ラヌ1特殊倉数のランダムバむンディング。

 (defparameter foo "foo!") (defun say-it () (write-line foo)) (defun say-more (foo) (say-it) (format t "now say ~A~%" foo)) 


いた

 (say-more "bar!") 


印刷したす

 say bar! now say bar! 


期埅の代わりに

 say foo! now say bar! 


...おっず

゚ラヌ2タむプミスのため、読み取りはロヌカル倉数ではなく特別なものから行われ、譊告は発行されたせん。

通垞、コンパむル時の譊告ずランタむム゚ラヌが衚瀺されたす。

 (defun foo (bar) bat) 


しかし、この前に曞く堎合

 (defparameter bat "baseball") 


゚ラヌは発生せず、デバッグに倚くの時間を費やし、䜕が間違っおいるのかを理解しようずしたす。

自分でコヌドを䜜成する堎合、耳を眮くかどうかはたったく同じですが、コヌドを公開するずき、*耳*がないこずは他の人にずっお時間の無駄を意味したす。 そうしないでください

耳の欠劂は、゚ラヌの感芚を䜜成したす私が芋るずき

 (defparameter - ...) 


䞀芋するず完党に無害に芋えるコヌドが非ロヌカルな副䜜甚や䟝存性を持たないずいう保蚌はないため、コヌドを特に泚意深く読む必芁があるこずを理解しおいたす。

垞に*耳*を眮きたす。 圌らはすべおのルヌルに䟋倖があるず蚀いたすが、この堎合、このルヌルの本圓の䟋倖を芋぀けるこずは非垞に困難です。

良いコヌド
-ニコデマス

Source: https://habr.com/ru/post/J143618/


All Articles