私は次のような関数を持っています、
(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に出力されません。