다른 사람의 Clojure의 코드를 볼 때 때때로, 나는 기능은 예를 들어, defn
를 통해 정의하고 VAR 인용 구문을 사용하여 호출을 참조하십시오의 수명을사용하여 Clojure의 함수 호출 VAR 인용 구문
user> (defn a [] 1)
#'user/a
user> (a) ; This is how you normally call a function
1
user> (#'a) ; This uses the var-quote syntax and produces the same result
1
나는 함수를 호출하는이 두 가지 방법의 차이를 이해할 수 없다. evaluation 설명서에서 호출 연산자가 왜 두 번째 형식이 선호 될지 제안 할 수있는 var 일 때 어떤 일이 발생하는지 알 수는 없습니다. 이들은 모두 binding
할당 및 구문 인용에 응답하는 것으로 보입니다.
위의 코드에서 (a)
과 (#'a)
의 차이점을 보여주는 코드 샘플을 제공해주십시오.
편집 : 내가 var에 따옴표가 let
어휘 결합에 의해 그림자있어 var에 도착하는 데 사용할 수 있다는 것을 알고 있지만, 내가 찾고 있어요 코드의 경우 될 것 같지 않습니다.
user> (defn a [] 1)
#'user/a
user> (let [a (fn [] "booh")] [(a) (#'a)])
["booh" 1]
그러나 대부분의 실제 VAR 인용/함수 호출의 용도 직접 VAR 인용 식을 호출되지 않습니다 (a)
로컬 바인딩에 의해 그림자가 될 수있는 반면
좋은 지적 - 이제는 내가 언급 한대로 과거에이 작업을 수행 한 것을 기억합니다. 그러나 내가보고있는 코드는 비공개 fn을 호출하는 것이므로 현재 바인딩 된 값의 캐싱을 피하는 것이 가장 가능성있는 설명이라고 생각합니다. – Alex
코드가 개인 repo에 있기 때문에. 나는 일반적인 질문을 올렸고, 두 가지 좋은 대답을 얻었고 오직 하나만 받아 들일 수 있었다. 그래서 나는 일반적인 경우에 대해 더 잘 대답 할 수 있다고 느꼈던 것을 받아 들였다. – Alex