2011-07-17 2 views
4

warn-on-reflection 클로저에 의해 제공되는 것과 같이 사용자에게 설정할 수있는 바를 제공해야합니다. 클로저에 정의되지 않은 이유는 클로저에 정의되어 있지 않습니다.설정 가능한 글로벌 바 제공

문제는 내 vars (모든 구성 요소)가 많은 타이트한 루프에 사용된다는 것입니다. 왜 내가 응용 프로그램이 시작될 때 설정 될 수 있고 런타임 중에 변경되지 않을 수 있으므로 원인을 찾지 않으려 고합니다. 어쩌면 수백만 번 읽혀질 것이므로 리소스를 낭비하는 것처럼 보인다.

그렇다면 내 경우에는 설정 가능한 바를 정의 할 수 있습니까?

+0

def를 사용할 수없는 이유가 있습니까? – user100464

+0

이미 def를 사용하고 있습니다. deffed var를 변경해야합니다. –

+0

"바인딩"사용을 고려 했습니까? – user100464

답변

1

warn-on-reflection은 core.clj보다는 Clojure의 Java 코드에 정의 된 var 일 뿐이지 만 var입니다. 그러나 그것이 정의 된 곳을 제외하고는 아무런 변화가 없다. warn-on-reflection; 그것은 다른 var와 똑같이 동작합니다.

vars를 사용하지 않으려면 "전역 변수를 사용해야합니다"와 다른 관점에서 문제에 접근해야 할 수 있습니다. 함수형 프로그래밍에서는 전역 변수에 의존하기보다는 필요한 모든 값을 함수에 전달하는 것이 일반적입니다. 아마도 당신이 그런 접근법을 고려할 때입니다.

+0

이것은 var에 내장되어 core.clj에는 정의되어 있지 않지만 clojure에는 정의되어 있지 않다는 것을 의미하는 Java 코드에 정의되어 있음을 의미합니다. –

+0

"Clojure에서 정의되지 않은"의미의 오해에 대해 사과드립니다. 어쨌든 내 주요 요점은 다음과 같다 : warn-on-reflection은 var이고, 자바 코드에서 정의 된 것 외에도 다른 var와 똑같이 동작한다. "특별한 힘을 가진 용기"라는 개념은 없습니다. – user100464

+0

그것은 당신이 설정할 수있는 특별한 var입니다. 그것. 말을 def로 var를 정의 할 때 설정할 수 없습니다! 하지만 당신은 설정할 수 있습니다! 반사에 대한 경고. –

1

let을 사용하여 로컬 바인딩을 만들 수 있습니다. 이렇게하면 매개 변수가 동적 일 수 있으며 빠른 액세스가 가능합니다. 유일한 것은 루프가 실행되는 동안 누군가가 매개 변수를 변경하면 루프가 그 루프를 선택하지 않는다는 것입니다 (IMO는 원하는 동작이어야 함).

+0

let 블록에있는 코드에 대해서만 작동하도록하겠습니다. 한 세트의 코드가 아니라 전체 라이브러리에 영향을 주면 경고 - 경고 - 반사 선을 따라 무언가를 찾고 있습니다. –

2

당신은 모든 스레드가 볼 수 및 STM 트랜잭션이 돌연변이를 제어 할 필요가없는 낮은 오버 헤드와 설정 가능한 글로벌 상태가, 난 그냥 원자 사용하는 것이 좋습니다 거라고합니다 :

(def some-global-value (atom 1)) 

이 읽고에 기록을 원자는 극도로 낮은입니다.

관련 문제