私は Clojure の初心者であり、Closure で実行できるかどうかさえわからない問題に遭遇しました。
そこで本題は以下。間隔から (制限まで) 素数を計算する関数を実装しました。
(defn gather_primes_in_range [range_start range_end target_number prime_list]
(if (or (= 0 target_number) (> range_start range_end) (= FIND_MORE_PRIMES false))
prime_list
(do
(if (is_prime? range_start)
(gather_primes_in_range (+ range_start 1) range_end (- target_number 1) (conj, prime_list, range_start))
(gather_primes_in_range (+ range_start 1) range_end target_number prime_list)
)
)
)
)
(defn find_nr_of_primes_in_range [range_start range_end target_number]
(if (< range_start 2)
(gather_primes_in_range 2 range_end target_number [])
(gather_primes_in_range range_start range_end target_number [])
)
)
これはうまくいきます。しかし、私が今欲しいのは、後で検索する変数で見つかった素数を呼び出す各メソッドに格納する必要があるグローバル変数を持つことです。Python、Ruby、Scala などの他の言語では、関数から戻る前にエントリを追加する Set を使用してこれを行います。しかし、Clojure では、これを回避する方法がわかりません。
基本的に私が試したのは、どこかでグローバルに宣言したことです:
(def PRIMES_FOUND_SO_FAR #{})
そして、どういうわけか、リターン時にこの変数にエントリを追加します。これはClojureでまったく可能ですか?swap!
とatom
、または set のいずれかを使用して値を変更するために、他の変数を試しました。しかし、どのような状況でもここで機能することはできませんでした。