2016-08-30 1 views
2

lookup-file 함수를 작성하여 네임 스페이스를 전달하면 .clj 파일을 자동으로 확인할 수 있습니다.주어진 네임 스페이스로 관련 파일을 검색하는 방법은 무엇입니까?

예 :

(lookup-file 'rabbit.warren-test) 
;=> "test/rabbit/warren-test.clj" 

(lookup-file 'rabbit.warren) 
;=> "src/rabbit/warren.clj" 

(lookup-file 'clojure.core) 
;=> "~/.m2/repositories/org/clojure/clojure/clojure-1.9.0.jar:/...." 

이 작업을 수행 내장 함수가 있습니까?

답변

2

:

(defn files-for-ns [ns-sym] 
    (->> (ns-publics ns-sym) 
     keys 
     (map resolve) 
     (map meta) 
     (map :file) 
     set)) 

또는 전체 경로를 원한다면 :

(require '[clojure.java.io :as io]) 

(defn files-for-ns [ns-sym] 
    (->> (ns-publics ns-sym) 
     keys 
     (map resolve) 
     (map meta) 
     (map :file) 
     set 
     (keep identity) 
     (map io/resource) 
     (map str))) 

예 :

(use 'clojure.pprint) 
(pprint (files-for-ns 'clojure.core)) 
("jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/gvec.clj" 
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/core_proxy.clj" 
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/core.clj" 
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/core_print.clj" 
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/core_deftype.clj" 
"jar:file:/Users/Borkdude/.m2/repository/org/clojure/clojure/1.9.0-alpha10/clojure-1.9.0-alpha10.jar!/clojure/genclass.clj") 
+0

내가 찾고있는 것이지 ... 네가 네임 스페이스를로드 할 때 파일의 철자가 틀린 경우 ... 예외가있다 ... 죄송합니다 x/y/z.clj에 이미 – zcaudate

+0

이 없으므로 이미로드 된 파일이 아닌로드 될 파일입니다. – zcaudate

+0

죄송 합니다만, 무슨 뜻인지는 완전히 분명하지 않습니다. –

1

아니요 내장 함수가있을뿐만 아니라 주어진 네임 스페이스가 0 개 이상의 파일에 정의되어있을 수 있기 때문에 일반적으로 알 수있는 것조차 아닙니다. 예를 들어 clojure.core는 많은 소스 파일에 정의되어 있으며 repl에만 네임 스페이스를 정의하면 해당 소스 파일이없는 네임 스페이스를 만들 수 있습니다.

당신이 트릭을 사용하여 몇 가지 정보를 얻을 수
+0

어쩌면 clojure.core이이었다을 나쁜 예. 일반적으로 네임 스페이스 당 하나의 파일이 있습니다. 어떻게 든 이맥스는 내가 파일을 평가할 때 어디서 볼 것인지를 안다. – zcaudate

관련 문제