2017-12-24 7 views
1

は私が動的にシンボルを登録していると私はそれが成功であることを確認することができます動的に保持された原子を間接参照する方法は?

(defn- register[x] 
    (intern 'foo.core x (atom {})) 
    (println "Var " x " gets " (var-get (get (ns-interns 'foo.core) x)))) 

; Var Persons gets #object[clojure.lang.Atom 0x688a2c09 {:status :ready, :val {}}] 

私のコアの質問はされています。中にXを使用する方法(swap!...

2番目の質問です:間接参照のxを取得する方法自分自身をマップ

最後の質問です:??クリーナーアプローチがあります

+0

@Carcigenicate - X ' 'で表すシンボルが実行時に導入されて、いないClojureの機能&ドキュメントは普遍的に使用することを時間 –

答えて

4

intern機能はvariableオブジェクトを返し、それがあるので、参照値は逆参照することができます(@またはderef)。また、関数から戻って操作して、目的の結果を得ることもできます。このvarが指す値(またはvarのバインディング)は、アトムを指し、それは別の参照値であり、逆参照することもできます。

ここでこのような場合に対処する方法の少し例を示します

user> (ns my.ns) 
nil 

my.ns> (in-ns 'user) 
#namespace[user] 

user> (defn register-trace [v-name] 
     (let [v (intern 'my.ns v-name (atom {}))] 
      (println (str "v is " v)) 
      (println (str "v's contents is " @v)) 
      (println (str "v's internal value is " @@v)) 
      v)) 
#'user/register-trace 

user> (register-trace 'asd) 
;;=> v is #'my.ns/asd 
;;=> v's contents is [email protected] 
;;=> v's internal value is {} 
#'my.ns/asd 

user> (let [var-atom @(register-trace 'my-var)] 
     (swap! var-atom assoc :x 101)) 
;;=> v is #'my.ns/my-var 
;;=> v's contents is [email protected] 
;;=> v's internal value is {} 
{:x 101} 

user> @my.ns/my-var 
{:x 101} 

user> (swap! my.ns/my-var update :x inc) 
{:x 102} 

user> @my.ns/my-var 
{:x 102} 
+0

注意をコンパイル用語「可変」ではなく用語「var」である。 –

関連する問題