なぜLispを学ぶ必要があるのですか?[閉まっている]


125

私はLispを学ぶべきだと本当に感じており、それを行うために役立つリソースがたくさんあります。

私は複雑な構文に我慢するのではなく、「伝統的な商用プログラミング」のどこで手続き型言語の代わりにそれを使用するのが理にかなっていると思う場所を見つけます。

Lispで書かれた商用キラーアプリはありますか?


5
ないもので延期するのは難しい。
Kaz

フィリップグリーンスパンの履歴書をお読みください。それは本当のLisp作業で溢れています。
Kaz

1
また、ここに。Greenspunは、パケット交換ネットワークシミュレーション、DSP設計、プロセッサ設計、VLSIレイアウト、機械工学の自動化、地球の移動の自動化などに取り組み、すべてLispを使用するか、Lispを使用しました。彼は、Lispマシンで開発されたツールを使用して、Hewlett PackardのPA-RISCアーキテクチャの設計を支援しました。
Kaz

Lispで開発されたいくつかのアプリを以下に示します-Emacs、G2、AutoCad、Igor EngraverおよびYahoo Store
Arulx Z

回答:


55

Lispの主な用途の1つは人工知能です。大学の友人は大学院のAIコースを受講し、彼のメインプロジェクトのためにLispで「Lights Out」ソルバーを書きました。彼のプログラムの複数のバージョンでわずかに異なるAIルーチンを使用し、40台ほどのコンピューターでテストを行ったところ、かなりきちんとした結果が得られました(どこかにリンクするためにオンラインにしたかったのですが、そうは思いません)。

2学期前に、Scheme(Lispに基づく言語)を使用して、AbbottとCostelloの "Who's on First"ルーチンをシミュレートするインタラクティブプログラムを作成しました。ユーザーからの入力は、かなり複雑なデータ構造(他の言語のマップに似ていますが、はるかに柔軟です)と照合され、適切な応答を選択します。また、3x3 スライドパズル(より大きなスライドパズルに簡単に拡張できるアルゴリズム)を解くためのルーチンも書きました。

要約すると、Lisp(またはScheme)を学習しても、AI以外の多くの実用的なアプリケーションは得られない可能性がありますが、他の多くの人が述べているように、これは非常に貴重な学習体験です。Lispのような関数型言語でのプログラミングは、再帰的に考えるのにも役立ちます(他の言語での再帰で問題があった場合、これは非常に役立ちます)。


5
なぜLispはAIにのみ有効だと言うのですか?また、それはマルチパラダイム言語です。機能は、それが可能にするいくつかのパラダイムの1つにすぎません。
ルイス・オリヴェイラ

6
AIにのみ使用されるとは言わず、AIが主な用途の1つであると述べました。あなたはそれを読みました?
ジャスティンベネット

32
「Common Lispは、データベース、ユニットテストフレームワーク、スパムフィルター、ID3パーサー、Webプログラミング、Shoutcastサーバー、HTML生成インタープリター、およびHTML生成コンパイラーにのみ実装されているため、本「Practical CL」
ミカエル・ヤンソン

23
@JustinBennettはい、あなたはそれを言った。ここで:「要約すると、Lisp(またはScheme)を学ぶことは、AIを超えた多くの実用的なアプリケーションを生み出さないかもしれません」。人が間違っている間に対立するとき、私は嫌いです。
Luka Ramishvili

127

Lispは大規模で複雑な言語であり、それをサポートするために大規模で複雑なランタイムを備えています。そのため、Lispは大きくて複雑な問題に最適です。

さて、複雑な問題は同じではない複雑な 1。複雑な問題は、小さな細部の多い方ですが、難しいことではありませんています。航空会社の予約システムを書くことは複雑なビジネスですが、十分なお金とプログラマーがあれば難しくありません。違いがわかりますか?

複雑な問題は複雑で、従来の分割統治が機能しない問題です。ロボットの制御、表形式ではないデータ(言語など)、または非常に動的な状況での作業。

Lispは、ソリューションが拡張可能でなければならない問題に非常に適しています。古典的な例はemacsテキストエディタです。それは完全にプログラム可能であり、したがってそれ自体のプログラミング環境です。

