Clojureの構文はScalaの構文よりも本当に単純ですか?[閉まっている]


8

常にClojureを支持して行われる議論はそれです。

構文はより単純で、複雑なルールなしでコードを表現する方法は1つだけです。

ただし、Scalaには、Clojureと比較して、さまざまなタイプの構文と構成体がロードされています。

しかし、Clojureを学ぼうとしている過去1週間から、組み込みマクロのリストが無限であることに気づきました。同じ括弧構文でそれらを書いたとしても、それぞれがどのように機能するかを学ぶ必要があります。

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

中立的な観点から、どの構文がよりシンプルで読みやすいですか?


6
Scala標準を見ると、その文法は7ページの長さです。Scalaが好きなだけ、lispよりも単純な構文はありません。
Daniel Gratzer 2013

回答:


18

中立的な観点から、どの構文がよりシンプルで読みやすいですか?

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

シンプルとは、「少ないパーツで構成される」という意味です。Clojureの構文はルールが少なく、Scalaの構文よりも客観的に単純です。

ただし、読みやすさは主観的です。それは主に親しみやすさに帰着します。たとえば、ECMAScript、C#、Java、D、Go、C ++、Cはほとんど理解できないものですが、そのような構文を読むことに慣れている人にとっては、かなり読みやすいです。質問のこの部分は、客観的に、または「中立的な観点から」答えることはできません。


5
+1:「しかし、読みやすさは主観的です。主に親しみやすさに帰着します。」:正しい。最近、SchemeとCommon Lispを使用していて(どちらにも精通していません)、構文が読みにくいと考えられている理由がわかりません。
ジョルジオ

構文のルールは少なくなりますが、学習曲線は同じままですが、さまざまなマクロを学習する必要があるため、さまざまな構文を学習する必要があります。それらがシンボルの同じセットで書かれていても。
Amogh Talpallikar 2013

はい、しかし問題は構文論であり、意味論ではありませんでした。それがあなたが知りたいことなら、あなたはあなたの質問を明確にするべきです。
イェルクWミッターク

1
+1:これはOPの質問に対する良い答えです。ただし、興味深いことに、読みやすさは完全に主観的であるという考えは一般的な神話です。2つの異なる言語の同様の経験を考えると、少なくとも統計的には、一方の言語が他方の言語よりもかなり読みやすいかもしれないことを示唆するのは論理的です。(たとえば、たとえよく知っていても読めない難解な言語を考えてください。)残念ながら、私はこの問題に関する研究を知りません。
クラミ

1
@Kramii:私はC ++で長年の経験とCommon Lispで数か月の経験があり、CLはC ++よりはるかに読みやすいと思います。これは、Common LispがC ++よりも客観的にはるかに読みやすいこと、または私の推論方法がCLの動作に近いことを示しています。それとも、まったく何も証明されないだけかもしれません。
ジョルジオ

4

私がScalaで作業するとき、開発のフェーズ(特にfor理解力)がよくあります。そこでは、すべてのタイプを正しく機能させる必要があります。これは、大きなプロジェクトでは大きなプラスですが、小さなプロジェクトでは明確なネガティブです。型を忘れて、PerlやAwkで漠然と覚えている方法でClojureの「仕事を終わらせる」ことに集中できると思っていましたが、これまでのところ、その方法はうまくいきませんでした。私の経験では、コード/コンパイルフェーズで「型を機能させる」のではなく、コードを実行しようとすると例外が発生します。これは単純化ではありません。問題は解消されていません。問題は開発サイクルのより危険で高価な部分に移されています。

そこの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桁も単純ではないことに同意する必要があります。


3

同じ括弧構文で書いても

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

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

loop通常のマクロを使用してCommon Lispのようなそれほどリッシーではない構文でDSLを導入することは可能ですが(リーダーマクロは省略します)、それらは主に評価を制御するために使用され、通常のs式構文を使用します。重要な機能の1つはloop、同じ古いsexprリーダーを使用して、より複雑なマクロを読み取ることができることです。

さまざまなマクロとそれらが取る入力の形式について学習する必要があるのは事実ですが、condClojureのネストがcond1層減少しているCommon Lisp は、ネストの1つの層を減らしています。これは、マクロだけでなく、通常の関数。特定の構造の引用符で囲まれたリストを引数として取る通常の関数を想像してください。関数がコードを変換する場合でも、何らかのリスト、plist、ツリー、またはまったく異なるものを期待する場合でも、予想される入力構造に準拠する必要があります。

新しい機能に遭遇したときはいつでも、学ぶ必要があるいくつかのAPIがあります。これは、厳密にfunction(arg1, arg2, …, argN)構文のみを許可する言語にも当てはまります。予想される引数が何であるか、どのような副作用が発生するか、特定の関数の出力が何であるかを学習する必要があります。

Lispはスケールのような言語に比べ構文について簡単だ何、そのすべてがされている表現多かれ少なかれ同じ、また、コード自体は、これらの表現とデータ構造を使用していること(つまりは次のようになりhomoiconicityの誰もが話しています)。この構文の複雑さの違いは、LispまたはClojureパーサーを作成してからScalaパーサーを作成しようとすると、かなり明らかになります。はるかに複雑な文法、つまり優先順位、空白、あいまいさ、より多くの例外などに関するより複雑なルールに対処する必要があります。


3

ウィキペディアの定義から:

コンピュータサイエンスでは、プログラミング言語の構文は、その言語で正しく構造化されたプログラムと見なされる記号の組み合わせを定義する一連のルールです

clojureはlispなので、s-式+ リーダーマクロのリストがあり、それだけです。

Scalaには、クラス、ケースクラス、_を含む暗黙のラムダ、暗黙のキーワード、特性、一般的な注釈、分散注釈などがあります。

機能はマクロまたは特殊なフォームとして実装できるため、Clojureの構文は単純です。これはscalaでは不可能です。彼では、いくつかの機能をサポートするために構文を追加する必要があります。


-1

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

エコシステムや基本的なライブラリの複雑さについての議論は、まったく別の議論です。

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