2014-04-16 2 views
1

let 문으로 재구성하려는 일련의 심볼 정의가 있지만 문제점을 해결하는 방법이 확실하지 않습니다. 또한 읽을 수있는 코드의 구조와 발전 기반 로깅을 유지하면서Clojure를 사용하여 순차적 로컬 심볼 정의

(do 

    (info "Loading primary headers...") 
    (load-primary-headers ph-file-path) ; Defines the primary-header-group symbol 
    (info "Loaded primary headers.") 

    (info "Loading secondary headers...") 
    (load-secondary-headers sh-file-path) ; Defines the secondary-header-group symbol 
    (info "Loaded secondary headers.") 

    (info "Loading data...") 
    (load-data file-path primary-header-group secondary-header-group) ; Defines the data symbol 
    (info "Loaded data.") 

    (info "Mapping data...") 
    (map-data file-path primary-header-group secondary-header-group) ; Defines the mapped-data symbol 
    (info "Mapped data.")) 

무엇, 그래서 나중에 기호 정의의 심볼을 사용하는 프로그램을 설계하기위한 가장 좋은 방법이 될 것입니다 : 예를 참조? do에도 불구하고 정확한 기호 정의 실행 순서는 중요하지 않습니다.

+0

'let'양식을 보여주십시오. – Chiron

+0

'load-'함수와'map-data' 함수에 대한 정의를 보여줄 수 있습니까? –

답변

1

더 나은 접근법은 Clojure의 네이티브 최적화 계산을 신뢰하는 것일 것이라고 생각합니다. 특히 멀티 스레드 작업에서 더욱 그렇습니다. 실행 순서는 중요하지 않으므로 이러한 작업을 동시에 수행하는 것을 고려해야합니다. 당신이 @ 기호를 DEREF 때까지

(let [primary-headers (future (get-ph ph-file-path)) 
     secondary-headers (future (get-sh sh-file-path)) 
     data    (future (get-data file-path ph-group sh-group)) 
     mapped-data  (future (map-data file-path ph-group sh-group))] 
    (do-something-with @primary-headers @secondary-headers etc)) 

계산은 연기되고, 그들은 별도의 스레드에서 동시에 수행된다 : 나는 미래를 사용하는 것이 좋습니다 것입니다.

선물 및 기타 동시성 구조에 대한 좋은 정보가 있습니다 here.

편집 : 당신은 여전히 ​​(info "Loading primary headers...") 같은 로깅 문을 유지하려면, 각 future에 포함 할 수있다. 로깅은 각 future을 역 참조 할 때까지 발생하지 않으며 좋은 점은 선물 캐시 결과이므로 여러 번 회신 할 수 있으며 로깅은 한 번만 발생합니다. 원하는 동작이 있다고 가정합니다 (@primary-headers을 사용할 때마다 "기본 헤더로드"를 기록하지 않으려합니다.

+0

예를 들어'ph-group'과'sh-group'이'primary-headers'와'secondary-headers'가 아니겠습니까? 또한'let-binding '은 기호를 만들지 않기 때문에'let '바인딩 바로 아래에 있을까요? – user1559027

+0

죄송합니다. 간략하게하기 위해 심볼의 이름을 바꾸는 것을 잊어 버렸습니다. 나는 단지 '기본 헤더 그룹'과 '보조 헤더 그룹'을 'ph 그룹'으로 변경했으며, 'sh-group','load-primary-headers' 등을'get-ph'에 추가합니다. 나는 당신의'load-data'와'map-data' 함수가 얼마나 정확히 작동하는지 모르겠지만, 기본 헤더에서 작동한다면,'ph-group'은'@ primary-headers'가되어야합니다. 'do'-something-with ...)는'let'에서 정의하고있는 기호로 실제로하고있는 것입니다. ('@'에주의하십시오.) –

+0

' 제본. 참조 : http://clojuredocs.org/clojure_core/clojure.core/let –

관련 문제