Norvigは著書 『PAIP』で、Lispは探索的プログラミングに最適であると述べています。つまり、(オンライン予約システムとは対照的に)完全には理解されていない問題の解決策をプログラミングします。つまり、複雑な問題です。

さらに、Lispを学ぶと、忘れられていた基本的な何か、フォンノイマンとチューリングの違いを思い出します。ご存じのように、チューリングの計算モデルは興味深い理論モデルですが、コンピューターを設計するためのモデルとしては役に立ちません。一方、フォンノイマンは、コンピューターと計算がどのように実行されるかというモデルを設計しました。フォンノイマンモデルです。フォンノイマンモデルの中心は、メモリが1つしかなく、コードとデータの両方をそこに格納することです。Javaプログラム(またはC#、または好きなもの)は、チューリングモデルの顕現物であることに注意してください。プログラムを具体的に設定します。次に、それにスローされるすべてのデータを処理できることを望みます。

LispはVon Neumanモデルを維持しています。コードとデータの間には、事前に決められた鋭い境界線はありません。Lispでのプログラミングは、フォンノイマンモデルの力にあなたの心を開きます。Lispでのプログラミングにより、古い概念を新しい観点から見ることができます。

最後に、インタラクティブであるため、プログラムを開発するときに(コンパイルして実行するのではなく)プログラムと対話する方法を学びます。これにより、プログラミングの方法やプログラミングの見方も変わります。

このイントロで私はついにあなたの質問への回答を提供することができます:それが「伝統的な」言語より優れている場所を見つけますか?

あなたが上級プログラマなら、高度なツールが必要です。そして、Lispほど高度なツールはありません。または、言い換えると、問題が難しい場合、答えは「はい」です。それ以外の場合はありません。


30
「しかし、十分なお金とプログラマーがあれば、難しくはありません」-十分に多くのプログラマーがいると、それは不可能になります;-)
JonasKölker2009

その場でコードを生成するlispsの機能について読みましたが、コンパイルできることも読みました。インタープリターとコンパイルされた実行を混合できる実装はありますか?またはそこに独自のコンパイラが含まれていますか?
centaurian_slug

@centaurian_slug:はい、絶対に。それは力の一部です。故意に不自由にされていないバージョンは、実行時にコンパイラー/インタープリターを使用できます。したがって、たとえば、開発者はWebサーバーの特別な接続にログインし、デバッグを行って、クラスと関数の定義を更新し、必要に応じてそれらの定義に依存していたものを再コンパイルすることができます。サーバーが稼働している間はずっと。SOXコンプライアンスを心配している企業ではおそらく合法ではありませんが、それが業界がJavaやC#などの頭の悪い言語を使用している理由の1つです
James


46

複雑な構文 ??

lispの構文は信じられないほど単純です。

Lisp:emacsで記述されたキラーアプリ。Lispを使用すると、emacsを自由に拡張して、エディターが実行できると考えることができるほとんどすべてのことを実行できます。

しかし、あなたは場合にのみlispの学ぶべき必要に、そしてあなたが仕事で使用するために取得することはありませんが、それはまだ素晴らしいです。

また、私は追加したいと思います:lispが意味をなす場所を見つけたとしても、それがJava、C ++、C#、Python、Rubyなどで使用されるべきだと他の人に納得させることはおそらくないでしょう。


@ジャスティン:emacsコアがCで書かれていることはおそらく注目に値します。しかし、それは単なる抜粋です-すべてのコマンドはelispで書かれています。
バーナード

3
どちらかというと、一般的なlispのコア構文は単純です。defmacroは構文の拡張を可能にし、組み込みマクロの一部(defmacroなど)は信じられないほど複雑になる可能性があります。ラムダリスト、ネストされたバッククォートなど
Aaron

emacsのCの部分はグルーコードであると言ってもほぼ間違いありません。
Luka Ramishvili

Emacsリファレンスマニュアルによると、「Emacsの編集コマンドのほとんどはLispで記述されています。いくつかの例外はLispで記述されている可能性がありますが、効率のために代わりにCを使用しています。」 gnu.org/software/emacs/manual/html_mono/emacs.html#Intro
dpritch

25

私は直接の経験から答えることはできませんが、Paul GrahamLispに書いものを読む必要があります。「キラーアプリ」の部分については、平均を打つことを読んでください。


