1

私は次のような関数を持っています、

(defn app [server]
  (println "before while...."))
  (while test
    while-body)
  (println "...after while."))

ただし、fn を呼び出すと、REPL で "before while" が表示され、while がテストに失敗すると "nil" が表示されます。

次のようにreplでテストfooを書くと

(defn foo [] 
  (println "testing before")
  (loop [i 100]
    (when (> i 10)
      (prn i)
      (recur (- i 2))))
  (println "after..."))

期待どおりに動作します。

役立つ場合は、実際のコードをhttps://www.refheap.com/paste/12147に貼り付けました。

ここでの動作の違いは何を説明していますか?

編集

これを試したことがないことをお詫びしますが、これは REPL で機能します。

(defn bar []
  (let [i (atom 100)]
    (println "before...")
    (while (> @i 10)
      (swap! i dec))
    (println "after...")))

それで、何か他のことが起こっています。

編集#2

repl でさらにテストします。while ループをコメント アウトすると、前後の println が出力されます。以前、「nil」について誤解していました。これは、while が呼び出された後に呼び出された別の関数の戻り値です。そのため、while ループと関係があるようです。

whileをこれに変えたら気づいた

(loop []
  (if test
    (do things and recur...)
    (println "test failed")))

「テストに失敗しました」はreplに出力されません。

4

3 に答える 3

1

問題は私が思っていたものではありませんでした。選択呼び出し(whileループで呼び出される)をブロックしていたため、シャットダウン関数で問題が発生し、whileループが終了しました。選択にタイムアウトを追加すると修正されます。

于 2013-03-06T18:35:55.840 に答える
1

最初の println の最後に余分な ) があります。

(defn app [server]
  (println "before while....")
  (while test
    while-body)
  (println "...after while."))

しかし、これは明らかにあなたが実行していないサンプル コードであるため、問題はあなた実行したコードにあると思います。これで問題が解決しない場合は、そのコードをそのままコピーして貼り付けてください。

于 2013-03-06T07:59:40.437 に答える
0

Clojure の関数定義では、最後に評価されるのは何が返されるかであり、(println ...) は nil を返します。

于 2013-03-06T06:12:44.017 に答える