Clojureの構文はScalaのものより本当に単純ですか?

いつもClojureを支持して作られている議論はそれです。

構文はより単純であり、複雑な規則なしでコードを表現する方法は1つしかありません。

しかしScalaはClojureと比較してさまざまなタイプの構文と構成を持っています。

しかし、Clojureを学ぼうとしている間の最後の1週間から、私たちが作り込んだマクロのリストは無限大であることに気づきました。

では、Clojureの構文はどのような意味で単純なのでしょうか。 LISPersの場合はそうかもしれませんが、Scalaでさまざまな構成を学んでいるさまざまなバックグラウンドを持つ人々にとってはより簡単に思えます。

それでは、中立的な観点から、どの構文がより単純で読みやすいのでしょうか。

8
Scala標準を見れば、その文法は7ページです。私がScalaを気に入っている限りでは、lispよりも単純な構文はありません。
追加された 著者 jozefg,

5 答え

それでは、中立的な観点から、どの構文がより単純で読みやすいのでしょうか?

これらは非常に異なる2つの質問です。

Simpler means "composed of fewer parts". Clojure's syntax has fewer rules, ergo it is objectively simpler than Scala's.

Readability, however, is subjective. It mainly comes down to familiarity. For example, I find ECMAScript, C#, Java, D, Go, C++ and C to be nearly incomprehensible, but for someone who is used to reading that kind of syntax, they are fairly readable. This part of the question cannot be answered objectively or "from a neutral point of view".

18
追加された
はい、でも問題は構文ではなく、セマンティクスです。それがあなたが知りたいことであるならば、あなたはあなたの質問を明確にするべきです。
追加された 著者 Lawrence B. Crowell,
+1:これはOPの質問に対する良い答えです。しかし、興味深いことに、読みやすさは完全に主観的であるという考えは一般的な神話です。 2つの異なる言語の同様の経験を考えれば、1つの言語が他の言語よりも少なくとも統計的にはかなり読みやすいかもしれないことを示唆するのは論理的です。 (たとえ、よく知っていても非常に読みにくいという難解な言語を考えてみてください。)残念ながら、この問題に関する研究はわかりません。
追加された 著者 Eric H,
+1:「読みやすさは主観的なものである。主に親しみやすさに由来する」:真実。私は最近SchemeとCommon Lispで遊んでいます(私はどちらの専門家でもありません)、そしてなぜそれらの構文が読みにくいと思われるのかわかりません。慣れるのはとても簡単です。
追加された 著者 Giorgio,
@ Kramii:私はC ++の長年の経験とCommon Lispの数か月の経験があり、CLはC ++よりはるかに読みやすいと思います。これは、Common LispがC ++よりも客観的にはるかに読みやすいこと、または私の推論方法がCLの動作方法に近いことを示しています。それとも、まったく何も証明されていないのかもしれません。
追加された 著者 Giorgio,
構文のルールは少なくなりますが、ここでも習熟曲線は変わりませんが、さまざまなマクロを習得する必要があるため、さまざまな構成要素を習得する必要があります。たとえそれらが記号の集合で書かれたとしても。
追加された 著者 Amogh Talpallikar,
@ Kramii:あなたはBrainFuckのような言語を指していましたか?
追加された 著者 Amogh Talpallikar,

私がScalaで作業するとき、私はすべての型を正しく動作させる必要がある(特に大規模なプロジェクトにとっては大きなプラスですが)私の開発段階(特に for 内包)があることがよくあります。小さいものにはマイナス。私は、型を忘れて、ClojureでPerlやAwkで漠然と覚えているやり方で「仕事を終わらせる」ことに集中することができると思っていましたが、今のところそれはうまくいきませんでした。私の経験では、コード/コンパイル段階で「型を解決する」のではなく、コードを実行しようとすると例外が発生します。これは単純化ではありません。問題は解決したわけではなく、開発サイクルのもっと危険で高価な部分に移っただけです。

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よりも単純であることに同意する必要がありますが、それほど単純ではないかもしれません。

4
追加された

同じ括弧の構文で書いても

そしてそれは基本的にあなたの質問に対する答えです。

それぞれの仕組みを学ぶ必要があります。

一般的なマクロを使ってCommon Lispsの loop のようなそれほどうるさくない構文でDSLを導入することは可能ですが(私はこれから読者マクロを除外します)、それらは主に評価を制御するために使われます。通常のS式構文を使用してください。 1つの重要な特徴は、より複雑な loop マクロでさえ同じ古いsexprリーダーを使って読むことができるということです。

マクロとその入力形式について学ぶ必要があるのは事実ですが、Common Lispの cond では、入れ子になったものとClojureの cond の数を減らしています。入れ子の層、それはマクロだけでなく通常の関数にも当てはまります。引数として特定の構造体の引用符付きリストを取る通常の関数を想像してみてください - 関数がコードを変換するかどうかにかかわらず、期待される入力構造に従う必要があります。

新しい機能に遭遇するたびに、習得しなければならないAPIがいくつかあります。これは function(arg1、arg2、…、argN)構文のみを許可する言語にも当てはまります - あなたはまだ期待される引数が何であるか、どんな副作用が起こるのか、そして何を学ぶ必要があります与えられた関数の出力はです。

Scaleのような言語と比較してLisp構文のほうが簡単なのは、すべてがほぼ同じように表現されていることと、コード自体がこれらの表現とデータ構造を使用していることです同種性誰もが話している)。 LispまたはClojureパーサーを書き、次にScalaパーサーを書き込もうとした場合、構文上の複雑さにおけるこの違いはかなり明白になります。もっと複雑な文法 - 優先順位、空白、あいまいさ、より多くの例外などに関するより複雑な規則に対処する必要があります。

3
追加された
3
追加された

マクロは構文ではありません。

生態系や基本的な図書館の複雑さを主張することは全く別の議論です。

1
追加された