2
+1。この回答では、最初のWebアプリであるYahoo Storesが部分的にlispで記述されていることに言及します。ウィキペディアの引用:1998年、Yahoo!Inc.は、Yahoo!の455,000株でViawebを買収しました。約4,900万ドル相当の株式を、Yahoo!お店。
Steven Lu

17

Lispで約1年間プログラムしたので、学ぶ価値はあります。すべてのボイラープレートコードを可能な場合は関数に、マクロをそうでない場合に置き換えることができるため、コードから冗長性を取り除く比類のない機会が得られます。また、実行時に比類のない柔軟性にアクセスして、コードとデータの間を自由に変換できるようになります。したがって、ユーザーのアクションが複雑な構造を動的に構築する必要性を引き起こす可能性がある状況は、Lispが真に優れているところです。人気のある航空会社のフライトスケジューラはLispで記述されており、Lispには多くのCAD / CAMもあります。


9

プログラミングが好きなら、純粋な喜びのためにLispを学ぶべきです。XKCDは、その後に続く知的啓発を完全に表現します。学習Lispはプログラマにとって仏教の僧侶のための瞑想とは何かです(そして私はこれを冒とく的な意味合いなしに意味しました)。


9

Lispは、小さなDSLを作成するのに非常に便利です。私は職場で動作しているボックスにLispのコピーを持っています。SQLサーバーデータベースに問い合わせて、C#でデータレイヤーなどを生成するための小さなDSLを書きました。ボイラープレートコードはすべて、C#に出力するlispマクロで記述されています。私はHTML、XML、あらゆる種類のものを生成します。Lispを日常のコーディングに使用できればいいのにと思っていますが、Lispは実用的なメリットをもたらすことができます。


これにはdotlisp.sourceforge.net/dotlisp.htmを使用します。
Mark Hurd、

5

言語の一般的なインデント規則を使用しないと、どの言語もずっと難しく見えます。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))))))

1
あなたの言うことにはかなりの批判があると思います。私が言うには、「あなたがそれを提示したので、それははるかに難しく見え、それがここで提示されたので、はるかにはっきり見えます」インデントの慣例に従わないと、多くの言語がより混乱するように見えることに同意する必要があると思います。さらに、たとえばJavaとLispのインデントを比較すると、それらを正しくインデントするには、各言語の基本構成の知識とほぼ同じレベルが必要であると私は言うでしょう。しかし、それは完全に主観的ではありますが、それでもまだハードに見えると言うのは公平です。
ワッフル付きのジョン、2010

1
これを少し単純にするために、標準letを使用しdefun、関数の先頭にa を使用して、fn変更されないように定義することができます。
アーロンロブソン

4
@FerretallicA何かが「人間が簡単に読める」か「自己記述的」かをどの基準で判断しますか?英語との類似点は?中国語は「簡単に人間が読める」ですか?数学的表記についてはどうですか?それは「人間が簡単に読める」のではないですか?この種の議論は、「これは、私が最初に推論した方法のようには見えません」という隠されたメッセージであるため、厄介な面倒です。

3
あなたの '反論'のようなものは "Whinge whinge"のようです プログラミング言語のスニフテストを試してください。以前にプログラムしたことがない人を連れて、VBコードのページとLispコードのページを見せてください。偶然の観察者が意味のある観察をより簡単に引き出すことができるようになる2つのうちのどちらに左のナットを喜んで賭けるでしょう。
nathanchere 2013年

1
中国人、日本人、韓国人、シュメール人、ヒンディー語、またはアラビア人の非プログラマーは、安易な議論のために睾丸を放棄するというあなたのかなり勇敢な願望をどう思いますか。

4

新しい言語を学ぶことは、あなたがすでに知っている言語のプログラミングスタイルに常に影響を与えることがわかりました。私にとって、それはいつもJavaである私の第一言語の問題を解決するためにさまざまな方法で考えさせられました。一般的に、それはプログラミングの面であなたの視野を広げるだけだと思います。


それはあなたが優れたプログラマーだからです。悪いプログラマは、新しい知識で古いスキルに影響を与えるのではなく、新しい言語で書いている間、既知の言語で考えます。しかし、なぜlispの後にJavaを使用しているのですか?:) JavaはLisp、imoよりも使いにくいです。
Luka Ramishvili

