常にClojureを支持して行われる議論はそれです。
構文はより単純で、複雑なルールなしでコードを表現する方法は1つだけです。
ただし、Scalaには、Clojureと比較して、さまざまなタイプの構文と構成の負荷があります。
しかし、Clojureを学ぼうとしている間の過去1週間から、組み込みマクロのリストが無限であることに気づきました。同じ括弧構文でそれらを書いたとしても、それぞれがどのように機能するかを学ぶ必要があります。
では、どのような意味でClojureの構文はより単純なのでしょうか。 LISPerにとってはそうかもしれませんが、異なる背景を持つ人々にとっては、Scalaで異なる構成を学習している方が簡単に思えます。
中立的な観点から、どの構文がよりシンプルで読みやすいですか?
中立的な観点から、どの構文がよりシンプルで読みやすいですか?
これらは2つのvery異なる質問です。
Simplerは、「より少ないパーツで構成される」ことを意味します。 Clojureの構文には、Scalaの構文よりも客観的に単純な規則があります。
読みやすさただし、主観的です。それは主に親しみやすさに帰着します。たとえば、ECMAScript、C#、Java、D、Go、C++、およびCはほとんど理解できないと思いますが、そのような構文を読むことに慣れている人にとっては、かなり読みやすいです。質問のこの部分は、客観的に、または「中立的な観点から」答えることはできません。
私がScalaで作業するときは、多くの場合、(特にfor
内包表記を使用して)開発のフェーズがあり、すべてのタイプを正しく機能させる必要があります。これは、大きなプロジェクトには大きなプラスですが、小さなもの。タイプを忘れて、PerlやAwkで漠然と覚えている方法でClojureの「仕事を終わらせる」ことに集中できると思っていましたが、今のところ、その方法はうまくいきませんでした。私の経験では、コード/コンパイルフェーズで「型を機能させる」のではなく、コードを実行しようとすると例外が発生します。これは単純化ではありません。問題は解消されていません。問題は開発サイクルのより危険で高価な部分に移されています。
そこにはisがあり、LISPっぽい構文を単純化しています。 Emacsの大きな強みの1つは、任意のバッファーでいつでもコードブロックの閉じかっこで特別なキーシーケンスを押すことにより、任意のLISPコードを実行できることです。 LISP構文の単純な括弧で区切られた性質により、他のほとんどの言語では扱いにくい(中かっこを導入する必要がある)方法でこれがエレガントになります。また、(function arg, arg...)
と(operator arg, arg...)
の規則性により、関数と演算子を一流の市民として考えること、および匿名関数について考えることが非常に自然になります。つまり、Scalaしないでください。
Scalaでの私の限られた経験により、構文がより単純で読みやすいとは言えません。確かに、Clojureにはマクロを使用した非洗練された構文がありますが、私の認識では、これらのマクロは、それ以外の場合は非常に機能的な構文で命令型思考の小さな窓を開くだけです。言語で関数構文または命令構文を優先することで、物事を簡素化できます。これについては、Clojure、Java、およびHaskellに指摘する必要があります。
Scalaに対する私の懸念は、C++またはPerlに対する懸念と同じです(程度は低いですが)。言語の構文は、いくつかの異なる思考スタイル(HaskellおよびJava)に対応しています。これは書くことを楽しくしますが、読みやすさのために問題があるかもしれません。私がそれを書いているときでも、Clojureはドメイン固有言語をサポートしていることを覚えています。
あなたの質問は非常に興味深いものです。結局のところ、比較は複雑なものです。しかし、私の現在の知識に基づいて、Clojureの構文はScalaよりも単純ですが、1桁も単純ではないことに同意する必要があります。
同じ括弧構文で書いても
そして、それは基本的にあなたの質問への答えです。
それぞれの仕組みを学ぶ必要があります。
Common Lisps loop
のようなそれほどささやかな構文でDSLを導入することは可能ですが、通常のマクロを使用します(リーダーマクロはこれには触れません)。これらは主に評価を制御するために使用され、引き続き通常のマクロを使用しますs式の構文。 1つの重要な機能は、同じ古いsexprリーダーを使用して、より複雑なloop
のようなマクロを読み取ることができることです。
さまざまなマクロとそれらが取る入力の形式について学習する必要があるのは事実ですが、Common LISPのcond
は、Clojureのcond
よりもネストされているため、ネストの1つの層が削減されます。これはマクロだけでなく、通常の関数にも当てはまります。特定の構造の引用符付きリストを引数として取る通常の関数を想像してください。関数がコードを変換する場合でも、何らかのリスト、plist、ツリー、またはまったく異なるものを期待する場合でも、予想される入力構造に準拠する必要があります。
新しい機能に遭遇したときはいつでも、学ぶ必要があるいくつかのAPIがあります。これは、厳密にfunction(arg1, arg2, …, argN)
構文のみを許可した言語にも当てはまります。予想される引数、副作用、および特定の関数の出力について理解する必要があります。
Scaleなどの言語と比較してLISP構文の方が簡単なのは、すべてがrepresentedとほぼ同じであること、およびコード自体がこれらの表現とデータ構造を使用していることですホモニコ性みんなが話している)。この構文の複雑さの違いは、LISPまたはClojureパーサーを作成してからScalaパーサーを作成しようとした場合に明らかになります。はるかに複雑な文法、より複雑なルールに対処する必要があります。優先順位、空白、あいまいさ、より多くの例外などについて。