2012-10-26 5 views
2

Clojure에서 this (my-function [a b c])와 같은 함수 호출을 작성할 때. Clojure는 내 기능을 어떻게 찾습니까? 전역/네임 스페이스 심볼 테이블에서 조회를 수행합니까?Clojure는 어떻게 이름을 해석합니까?

심볼 테이블이 O (1) 시간 복잡성을 제공하는 해시 테이블로 구현되었다고 가정합니다. 또한 O (n) 시간 (n은 기호의 길이)을 가져야하는 테이블의 기호와 함수 이름을 문자열로 비교해야합니다. 이름 분해가 느릴수록 심볼의 길이가 길어집니다. 맞습니까?

답변

2

네임 스페이스는 참으로지도처럼 행동 당신은 ns-map 기능을 직접 볼 수 있습니다 :

autotestbed.core> (pprint (take 5 (ns-map *ns*))) 
nil 
([sorted-map                        
    #<[email protected]:                       
    #<core$sorted_map [email protected]>>]             
[read-line                         
    #<[email protected]: #<core$read_line [email protected]>>]          
[re-pattern                        
    #<[email protected]:                       
    #<core$re_pattern [email protected]>>]             
[keyword?                         
    #<[email protected]:                       
    #<core$keyword_QMARK_ [email protected]>>]           
[hta-deploy-cmd                       
    #<[email protected]:                       
    #<core$hta_deploy_cmd [email protected]>>]) 

보다 구체적 그들은 개체에 바르 매핑합니다.

만약 당신이 정말로 함수를 바 꾸었 으면 바꾼다. 즉, 컴파일시에 var에 포함 된 함수 대신에 var를 호출 할 수있다. 모든 전화 :

(#'foo 4) looks the function up in the var every time 
(foo 4) looks it up in the map once when it's compiled. 
3

Clojure의 컴파일 된 언어입니다 - 그것은, JVM 바이트 코드에 직접 컴파일 아직 완전히 동적 남아있다.

는 -부터 http://clojure.org/

컴파일의 첫 페이지는 기호가 이미 함수 이름 길이에 대한 두 번째 문 이에 대한 prehashed 것을 의미 컴파일시에만 해당됩니다. 또한 모든 CPU주기가 염려되는 경우 JVM/CLR 언어는 여러 가지 이유로 친구가되지 않습니다.

3

기호는 내부 문자열을 사용하므로 ==과 비교되며 .equals이 아닙니다. 그래서 당신이 말한 부분조차도 O (n)은 O (1)입니다. 그러나 이러한 모든 조회 (a)는 어쨌든 엄청나게 빠르기 때문에 (b) 런타임이 아닌 컴파일 타임에 발생하기 때문에 거의 중요하지 않습니다. 프로그램을 실행하면 모든 함수 호출이 포인터 역 참조 또는 일부 유사 함수로 해석됩니다.

관련 문제