2012-11-02 5 views
6

해당 인수와 독립적 인 함수와 관련된 데이터가있을 때 언제 로컬 캡슐화보다 블록 캡슐화를 선호해야합니까?블록 캡슐화 대 로컬 캡슐화 -

는 언제 사용해야

(let [hello "Hello "] 
    (defn do-greet 
    "Print a greeting." 
    [name] 
    (println (str hello name)))) 

수스 : 확실히

(defn do-greet 
    "Print a greeting." 
    [name] 
    (let [hello "Hello "] 
    (println (str hello name)))) 

답변

6

어휘 적으로 범위가 지정된 코드 블록 내에서 정적 상수와 같은 값을 사용하려는 경우 전자는 합리적인 옵션입니다. 값은 계산 비용이

  • , 당신은
  • 값은, 즉 함수 호출
  • 을 통해 진정으로 일정이 변경되지 않습니다 경우에만 한 번 네임 스페이스가로드 중일 때 추가해야합니다 : 일반적으로 경우에 당신은이 작업을 수행 할 것
  • 값은 여러 개의 함수 정의에 걸쳐 사용됩니다 (예 : let 블록 내에 여러 defns를 넣음)
  • (아마도?) 매크로 확장 내부의 값을 사용하고 매크로 확장 자체 내에 let을 포함하기를 원하기 때문입니다 불필요한 복잡성이 추가됩니다. 여러 가지 이유로

후자의 버전은 아마 대부분의 경우에 선호한다, 그것은 좋은 :

  • 그것은 함수 정의는 최상위 수준에있을 수 있습니다 더 관용적이다
    • ,
    • 다른 함수 호출에 따라 값이 달라질 수 있습니다.
    • 로컬 컨텍스트에서 값을 사용하려는 의도가 더 잘 나타납니다.
  • +0

    나는 이것을 좋아한다. 당신은 더 많은 점수를 얻는다. 확장 기능을 둘러 쌀 수는 있지만 함수 내부에있을 수 있기 때문에 매크로 확장 점이 유효한지 잘 모르겠습니다. 가독성을 위해 의미 론적 차이와 문체 선택을 분리하는 것이 좋습니다. 값은 다른 함수 호출에 따라 다를 수 있습니다. – bmillare

    1

    이 :

    (defn do-greet 
        "Print a greeting." 
        [name] 
        (let [hello "Hello "] 
        (println (str hello name)))) 
    
    2

    hello 경우는 하나 하나 개의 기능에 사용되는, 더 의미가 있습니다 함수 내에서 let을 넣으십시오. 여러 함수에서 hello을 사용하려는 경우 let을 해당 함수 외부에 랩핑하는 것이 좋습니다.

    +0

    런타임에서 두 코드가 동등하지 않은 경우 스타일을 기반으로 결정하지 않아야한다고 주장합니다. 대신 바인딩이 정적 리소스를 읽는 것이라고 상상해보십시오. (let [hello (slurp (clojure.java.io/resource "hello"))] ...)'. 나는 그 질문들이 실제로 평가되는 방식과 상응하는 상충 관계가 무엇인지 모르기 때문에 좀 더 일반적인 질문을 남겼다. – ToBeReplaced

    +1

    어떤 경우에는 스타일과 관련이 없습니다. 값이 다른 두 개의 함수에서 사용 가능해야하는 경우, 해당 함수의 범위보다 위에 값을 사용 가능하게해야합니다. 또한 @ amalloy의 대답을 참조하십시오. – Rayne

    5

    이것은 스타일에 대한 선택이며 값이 얼마나 비싼지에 따라 달라질 수 있습니다. 대신 고려 :

    (defn nth-prime [n] ...) 
    
    (defn f [x] 
        (let [factor (nth-prime 10000)] 
        (* x factor))) 
    
    (let [factor (nth-prime 10000)] 
        (defn g [x] 
        (* x factor))) 
    

    라고 비싼 일정마다 f을 재 계산 낭비이며, g 그 일을 방지하기 위해 간단한 기술을 사용합니다.

    +3

    런타임 동작 (성능)에 차이가 있다고 말하면서, 필자는 스타일 선택이 아니라고 주장 할 것입니다. 왜냐하면 오직 구술자의 예에서 실질적으로 차이가 없기 때문에 그것은 문체 적이기 때문입니다. – bmillare