2013-11-15 6 views
5

겸손히 묻고 싶습니다 ...상수 값에 대한 var 또는 ref/atom/agent?

"상수 값에 대한 var 또는 ref/atom/agent"는 무엇입니까? 물론, 저는 상수 값에 대해 vars를 사용합니다.

그러나 저는 항상 값이 상수와 같은 역할을 할 때 사용해야 할 것이지만 컴파일 타임 (코드를 읽을 때)보다는 런타임에 할당해야한다고 생각했습니다.

예를 들어, 사용자의 구성 파일에 작성된 일부 Java 등록 정보를 생각해보십시오. 데이터가 코드에 없기 때문에 런타임에 할당해야합니다. 그러나 다른 코드가 참조하기 때문에 데이터를 읽기 전에 정의해야합니다. 이 경우

,

내가 사용합니까 'VAR의?

  • 내가 정의'VAR의, 또는 (괜찮아요 때) 단지 'VAR의를 선언합니다.
  • 그런 다음 옵션 파일을 읽는 함수에 의해 이들 'var'를 다시 정의합니다.
  • 하지만 'var'를 덮어 쓰는 것이 끔찍하거나 'var'내부 기능을 정의하는 것이 이상하다고 느낍니다. 수행 할 때

나는 REF/원자/에이전트?

  • 내가 심판/원자/에이전트를 할당 'VAR의로를 사용합니다.
  • 그러면 ref/atom/agents를 옵션 파일을 읽는 함수로 업데이트합니다.
  • 그러나 값이 프로그램 전체에서 사용되므로 비용이 걱정됩니다.
  • ... 너무 많은 @ 매크로를 사용하는 것은 다소 짜증이납니다.

무엇을 사용해야하는지 잘 모르겠습니다.

그런 경우 무엇을 사용합니까?

'var 's? 'ref/atom/agent 's? 또는 '지연이야?

미리 감사드립니다.

+0

프로그램이 시작될 때 첫 줄에 동 기적으로 var를 정의하지 않는 이유는 무엇입니까? 이 경우에는 다른 곳의 var를 덮어 쓸 필요가 없습니다. 다른면에서는 글쓰기로 짜증나는 경우 '@ my-var' 어디에서나'@ my-var'를 반환하는 래퍼 함수를 ​​정의 할 수 있습니다 – hsestupin

+0

답변 해 주셔서 감사합니다. var를 동 기적으로 어떻게 정의합니까? 나는 당신이 의미하는 바를 이해하지 못한다고 생각합니다. vars가 동기적인 것이 아니라고 생각했습니다. vars에 ref를 할당하고 초기화를 위해 ref를 재설정 (업데이트) 했습니까? –

+1

당신의 네임 스페이스'ns.with-const'에서 그 첫 번째 코드 줄은'(def my-const (some-computations))'일 것입니다. 따라서이 표현식이'ns.with-const'를 사용하거나 필요로하는 모든 네임 스페이스를 평가할 때까지는 자신의 코드를 평가하지 않습니다. 그리고이 모델에는 경쟁 조건이 없습니다. const가 계산 될 때 - 정의 된 개미가됩니다. 모든 것이 잘 작동합니다. 희망이 설명은 의미가있다 – hsestupin

답변

2

"상수"의 전체 또는 그룹을 한 번에 하나씩 학습하면 "속성"이라고 대신 해보자.

그리고의는 "그들을 빨아"것이라고 설정합시다 :

(defn resource [path] 
    (when path 
    (-> (Thread/currentThread) .getContextClassLoader (.getResource path)))) 

(def props 
    (edn/read-string 
    (slurp (io/file (resource (System/getProperty "your.conf")))))) 

(defn conf [& path]     ;; e.g. (conf :db :uri) 
    (get-in props (vec path))) 

귀하의 특성 (예를 들어, "상수") "당신의 파일을.실제 생활 "은"소품 "VAR의 conf는"

에서
(conf :db :uri)    ;; will "constant"ly return "datomic:mem://dbname" 
(conf :rabbit :host)   ;; will "constant"ly return "192.168.1.17" 
(conf :db :other-property) ;; will "constant"ly return 42 

: 당신은 모든이 속성에 액세스 할 수 있습니다 프로그램/다른 네임 스페이스에서 나중에 그런

{:db 
    {:uri "datomic:mem://dbname" 
    :other-property 42} 

:rabbit 
     {:host "192.168.1.17" 
     :port 5672 
     :exchange "xyz-exchange" 
     :queue "zq" 
     :exchange.type "direct" 
     :vhost "/some-broker" 
     :username "user" 
     :password "strong"}} 

의 라인에있을 것입니다 " 위의 코드는 잠재적으로 "-D"경로를 검사하고 기본값을 가지며 예외를 처리하지만 포인트를 설명하기 위해 약간 단순화되었습니다.