4

lispを学ぶべきかどうかを自問する必要がある場合は、おそらくその必要はありません。


8
私は反対だと思います。類似の言語の経験があるためにすでにlispを理解している場合は、おそらく必要ありません。lispが何を提供する必要があるかを理解していない場合は、露出から利益を得ることができます。
Fooz氏、2008年

@MrFooz lispのlispy部分を学ぶ必要性を取り除くことができる同様の言語はありません。lispの主な機能はどの言語にもありません。ほとんどがです。
Luka Ramishvili

あなたの目標に応じて。死にたいなら、呼吸する必要はありません。しかし、それはあなたがすべきではないという意味ではありません。
ミモレラ2014年

4

私は80年代に大学で「軽快なクラス」を受講しました。クラスで提示されたすべての概念をgrokkingにもかかわらず、私はせずに残っていた任意の lispの大きなを作るものへの感謝。多くの人がlispを単なる別のプログラミング言語と見なしているのではないかと思います。それは、何年も前に大学でのコースで私がしていたことです。lisp構文(またはその欠如)について不平を言っている人を見かけたら、それらがlispの素晴らしさを理解できなかった人々の1人である可能性が高いです。私は長い間そうした人々の一人でした。

lispへの興味を再燃させたのは、20年後のことでしたが、lispを面白くするものを "理解"するようになりました。クロージャとlispマクロに夢中になることなくlispを学ぶことができたなら、おそらく要点を見逃しているでしょう。


同感です。私は現在、Lispへの2番目の進出、学校を卒業して5年です。あなたがまだ環境に優しいときは、Lispの1つの用語では十分な効果が得られない可能性があります。メタプログラミングにのみ焦点を当てていることを覚えており、メタプログラミングと柔軟性についてはまだ理解していませんでした。
アーロン

4

LISP / Schemeを学習しても、アプリケーションスペースが増えることはありませんが、関数型プログラミング、そのルール、および例外について理解を深めるのに役立ちます。

6つの入れ子の純粋な関数の美しさの違いと、副作用のある6つの入れ子の関数の悪夢を学ぶだけでも、時間をかける価値はあります。


4

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ユーザーグループの数です。


4

「Lispは、ついにそれを手に入れたときに得られる深い啓発の経験について学ぶ価値があります。その経験は、実際にLisp自体を頻繁に使用したことがなくても、残りの日のためのより優れたプログラマーになります。」

--Eric S. Raymond、「ハッカーになる方法」

http://www.paulgraham.com/avg.html


3

Lispは商用環境では決して使用できない言語の1つであることに同意します。しかし、理解できなくても、それを学ぶことで間違いなくプログラミング全体に対する理解が深まります。たとえば、私は大学でPrologを学びましたが、その後は使用しませんでしたが、多くのプログラミングコンセプトについて理解を深め、使用する言語について(時には)理解を深めました。

しかし、あなたがそれを学ぶつもりなら... ぜひともOn Lispを読んでください


小さな注記:LispはLispの適切な紹介ではありません。最初に何か他のものを読んでください。Practical Common Lispをお勧めします。
ルイス・オリヴェイラ

3

Lispを学ぶことは、Javascriptをまったく別の見方に置くでしょう!Lispは本当に再帰と全体の「ファーストクラスのオブジェクトとしての関数」パラダイムの両方を把握することを強制します。SchemeとJavascriptに関するCrockfordsの優れた記事を参照してください。Javascriptはおそらく今日の最も重要な言語であるため、Javascriptを理解することは非常に役立ちます。


1
最も重要な言語は?私はそうではないと思います。
TraumaPony 2008年

7
まあ、それはウェブブラウザを持っているほとんどすべてのデバイスで利用できます(おそらくいくつかは持っていません)ので、エンドユーザーアプリケーションを実行するための言語が行く限り、それはおそらく地球上のあらゆるプログラミング言語の浸透率が最も高いです。明らかに、あなたは何が重要かについて全く異なる意見を持つことができます。がんの治療に使用されますか?おそらく違います。しかし、好むと好まざるとにかかわらず、これは(Web)アプリケーション開発の要石の1つになるでしょう。
Erlend Halvorsen、

