18

まるで、すべてがclojureの括弧で囲まれている必要があるようです。単純なHelloWorldでも!

(println "Hello world!")

その構文決定の利点は何ですか?

4

3 に答える 3

25

基本的な理由は、Clojureが同像性言語として設計されたためです。つまり、コードは言語のコアデータ構造で表現されます。すべてのLispはこのプロパティを共有していますが、他の言語はほとんど共有していません。その結果、Lispsの言語設計全体がこの決定の影響を強く受けます。

Lispの設計の早い段階で、リストが次の形式の関数呼び出しに使用されるという選択が行われました。

(function arg1 arg2 arg3) => some result

これには多くの利点があります。

  • 関数呼び出しは、「フォーム」と呼ばれる単一のデータオブジェクトとして表されます(この場合、フォームはリストですが、ベクトル、ハッシュマップ、リテラル値などの場合もあります)。実行前に、必要に応じて渡したり、変更したり、変換したりできます。
  • 標準のリスト操作を使用して、このような関数呼び出しを簡単に作成できます。(cons function-symbol list-of-args)
  • 構文は非常に簡単に解析できます。2つの括弧の間はすべて自己完結型の式です。これにより、パーサーの作成が簡単になり、ツールの作成にも役立ちます(たとえば、emacsのparen処理コマンドの驚くべき配列を参照してください)。

関数名は括弧の外に置くことができます:

function (arg1 arg2 arg3) => some result

しかし、これには多くの欠点があります。

  • 関数呼び出しを単一の形式で表現することはできなくなりました。関数名と引数リストの2つの別々のデータオブジェクトを渡す必要があります。
  • 構文がより複雑になります。これを関数呼び出しとして認識するために、追加の構文規則が必要になります(たとえば、引数間の「、」などの追加の区切り文字)
  • コード生成を行うのは難しいでしょう。Lispは最初から効果的なコード生成を可能にするように設計されていましたが、C ++ソースコードを生成しようとしたことがあれば、そのように設計されていない言語でどれほど難しいかがわかるでしょう。
  • 実際には、全体的な括弧の数が減ることはありません。実際、非常に簡潔な言語であるため、Clojureは通常、Java / C#の同等のコードよりも括弧が少なくなります。
于 2012-07-09T10:42:45.367 に答える
11

Clojureはどうですか

(println "Hello world!")

とは異なる

println("Hello world!")

他の言語の?異なる位置でのみ同じ数の括弧。

親は関数呼び出しを(リストとして)区切ります。Cのような言語では、parensはパラメータのみを囲み、LISPのような言語では、関数名が含まれます。

于 2012-07-09T08:49:57.620 に答える
8

Lispベースの言語は、コードとデータの両方の基礎としてS式(括弧で囲まれたコード)を使用します。これは、Lispに独自の強力なマクロシステムを提供するため、非常に強力です。homoiconcityも参照してください。

于 2012-07-09T08:52:13.917 に答える