1

Lisp は学術界で非常に早い段階で一連の興味深い言語機能を開発しましたが、それらのほとんどは本番環境で普及することはありませんでした。

JavaScript などの一部の言語は、ガベージ コレクションやレキシカル クロージャーなどの基本的な機能を採用しましたが、強力なマクロ、データとしてのコード、カスタム制御構造など、大規模なプログラムの作成方法を実際に変更する可能性のあるすべてのものは、他の関数型言語内に広まっているようですが、重要なプロジェクトに使用するのに実用的な言語はありません。

関数型プログラミング コミュニティは、参照透過性、一般化されたケース式 (つまり、パターン マッチング、C/C# スイッチのように不自由ではない)、カリー化された関数など、(関数型プログラミング自体とは別に) 他にも多くの興味深いアイデアを思いつきました。通常のプログラミングでは明らかに有用であり、既存のプログラミングの実践と簡単に統合できるように思われますが、何らかの理由で、学問の世界で永遠に立ち往生しているようです.

なぜこれらの機能が採用されるのにこれほど苦労するのでしょうか? 「ファーストクラス関数」を中途半端にコピーするのではなく、Lisp から実際に学ぶ現代的で実用的な言語はありますか?それとも、これを不可能にする固有の競合があるのでしょうか?

4

16 に答える 16

21

「ファーストクラスの関数」を中途半端にコピーする代わりに、実際にLispから学ぶ現代的で実用的な言語はありますか、それともこれを不可能にする固有の矛盾がありますか?

なぜlisp、haskell、ocaml、またはf#がモダンではないのですか?

自分でそれを見て、それらを見て、javaのようなライブラリを使用すると、より堅牢であることに気付く必要があるかもしれません。

関数型言語から他の言語まで、多くの機能が採用されています。しかしその逆-たとえば、(一部の)関数型言語にはオブジェクトがあります。

于 2008-09-16T19:00:49.997 に答える
8

Scalaは、パターンマッチング、ファーストクラス関数などを備えたクールな関数/オブジェクト指向言語です。Javaバイトコードにコンパイルできるという利点があり、Javaコードとうまく相互運用できます。

于 2008-09-16T18:18:50.927 に答える
8

Clojureを試すことをお勧めします。構文的に美しい方言、機能的 (ML の意味で)、高速. 不変性、ソフトウェア トランザクション メモリ、マルチバージョン同時実行制御、REPL、SLIME サポート、無尽蔵の FFI を利用できます。ビジネス プログラマー向けの Lisp (および Haskell) です。本業で毎日楽しく使っています。

于 2008-09-16T22:52:48.740 に答える
8

言語が「人気を博している」ことと、その言語が強力で、よく研究され、よく設計された機能を備えているかどうかとの間には、既知の相関関係はありません。

この件については多くのことが言われています。それはテクノロジーだけでなく、アートの至るところに存在します。アーティスト A はアーティスト B よりも多くのトレーニングを受けており、アーティスト B よりも幅広で深みのある作品を制作していますが、アーティスト B は市場ではるかに成功しています。時代性があるからでしょうか。アーティストBの方がマーケティングが上手いからですか?ほとんどの人がアーティストAを理解するのに時間がかからないからですか?アーティストBはひそかにひどいので、アーティストを判断する専門家を信用すべきではないのでしょうか? おそらく上記のすべてが、ある程度までです。

これは、芸術を学ぶ人々やプログラミング言語を学ぶ人々を夢中にさせます。

于 2008-09-17T01:40:53.453 に答える
7

Common Lisp は、大げさではありませんが、実世界で使用されていると思います。

于 2008-09-16T19:55:41.643 に答える
6

パイソンまたはルビー。これについての Paul Graham の考えを「私は Lisp が好きですが、私の会社は Lisp を使用させてくれません。どうすればよいですか?」という質問を参照してください。

于 2008-09-16T18:34:52.727 に答える
5

Erlang は最近、Twitter で使用されているだけでなく、ejabberd などの XMPP 主導のメッセージングや実装の台頭によって新たな露出を得ています。それは、関数型プログラミングを念頭に置いて設計された言語であることに由来するアイデアの多くを誇示します。最初は電話交換機を実行するために使用され、最初の GSM ネットワークを実行するために Ericson によって考案されました。まだ存在しており、(言語として) 完全に機能しており、多くの運用環境で使用されています。

于 2008-09-16T20:07:42.817 に答える
5

Scala は、重要なアカデミックな機能を採用した言語の絶対王者です。高次の種類、自己型、ポリモーフィック パターン マッチングなど。これらはすべて、基本的な機能として Scala に組み込まれている最先端の (またはそれに近い) 学術研究トピックです。間違いなく、これは言語の単純さを損なっていますが、いくつかの非常に興味深いパターンにつながります。

C# は Scala よりも主流ですが、これらの「ありふれた」関数機能の採用も少なくなっています。LINQ は Wadler の一般化されたリスト内包表記の限定的な実装であり、誰もがラムダについて知っています。しかし、それにもかかわらず、C# は (当然のことながら) 学問の世界から研究機能を採用することに関して少し保守的なままです。

于 2008-09-16T19:59:55.113 に答える
3

ルア。

多くのゲーム (World of Worcraft など) やアプリケーション (Snort、NMAP、Wireshark など) のスクリプト/拡張言語として使用されています。実際、Adobe の開発者によると、Adobe の Lightroom は 40% 以上の Lua を使用しています。

Lua の背後にいる人々は、Scheme と Lisp を Lua に大きな影響を与えたものとして繰り返し挙げており、Lua はかっこなしで Scheme とさえ説明されています。

于 2008-09-16T18:47:21.950 に答える
2

F#をチェックアウトしましたか

于 2008-09-16T18:19:14.777 に答える
2

多くの動的プログラミング言語は、関数型プログラミングのアイデアを実装しています。新しい .Net 言語 (C# および VB) には、ラムダと呼ばれるものがありますが、副作用がないわけではありません。

たとえば、関数型プログラミングとオブジェクト指向プログラミングの概念を組み合わせることは難しくありませんが、常に意味があるとは限りません。オブジェクト指向言語はオブジェクト内に状態をカプセル化する (試みます) のに対し、関数型言語は関数内に状態をカプセル化します。オブジェクトと関数を 1 つの言語で組み合わせると、これらすべてを理解するのが難しくなります。

これらのパラダイムをただ一緒に放り込むだけで組み合わせた言語がたくさんあります (F#)。これは便利ですが、成功する新しいパラダイムを作成できるようになるまで、このような言語で数十年遊ぶ必要があると思います。 oo と関数型プログラミングのアイデアを組み合わせます。

于 2008-09-16T18:23:53.643 に答える
2

C# 3.0 は間違いなくそうです。

C# は現在

  1. ラムダ式
  2. 高階関数
  3. IEnumerable を実装するリストおよびすべての型へのマップ / リデュース + フィルター (折りたたみ?)。
  4. リンク
  5. オブジェクト + コレクションの初期化子。

最後の 2 つのリスト項目は、適切な関数型プログラミングに当てはまらない可能性がありますが、とにかく答えは、C# が Lisp などから多くの有用な概念を実装したことです。

于 2008-09-16T18:27:16.083 に答える
2

前述の内容に加えて、LISP の優れた点の多くは、副作用がないことが保証されていることと、組み込みのデータ構造を使用していることに基づいています。どちらも現実の世界ではめったに保持されません。ML はおそらくより優れた機能ベースです。

于 2008-09-16T20:11:45.693 に答える
2

Lisp は学術界で非常に早い段階で一連の興味深い言語機能を開発しましたが、それらのほとんどは本番環境で普及することはありませんでした。

ソフトウェア開発者を管理するような人々は、さまざまな言語機能を比較する興味深いチャットを行えるような人々ではないからです。2000 年頃、私は LISP を使用して、自社の Web サイトに XML から HTML への変換を実装したいと考えていました (これは、Amazon がバックエンドを LISP に実装した頃です)。たどり着けませんでした。これは、私が働いていた会社がCommon LISP 環境を作成および販売していたことを考えると、少し皮肉なことです。

于 2008-10-19T11:00:18.190 に答える
1

関数型プログラミング機能を実装するもう1つの「実世界」の言語は、Javascriptです。絶対にすべてに価値があるので、高階関数は簡単に実装できます。また、ラムダ関数、クロージャ、カリー化などの関数型プログラミングの他のテナントもあります。

于 2008-10-09T16:38:46.077 に答える
0

参照する機能(「強力な」マクロ、データとしてのコード、カスタム制御構造)は、他の関数型言語内では伝播されていません。Lispが私たちに彼らは悪い考えだと教えた後、彼らは亡くなりました。

最新の関数型言語(OCaml、Haskell、Erlang、Scala、F#、C#3.0、JavaScript)にはこれらの機能がありません。

乾杯、ジョン・ハロップ。

于 2008-10-19T09:58:18.877 に答える