2009-11-17 4 views
10

모든 내장 Clojure 함수의 메타 데이터를 가져 오려고합니다.Clojure : 함수의 메타 데이터를 얻는 방법?

previous question에서 나는 ^#'func_name (var 개체의 메타 데이터 가져 오기)과 같은 것을 사용하여이 작업을 수행 할 수 있음을 알게되었습니다. 그러나 func-name이 미리 알려지지 않은 곳에서는 프로그래밍 방식으로 처리하지 못했습니다. 이 방법을

user=> (use 'clojure.contrib.ns-utils) 
nil 
user=> (def last-func (last (vars clojure.core))) 

user=> last-func 
zipmap 

;The real metadata (zipmap is hardcoded) 
user=> ^#'zipmap 
{:ns #<Namespace clojure.core>, :name zipmap, :file "clojure/core.clj", :line 1661, :arglists ([keys vals]), :doc "Returns a map .."} 

;Try to get programmatically, but get shit 
user=> ^#'last-func 
{:ns #<Namespace user>, :name last-func, :file "NO_SOURCE_PATH", :line 282} 

을 수행 할 수 있습니다 clojure.core의 마지막 함수의 메타 데이터를 얻으려고 노력 예를 들어

? 나는 이미 수많은 변주를 시도했지만 그 트릭을 수행하지는 않습니다.

답변

8

귀하는 metans-resolve을 찾고 있습니다.

user=> (let [fun "map"] (meta (ns-resolve 'clojure.core (symbol fun)))) 
{:ns #<Namespace clojure.core>, :name map, :file "clojure/core.clj", :line 1705, :arglists ([f coll] [f c1 c2] [f c1 c2 c3] [f c1 c2 c3 & colls]), :doc "Returns a lazy sequence consisting of the result of applying f to the\n set of first i tems of each coll, followed by applying f to the set\n of second items in each coll, until any one of the colls is\n exhausted. Any remaining items in other colls are ignored. Function\n f should accept number-of-colls arguments."}
+0

고마워요! 사실,^(ns-resolve 'clojure.core last-func)가 이것을 실현합니다. – GabiMe

+0

^^ (intern'clojure.core last-func) – GabiMe

+1

이것은 위험한 해결책입니다.

user=> (meta (intern 'clojure.core (with-meta 'count :meta :data}))) {:ns #, :name count, :meta :data}
기호의 출처는 신중해야합니다. 저는 여전히 인턴을 통해 ns-resolve를 권합니다. – kotarak

3

기술적 기능은 현재 Clojure의 메타 데이터를 가질 수 없습니다 :

http://www.assembla.com/spaces/clojure/tickets/94-GC--Issue-90---%09-Support-metadata-on-fns

그러나, 함수에 바인딩 바르가, 그리고 보이는 수는 NS-결의 찾는하는지처럼. (meta last-func)도 작동합니다. last-func는 var 자체이므로^# 'last-func ((meta (var (quote last-func))))의 줄임말)은 중복 된 var 역 참조를 갖습니다.

+0

번호 (메타 마지막 기능)가 작동하지 않습니다. 직접 체험 해보십시오. 그것은 nil을 반환합니다 – GabiMe

+0

'clojure.contrib.ns-utils/vars'는 vars리스트가 아닌 심볼리스트를 반환합니다. 그것이 작동하지 않는 이유입니다. –

관련 문제