2

私は ring/compojure ベースの Web API を持っており、スタートアップ フラグに応じて、またはリクエストに渡されたパラメータに応じて、オプションでキャッシュ (またはそのフラグ) をオンまたはオフにできる必要があります。

フラグを動的変数として設定してみました:

(def ^:dynamic *cache* true)

(defmacro cache [source record options & body]
  `(let [cachekey# (gen-cachekey ~source ~record ~options)]
     (if-let [cacheval# (if (and (:ttl ~source) ~*cache*) (mc/generic-get cachekey#) nil)]
       cacheval#
       (let [ret# (do ~@body)]
         (if (and (:ttl ~source) ~*cache*) (mc/generic-set cachekey# ret# :ttl (:ttl ~source)))
         ret#))))

...しかし、それはすべてのデータフェッチ関数をラップするのに理想的ではないバインディングブロック内でフラグを更新することしかできず、起動時にオプションでフラグを設定することはできません

次に、アトムにフラグを設定しようとしました。これにより、起動時にフラグを設定し、特定のパラメーターがリクエストに渡された場合にフラグを簡単に更新できましたが、更新によりすべてのスレッドのフラグが変更され、特定のリクエストのフラグだけではありません。

Clojure でこのようなことを行う最も慣用的な方法は何ですか?

4

1 に答える 1