0

免責事項: 私は clojure を学んでいます。

これは私が実行しようとしている簡単な例です:

(ns ClojureTest.core)

(let [input (read-line)]
  ;if user input = "x"
  (if (= "x" input)
    ;stop accepting input
    (println "Exit")
    ;else output the input and continue accepting input
    (
      (println input)
      (recur)
    )
  )
)

私は構文に慣れていないので、これは理にかなっていると思います。

Exception in thread "main" java.lang.UnsupportedOperationException: Can only recur from tail position, compiling:(ClojureTest/core.clj:8:7)

これを修正するにはどうすればよいですか?

副次的な質問:

  1. Eclipseで「実行」をクリックすると(Javaの場合と同様)、コンソールが開くだけでなく、この「REPL」ウィンドウも表示されます。なぜそれが必要で、何をするのですか?
  2. 「実行」をクリックすると、アプリの起動に数秒かかります。速くする方法はありますか?
  3. コードを編集してアプリを再起動する必要がある場合、「選択したものを起動できません。最近の起動はありません」というメッセージが表示されます。それは何ですか? また、コードを再起動できないのはなぜですか? しばらく待てば再起動できます。
4

1 に答える 1

3

この特定のケースではdo、の「else」句にa がありませんif

(do
  (println input)
  (recur))

がなければ、doが得られます。これは、呼び出す関数であり、引数式で((println input) (recur))あるという戻り値を持つ関数呼び出しのように見えます。したがって、末尾の位置ではありません。(println input)(recur)

(明らか(println input)に戻りnil、それを関数として呼び出そうとすると がスローされますNullPointerExceptionが、これはここでは関係ありません。これは実行時エラーになりますが、recurテール位置ではない問題はコンパイル時に検出できます。)

于 2013-09-15T11:12:31.033 に答える