1
私も同じように行きました!私はすでにJavaScriptの機能とプロトタイピング機能を使用していましたが、Lispを学んだ後、Javascriptは私にとって新しい言語でした。
Luka Ramishvili


3

さて、私は奇妙かもしれませんが、私はポール・グラハムのエッセイがあまり好きではありません。CommonLispをまだ理解していないのであれば、Lispについての本は非常にラフな本です。代わりに、SiebelのPractical Common Lispに行くと思います。「キラーアプリ」については、Common LispがITAのようなニッチショップでその場所を見つけているようです。そのため、CLの代名詞となるアプリはありませんが、RailsがRuby向けであるように、業界でそれを使用する場所があります。少し掘る。


2

複雑な構文?lispのすばらしいところは、途方もなく単純な構文を持っていることです。これは単なるリストであり、リストの各要素は別のリストまたは基本データ型のいずれかです。

関数を別のデータ型として考え、使用するためのコーディング能力を強化するため、学ぶ価値があります。これにより、命令型またはオブジェクト指向の言語でコーディングする方法が改善されます。これにより、コードの構造をより柔軟に管理できるようになります。



2

キラーアプリ?Franz Inc.に成功事例の長いリストがありますが、このリストにはAllegroCLのユーザーのみが含まれています...おそらく他にもあります。私はクラッシュ・バンディクーのゲームの大ファンだったので私のお気に入りはいたずらな犬の話です。

Common Lispの学習には、Practical Common Lispをお勧めします。それは少なくとも私にとって私が見た他の本よりも簡単にした実践的なアプローチを持っています。


2

今日Clojureを使用して、Java VMの上にテストとスクリプトを書くことができます。JVMに実装されているLisp言語は他にもありますが、ClojureはJavaとの統合に最適です。

Java言語自体がJavaコードのテスト(「従来の商用プログラミング」を含む)の記述を妨げる場合があります。(私はJavaの告発として、他の言語が同じ問題に苦しんでいるという意味ではありませんが、それは事実です。このトピックはJavaではないので、詳しく説明しません。誰かがそれについて話し合いたいと思っています。)Clojureはそれらの障害の多くを排除します。


2

Lispは、従来のプログラミングを使用するあらゆる場所で使用できます。それはそれほど違わない、それはちょうどより強力です。Webアプリを作成していますか?あなたはLispでそれを行うことができ、デスクトップアプリケーションを書きますか?Lispでそれを行うことができます。Lisp、Python、またはその他の一般的なプログラミングで行うことができます(1つのタスクのみに適した言語がいくつかあります)。

最大の障害は、おそらく上司、同僚、または顧客の受け入れです。それはあなたが彼らと協力しなければならないものです。JVMからライブラリまで、Javaインフラストラクチャの現在のインストールベースを活用できるClojureのような実用的なソリューションを選択すると、役立つ場合があります。また、Javaプログラムがある場合は、プラグインアーキテクチャを実行して、そのためのClojureプラグインを作成し、最終的にClojureでコードの半分を作成することができます。


1

理由ではありませんが、(些細な)AutoCADはLISPおよびDCLランタイムをサポートしています。VBAまたはそのC ++または.NET SDKを使用したくない場合、またはDIESEL式がそれをカットしない場合、これは複雑なマクロ(ActiveXオートメーションを含む)を記述する便利な方法です。

AutoCADの関数の多くは、実際にはLISPルーチンです。


1

これは私がしばらく考えてきたトピックですが、いつもの時間が主な問題なので、私は本当に決心していません...;)

そして、私はこれらのリンクがこの投稿でもっと見つけられないので、私は公共の利益のためにそれらを追加します:

成功と失敗のストーリー: JPLでのLisping

本当に印象的なサクセスストーリー: Orbitz社で使用されているLisp

Javaの代わりにLispを使用するかどうかの比較と分析: Javaの代替としてのLisp




0

キラーアプリ?ITA Softwareのフライト検索エンジンはその1つです。

「なぜ」については、それはおそらくあなたをより良い開発者にするでしょう、そしてあなたをより悪い開発者にすることは極端ではありません。ただし、他の言語よりもLisp方言を好む場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.