私の理解が正しければ、Clojure は (他の Lisp のように) リストだけでなく、ベクトルとセットも返すことができます。
私が本当に得られないのは、返されるコレクションが常にあるとは限らない理由です。
たとえば、次のコードを使用するとします。
(loop [x 128]
(when (> x 1)
(println x)
(recur (/ x 2))))
128 64 32 16 8 4 2 を出力します。しかし、それは単にprintlnが呼び出され、printlnが何かを出力するという副作用 (?) を持っているためです。
だから私はこれに置き換えてみました(printlnを削除します):
(loop [x 128]
(when (> x 1)
x
(recur (/ x 2))))
そして、次のようなコレクション(おそらくリスト)を取得することを期待していました:
(128 64 32 16 8 4 2)
しかし、代わりにnilを取得しています。
コレクションを作成するものとそうでないものを決定するものと、あるものから別のものに切り替える方法がわかりません。また、Clojure が何らかの形で「関数型」のプログラミング方法を奨励していることがわかりましたが、ほぼ常にコレクションを返すことになっているのではないでしょうか?
明らかにコレクションを返さない関数が非常に多いのはなぜですか? そして、これらの戻り値のコレクションを作成する慣用的な方法は何でしょうか?
たとえば、最初にコレクションを構築してから、結果のリスト/ベクトル以外の慣用的な方法で反復 (?) することによって、上記の問題をどのように解決しますか?
まず、ループを変換してnil以外のものを生成する方法がわからないため、次のことを試しました。
(reduce println '(1 2 3))
しかし、期待していた「1 2 3nil」ではなく、 「1 2nil 3nil」と表示されます。
これは基本的なことだと思いますが、始めたばかりで、明らかに基本的なことが欠けています。
(PS: 適切に再タグ付けしてください。ここでどの用語を使用すればよいかわかりません)