ドキュメントには次のように記載されています。
(do exprs*)
式を順番に評価し、最後の値を返します。式が指定されていない場合は、nil を返します。
ただし、私はこれを行いました:
(defn blah []
(print "how")
(print "now")
(print "brown")
(print "cow")
(+ 1 1))
この結果:
hownowbrowncow2
では、なぜこれが再び必要なのですか?
ドキュメントには次のように記載されています。
(do exprs*)
式を順番に評価し、最後の値を返します。式が指定されていない場合は、nil を返します。
ただし、私はこれを行いました:
(defn blah []
(print "how")
(print "now")
(print "brown")
(print "cow")
(+ 1 1))
この結果:
hownowbrowncow2
では、なぜこれが再び必要なのですか?
一般にdo、おそらく副作用のために、いくつかのフォームを順番に実行できる特別なフォームです。これは、doフォームが最後のフォームの評価の結果を返すため、純粋な関数で使用する理由がないためです。簡単に言えばdo、非純粋なコードのある種のラッパーと考えることができます。すべての Lisp にはこの形式の類似物があり、たとえば Common Lisp では と呼ばれprognます。
dodefn、when、などのマクロで暗黙的に使用されますwhen-not。
if実用的な観点からは、ステートメントで使用でき(トモの回答を参照)、「本体」引数を持つマクロを作成するときに便利です(関数の本体などdefn)。
if「then」または「else」として 1 つの s-exp のみを取る のような形式で使用します。
(if (= a b)
(do (println "Yes") (something))
(do (println "No") (something-else)))