私は最近Clojureを見ていて、偶然 Stackoverflowに関するこの投稿 を偶然見つけました。これは、いくつかのプロジェクトがベストプラクティスに従っていて、全体的に優れたClojureコードであることを示しています。基本的なチュートリアルを読んだ後、言語を理解するために、「実際の」プロジェクトをいくつか見てみました。
ClojureScript および Compojure (前述の「良い」プロジェクトの2つ)を見た後、Clojureは冗談のように感じます。 RubyまたはPython、Clojureがあまりにも多くの括弧と記号があると、どこからでも読みやすくなります。
RubyとPythonは美しく、読みやすく、エレガントです。言語をまったく知らない人でも読みやすいと思います。しかし、 Clojureは私には不透明であり、コードを理解できるようにするためには、言語の実装に関する細部をすべて知っている必要があるように感じます。
だから、私を啓発してください!
あなたが与えた背景について、私が言い換えれば:
...最良の答えは、Emerick、Carper、Grandの本 Clojure Programming を読むことだと思います。この本には、Python、Ruby、およびJavaとの明示的なコード比較が多数あり、これらの言語のプログラマーを対象としたテキストの説明があります。個人的には、Pythonで適切なサイズのプロジェクトを構築し、LISPの経験をいくつか積んだ後、Clojureに来ました。この本を読んだことで、Clojureをサイドプロジェクトだけでなくプロの目的にも使用するようになりました。
2つの質問に直接対処するには:
追加の提案:LISPの優雅さと力は、部分的には最小限で一貫性のある構文にあります。優れたエディタを使用すると、そのことを理解するのがはるかに簡単になります。 clojure-modeとParEditを備えたEmacs。それに慣れるにつれて、構文は消え、セマンティクス、意図、および簡潔な抽象化を「見る」ことができます。次に、ClojureScriptまたはCompojureのソースを読むことから始めないでください。これらは一度に多すぎるためです。 4clojure.orgの問題をいくつか試して、そこで解決策を上位のコーダーと比較してください。他に4〜6個のソリューションがある場合、必ず誰かが真に慣用的で簡潔なFPスタイルのソリューションを作成しているので、不格好で冗長で不必要に複雑な命令型ソリューションと比較できます。
LISP方言には、単純な構文のために独特のニッチがあります。この単純な構文により、マクロを使用したメタプログラミングが非常に簡単になります。これにより、問題のドメインを言語に合わせるためにモデル化する代わりに、問題のドメインに合うように言語をモデル化できます。頭に浮かぶととてもクールです。他の言語では非常に難しい多くのことを簡単に行うことができます。
欠点は、すべてのLISPプログラムは基本的に独自の言語を定義しているため、何が起こっているのかを理解するために、物事をしっかりと把握する必要があるということです。
今、あなたの質問に答えるために...
Clojureは、JVM/CLRで実行される最新のLISP方言です。これにより、既存のインフラストラクチャでLISPの機能を簡単に活用できます。
マクロを使用してLISPを問題ドメインに構築する方法を理解して、その使用法を理解することが不可欠です。 LISPランタイムを実装して初めて、これを本当に理解しました。コア言語機能の多くはLISP自体に簡単に実装できることがわかりました。これを取得するには、適切なサイズのプロジェクトが必要です。
その利点はさておき、プログラミングするのは楽しいですが、個人的には日常の問題を解決するケースはあまりありません。それは心の拡大を学ぶのにとても良いツールであり、LISPを適切に学んだ後、他の言語のメタプログラミング機能を利用することははるかに自然になりました。
単純な構文により、コンピューターは簡単に解釈できます(このような簡単で強力なマクロを使用できます)が、人間が複雑な式をすばやく解析することは非常に困難です。
Clojureの強みは何度も強調されており、確かに非常に強力な言語になっているので、ここでは繰り返しません。
私はいつの時代もLISPが大好きで、Clojureを発見したときは本当に興奮していました(おそらく、ついに学外でLISPを使用する可能性があります!)。しかし、不安を感じ始めたので、嫌いなものを正確に特定することはできませんが、忍び寄ってきました。まず第一に、Common LISPでのコーディングは簡単で楽しいものでしたが、Clojureの学習曲線は急勾配です。クリスプはそれに対してある美しさと優雅さを持っていました。 Clojureから同じ感覚が得られるかどうかはわかりません。経験を重ねるうちにその気持ちが消えてしまうのではないかと思っています。
私の神秘的なわずかな反発について、別の推測があります。それはその大きな柔軟性かもしれないと思います。たとえば、半分のベクトルと半分のマップである構造を持つことができ、コードのいくつかの文字でそれらをパラメーターとして受け入れ、それらを分解して正しく処理できます。はい、定型文はすべて削除されますが、どういうわけか正しくありません。かっこ、コロン、ブレイケットなどすべてのルールが機能していることをよく知らないようです。
私にとっては、言語のすべての利点(主に、JVMでの実行と同時実行の簡素化、さらにJavaより明確で設計の欠陥が少ない)よりも簡潔である)が大好きですが、何かが改善されたかもしれないかどうかに関して陪審はまだ出ていません。