2016-08-20 7 views
-1

コードにClojureの'(1+2)のようなものが含まれていると、java.lang.RuntimeExceptionが表示され、「Unmatched delimiter:」というエラーメッセージが表示されます。ClojureはJVMによって制限されているので、このコードは評価できませんか?

しかし、私が今までのEmacs Lispのか、ラケット、'(1+2)のように使ってきた他のLisp方言でだけ特殊な形式の引用で、リスト中の何を評価すべきではないので、どのこのようなはずです行為、リストを返します。 。

私は、JVMの制限のためにこれらのコードが他の方言でどのように動作するように動作できないのだろうかと思います。それともClojureのバグですか?あるいは、Clojureの引用と他のLispの方言の定義が異なるかもしれませんか?

+0

実際のエラーは 'NumberFormatExceptionです。無効な番号です:1 + 2 clojure.lang.LispReader.readNumber(LispReader.java:330)'。これは、clojureが数値を読み取ろうとしている(そして失敗している)ためです。 Unmatched delimiterエラーは、残りの式を読み取ろうとした結果、後になります。 – dsm

+0

この動作をJVMにどのように結び付けるかはわかりません。 –

答えて

1

これらは、トークナイザが異なる言語で設定される方法のアーティファクトです。 Clojureでは、トークンが数字で始まる場合、次のリーダマクロ文字(括弧を含む)、空白またはファイルの終わり(空白にカンマが含まれています)まで使用されます。整数、浮動小数点および有理数を含む。したがって、'(1+2)を読者に供給すると、1+2を1つのトークンとして消費し、整数、浮動小数点または有理数のパターンと一致しません。その後、リーダーは回復を試み、状態をリセットします。この状態では、)は匹敵しません。

代わりに'(1 + 2)を入力してください(+の周りに気を付けてください)。

+0

答えをありがとう。だから、Clojureは、各要素を解析し、それらをシンボルとして扱うのではなく、リストが引用されていても、まずそれらをいくつかのJavaオブジェクト(整数、文字列など)に変換しようとしますか? – Eleven

+0

*各*言語プロセッサは、まずその入力を解析する必要があります。最初に式を解析せずに引用リストを持っているとClojureや他のLispがどのように理解すると思いますか? 2つ目のことは、**評価されていない**は**解析されていない**を意味するものではありません。 Lispの単語評価は正確な意味を持っています - それは頭の位置に関数、マクロ、または特別な形式を呼びます。これは確かに '' quote'によって阻止されます - Clojureでは、Lispのように。 ClojureはLispであり、例えばelispよりもSchemeに非常に近い。あなたは間違った場所の違いを探しています。 –

+0

私は思っています*と言っているのとほぼ同義でしょう:クロージャーでは、引用された書式の中のものは*読み*ですが、評価されていません---読者は '1 + 2'で何をすべきか分からない - - 有効な記号ではありません(記号は数字で始めることはできません)、キーワード、数字など –

関連する問題