2011-01-13 15 views
13

新しい言語を学びたいと思っています。私はLispで始めることを考えました。私はLispを学ぶかどうか知りたいのですが、私はClojureも(最小の労力で)知っていますか?LispとClojureの構文に大きな違いがありますか?ClojureとLispの構文に大きな違いがありますか

答えて

10

構文の違いはほとんどありません(主にLispファミリの言語はほぼで、構文はです)が、他の部分には確かに違いがあります。 Clojureは、Common Lispのような "古典的な" Lispには存在しない高いスケーラビリティ(アクター、リファレンスなど)に特に適した最新のプログラミング機能を多数備えています。

ClojureはLispの活発でよくサポートされている方言です。あなたがLispを学びたいなら、Clojureで本当に間違って行くことはできません。

詳細は、Which Lisp should I learn?の回答を参照してください。

+5

これは間違っています。 Lispには多くの構文があります。トン。例として、DEFCLASS、DEFSTRUCT、LOOPなどの構文をCLで確認してください。下はs式の構文です - これも簡単なことではありません。 –

+4

明瞭にするための小さな点、ライナー。彼は "Lisp家族"と言った。あなたが使用したすべての例はCommon Lispであり、あなたが与えた唯一の有効な例はLOOPであり、リスト以外の構文(キーワード)を混在させる唯一のものだと主張したいと思います。たとえそうであっても、すべての例をSchemeと対比してください。ほとんどすべてがDEFINEであり、あなたが言及した構造は存在しません。 – Shaun

+0

@Shaun:Schemeには統語的なキーワードとマクロが組み込まれています。スキームレポートを参照してください。それは、LET、LAMBDA、IF、...で始まります.Lisp構文であるs式を混同しないでください。 Lisp構文はs式の上にあります。 Lispは一般に、関数呼び出しのための単純な形式を持っています。しかし、すべてのLispにはある種の特殊な構文形式とある種のマクロがあります。言語に既に存在するすべてのマクロは、SYNTAXを実装します。構文は言語の構造です。ユーザ定義のマクロは、すべてのLispでユーザが拡張可能な構文を持つ方法です。 '構文なし'のアイデアは、たびたび繰り返される神話です。反対の場合は真です。 –

2

「Lisp」自体が単一の特定の言語よりも多くの言語(Clojureを含む)であるため、LispはあなたがCommon Lispを意味すると思います。 Clojureがより現代的なLispであることを意図した構文上の変更があります。例えば、Common Lispの一部ではない{} sのマップ、{}のマップを作成することができます。もちろん、Javaの相互運用性は必然的にClojureの重要な部分になります。

+5

[]と{}は、CLのユーザー拡張用に予約されています。ベクトルは#(...)と書かれています。そのレベルの文字構文は、ライブラリによって提供することができます。実際にはそうです。構文がユーザー拡張可能で、[]と{}の使用がライブラリで使用できるので、CLはより現代的なLispでしょうか? –

+0

Common Lispは、通常Just Lispと呼ばれます。同様に、Lispは通常Common Lispを意味します。 Lispファミリは、通常、lisp、またはlispと呼ばれます。 – Marko

3

私はそれはあなたが原則LISPのを学ぶ場合にもClojureのとその逆の原則を知っていると言うことは公正だと思います。彼らはすべて同じ考え方に根ざしており、次のようなものを強調しています。

  • コードはデータです。マクロはコードを操作する単なる通常の関数です。

  • データとコードを表すのにS-expressionsを使用する。

  • 基本的な構造としてのリスト/シーケンスの概念。

  • ファーストクラスの機能を備えた機能プログラミング。

それとは別に、構文の違いがたくさん、ライブラリ、ランタイム環境などが私の見解の違いは、おそらくC#対C++とほぼ同じであるがあります - あなたは1つのウェルを知っていれば、その後、コアは概念はよく知られていますが、依然として根本的な違いがたくさんあります。

はあなたの最初のLispを勉強しながら、あなたは何を学ぶのこのlist of ways that Clojure is different from other Lisps

+0

関数とマクロに「少しの」違いがあります。関数はファーストクラスです。マクロはありません。 – boucekv

6

90%があなたの次に持ち越されます参照してください。

1

Clojureの利用ラムダパラメータ(引数値)のようなベクターができますが、マクロdefunのとCommon Lispでは、このようになりますとラムダを書くことができます。 Clojureは、通常の関数呼び出しのように見える昏睡状態と名前を使用してJavaオブジェクトメソッドとフィールドにアクセスします。

(.toString 10) - メソッド10をtoStringメソッドに呼び出しますが、totoStringは関数ではありません。 .toStringの値をチェックしようとすると、.toStringがシンボルとして定義されていないという例外がスローされます。

また、昏睡の代わりに疑似クォーテーション(主にマクロで)で、Clojureはtyldaを使用します。

関連する問題