2

ドキュメントには次のように記載されています。

(do exprs*)
式を順番に評価し、最後の値を返します。式が指定されていない場合は、nil を返します。

ただし、私はこれを行いました:

(defn blah []
  (print "how")
  (print "now")
  (print "brown")
  (print "cow")
  (+ 1 1))

この結果:

hownowbrowncow2

では、なぜこれが再び必要なのですか?

4

2 に答える 2

3

一般にdo、おそらく副作用のために、いくつかのフォームを順番に実行できる特別なフォームです。これは、doフォームが最後のフォームの評価の結果を返すため、純粋な関数で使用する理由がないためです。簡単に言えばdo、非純粋なコードのある種のラッパーと考えることができます。すべての Lisp にはこの形式の類似物があり、たとえば Common Lisp では と呼ばれprognます。

dodefnwhen、などのマクロで暗黙的に使用されますwhen-not

if実用的な観点からは、ステートメントで使用でき(トモの回答を参照)、「本体」引数を持つマクロを作成するときに便利です(関数の本体などdefn)。

于 2014-09-25T11:53:46.527 に答える
2

if「then」または「else」として 1 つの s-exp のみを取る のような形式で使用します。

(if (= a b)
    (do (println "Yes") (something))
    (do (println "No") (something-else)))
于 2014-09-25T10:35:05.197 に答える