私はLispを学ぶべきだと本当に感じており、それを行うために役立つリソースがたくさんあります。
私は複雑な構文に我慢するのではなく、「伝統的な商用プログラミング」のどこで手続き型言語の代わりにそれを使用するのが理にかなっていると思う場所を見つけます。
Lispで書かれた商用キラーアプリはありますか?
私はLispを学ぶべきだと本当に感じており、それを行うために役立つリソースがたくさんあります。
私は複雑な構文に我慢するのではなく、「伝統的な商用プログラミング」のどこで手続き型言語の代わりにそれを使用するのが理にかなっていると思う場所を見つけます。
Lispで書かれた商用キラーアプリはありますか?
回答:
Lispの主な用途の1つは人工知能です。大学の友人は大学院のAIコースを受講し、彼のメインプロジェクトのためにLispで「Lights Out」ソルバーを書きました。彼のプログラムの複数のバージョンでわずかに異なるAIルーチンを使用し、40台ほどのコンピューターでテストを行ったところ、かなりきちんとした結果が得られました(どこかにリンクするためにオンラインにしたかったのですが、そうは思いません)。
2学期前に、Scheme(Lispに基づく言語)を使用して、AbbottとCostelloの "Who's on First"ルーチンをシミュレートするインタラクティブプログラムを作成しました。ユーザーからの入力は、かなり複雑なデータ構造(他の言語のマップに似ていますが、はるかに柔軟です)と照合され、適切な応答を選択します。また、3x3 スライドパズル(より大きなスライドパズルに簡単に拡張できるアルゴリズム)を解くためのルーチンも書きました。
要約すると、Lisp(またはScheme)を学習しても、AI以外の多くの実用的なアプリケーションは得られない可能性がありますが、他の多くの人が述べているように、これは非常に貴重な学習体験です。Lispのような関数型言語でのプログラミングは、再帰的に考えるのにも役立ちます(他の言語での再帰で問題があった場合、これは非常に役立ちます)。
Lispは大規模で複雑な言語であり、それをサポートするために大規模で複雑なランタイムを備えています。そのため、Lispは大きくて複雑な問題に最適です。
さて、複雑な問題は同じではない複雑な 1。複雑な問題は、小さな細部の多い方ですが、難しいことではありませんています。航空会社の予約システムを書くことは複雑なビジネスですが、十分なお金とプログラマーがあれば難しくありません。違いがわかりますか?
複雑な問題は複雑で、従来の分割統治が機能しない問題です。ロボットの制御、表形式ではないデータ(言語など)、または非常に動的な状況での作業。
Lispは、ソリューションが拡張可能でなければならない問題に非常に適しています。古典的な例はemacsテキストエディタです。それは完全にプログラム可能であり、したがってそれ自体のプログラミング環境です。
Norvigは著書 『PAIP』で、Lispは探索的プログラミングに最適であると述べています。つまり、(オンライン予約システムとは対照的に)完全には理解されていない問題の解決策をプログラミングします。つまり、複雑な問題です。
さらに、Lispを学ぶと、忘れられていた基本的な何か、フォンノイマンとチューリングの違いを思い出します。ご存じのように、チューリングの計算モデルは興味深い理論モデルですが、コンピューターを設計するためのモデルとしては役に立ちません。一方、フォンノイマンは、コンピューターと計算がどのように実行されるかというモデルを設計しました。フォンノイマンモデルです。フォンノイマンモデルの中心は、メモリが1つしかなく、コードとデータの両方をそこに格納することです。Javaプログラム(またはC#、または好きなもの)は、チューリングモデルの顕現物であることに注意してください。プログラムを具体的に設定します。次に、それにスローされるすべてのデータを処理できることを望みます。
LispはVon Neumanモデルを維持しています。コードとデータの間には、事前に決められた鋭い境界線はありません。Lispでのプログラミングは、フォンノイマンモデルの力にあなたの心を開きます。Lispでのプログラミングにより、古い概念を新しい観点から見ることができます。
最後に、インタラクティブであるため、プログラムを開発するときに(コンパイルして実行するのではなく)プログラムと対話する方法を学びます。これにより、プログラミングの方法やプログラミングの見方も変わります。
このイントロで私はついにあなたの質問への回答を提供することができます:それが「伝統的な」言語より優れている場所を見つけますか?
あなたが上級プログラマなら、高度なツールが必要です。そして、Lispほど高度なツールはありません。または、言い換えると、問題が難しい場合、答えは「はい」です。それ以外の場合はありません。
複雑な構文 ??
lispの構文は信じられないほど単純です。
Lisp:emacsで記述されたキラーアプリ。Lispを使用すると、emacsを自由に拡張して、エディターが実行できると考えることができるほとんどすべてのことを実行できます。
しかし、あなたは場合にのみlispの学ぶべき必要に、そしてあなたが仕事で使用するために取得することはありませんが、それはまだ素晴らしいです。
また、私は追加したいと思います:lispが意味をなす場所を見つけたとしても、それがJava、C ++、C#、Python、Rubyなどで使用されるべきだと他の人に納得させることはおそらくないでしょう。
私は直接の経験から答えることはできませんが、Paul GrahamがLispに書いたものを読む必要があります。「キラーアプリ」の部分については、平均を打つことを読んでください。
Lispは、小さなDSLを作成するのに非常に便利です。私は職場で動作しているボックスにLispのコピーを持っています。SQLサーバーデータベースに問い合わせて、C#でデータレイヤーなどを生成するための小さなDSLを書きました。ボイラープレートコードはすべて、C#に出力するlispマクロで記述されています。私はHTML、XML、あらゆる種類のものを生成します。Lispを日常のコーディングに使用できればいいのにと思っていますが、Lispは実用的なメリットをもたらすことができます。
言語の一般的なインデント規則を使用しないと、どの言語もずっと難しく見えます。Lispのそれらをたどると、構文ツリー構造を非常に簡単に表現する方法がわかります(注:プレビューが少しあるため、これは正しくありません。rは、再帰的なクイックソート引数のfnsに合わせる必要があります)。
(defun quicksort (lis)
(if (null lis)
nil
(let* ((x (car lis))
(r (cdr lis))
(fn (lambda (a)
(< a x))))
(append (quicksort (remove-if-not fn
r))
(list x)
(quicksort (remove-if fn
r))))))
let
を使用しdefun
、関数の先頭にa を使用して、fn
変更されないように定義することができます。
新しい言語を学ぶことは、あなたがすでに知っている言語のプログラミングスタイルに常に影響を与えることがわかりました。私にとって、それはいつもJavaである私の第一言語の問題を解決するためにさまざまな方法で考えさせられました。一般的に、それはプログラミングの面であなたの視野を広げるだけだと思います。
lispを学ぶべきかどうかを自問する必要がある場合は、おそらくその必要はありません。
私は80年代に大学で「軽快なクラス」を受講しました。クラスで提示されたすべての概念をgrokkingにもかかわらず、私はせずに残っていた任意の lispの大きなを作るものへの感謝。多くの人がlispを単なる別のプログラミング言語と見なしているのではないかと思います。それは、何年も前に大学でのコースで私がしていたことです。lisp構文(またはその欠如)について不平を言っている人を見かけたら、それらがlispの素晴らしさを理解できなかった人々の1人である可能性が高いです。私は長い間そうした人々の一人でした。
lispへの興味を再燃させたのは、20年後のことでしたが、lispを面白くするものを "理解"するようになりました。クロージャとlispマクロに夢中になることなくlispを学ぶことができたなら、おそらく要点を見逃しているでしょう。
http://www.gigamonkeys.com/book/introduction-why-lisp.htmlから
Lispについて最も一般的に繰り返される神話の1つは、それが「死んでいる」ということです。Common Lispが、たとえばVisual BasicやJavaほど広く使用されていないのは事実ですが、新しい開発に引き続き使用され、新しいユーザーを「死んだ」ものとして引き付け続ける言語を記述するのは奇妙に思えます。最近のLispの成功事例には、ポールグラハムのViawebが含まれます。これは、Yahooが会社を買収したときにYahooストアになりました。オンラインチケット販売者Orbitzなどが使用するITA Softwareの航空運賃価格設定およびショッピングシステム、QPX。PlayStation 2向けのNaughty Dogのゲーム、JakおよびDaxterは主にドメイン固有のLisp方言で記述されています。NaughtyDogはGOALと呼ばれるものを発明しました。ルンバ、ソフトウェアがLで書かれた自律型ロボット掃除機。CommonLispの下位互換性のあるサブセット。おそらくもっとはっきりしているのは、オープンソースのCommon LispプロジェクトをホストしているCommon-Lisp.net Webサイトの成長と、過去数年間に出現したローカルLispユーザーグループの数です。
「Lispは、ついにそれを手に入れたときに得られる深い啓発の経験について学ぶ価値があります。その経験は、実際にLisp自体を頻繁に使用したことがなくても、残りの日のためのより優れたプログラマーになります。」
--Eric S. Raymond、「ハッカーになる方法」
Lispは商用環境では決して使用できない言語の1つであることに同意します。しかし、理解できなくても、それを学ぶことで間違いなくプログラミング全体に対する理解が深まります。たとえば、私は大学でPrologを学びましたが、その後は使用しませんでしたが、多くのプログラミングコンセプトについて理解を深め、使用する言語について(時には)理解を深めました。
Lispを学ぶことは、Javascriptをまったく別の見方に置くでしょう!Lispは本当に再帰と全体の「ファーストクラスのオブジェクトとしての関数」パラダイムの両方を把握することを強制します。SchemeとJavascriptに関するCrockfordsの優れた記事を参照してください。Javascriptはおそらく今日の最も重要な言語であるため、Javascriptを理解することは非常に役立ちます。
さて、私は奇妙かもしれませんが、私はポール・グラハムのエッセイがあまり好きではありません。CommonLispをまだ理解していないのであれば、Lispについての本は非常にラフな本です。代わりに、SiebelのPractical Common Lispに行くと思います。「キラーアプリ」については、Common LispがITAのようなニッチショップでその場所を見つけているようです。そのため、CLの代名詞となるアプリはありませんが、RailsがRuby向けであるように、業界でそれを使用する場所があります。少し掘る。
複雑な構文?lispのすばらしいところは、途方もなく単純な構文を持っていることです。これは単なるリストであり、リストの各要素は別のリストまたは基本データ型のいずれかです。
関数を別のデータ型として考え、使用するためのコーディング能力を強化するため、学ぶ価値があります。これにより、命令型またはオブジェクト指向の言語でコーディングする方法が改善されます。これにより、コードの構造をより柔軟に管理できるようになります。
キラーアプリ?Franz Inc.には成功事例の長いリストがありますが、このリストにはAllegroCLのユーザーのみが含まれています...おそらく他にもあります。私はクラッシュ・バンディクーのゲームの大ファンだったので、私のお気に入りはいたずらな犬の話です。
Common Lispの学習には、Practical Common Lispをお勧めします。それは少なくとも私にとって私が見た他の本よりも簡単にした実践的なアプローチを持っています。
Lispは、従来のプログラミングを使用するあらゆる場所で使用できます。それはそれほど違わない、それはちょうどより強力です。Webアプリを作成していますか?あなたはLispでそれを行うことができ、デスクトップアプリケーションを書きますか?Lispでそれを行うことができます。Lisp、Python、またはその他の一般的なプログラミングで行うことができます(1つのタスクのみに適した言語がいくつかあります)。
最大の障害は、おそらく上司、同僚、または顧客の受け入れです。それはあなたが彼らと協力しなければならないものです。JVMからライブラリまで、Javaインフラストラクチャの現在のインストールベースを活用できるClojureのような実用的なソリューションを選択すると、役立つ場合があります。また、Javaプログラムがある場合は、プラグインアーキテクチャを実行して、そのためのClojureプラグインを作成し、最終的にClojureでコードの半分を作成することができます。
これは私がしばらく考えてきたトピックですが、いつもの時間が主な問題なので、私は本当に決心していません...;)
そして、私はこれらのリンクがこの投稿でもっと見つけられないので、私は公共の利益のためにそれらを追加します:
成功と失敗のストーリー: JPLでのLisping
本当に印象的なサクセスストーリー: Orbitz社で使用されているLisp
Javaの代わりにLispを使用するかどうかの比較と分析: Javaの代替としてのLisp
これはキラーアプリであるとは言いませんが、かっこいいhttp://code.google.com/p/plop/のようです。