2012-07-25 3 views
2

다른 .clj 파일에서 .clj 파일을로드하거나 컴파일하려고합니다. 로드하려는 파일에 많은 수의 맵이 포함되어 있기 때문에이 파일을 xml 파일로 대체하려고합니다. 난 그냥 파일 :use 수 있고 그것을 작동하지만, 데이터의 외부 무리를로드의 운동을 통해 가려고 노력하고있어.외부 클로저 파일을로드하고 컴파일 할 수 없습니다.

내가 어떻게 든 (load "default_libs")뿐만 아니라 (compile...) 할 수 있었다 (이맥스 등을 통해) REPL의 주위에 어떤 임의의 해킹을 통해

(네임 스페이스 예선, '의 다른 조합을 사용하고 ") 및지도에 접근 할 수 있지만, 다시 시작 후 repl가 더 이상 작동하지 않아 어쨌든 전체 네임 스페이스 이름을 사용하여 데이터에 접근해야했습니다.

(ns mycad.lib-manager 
    (:use [clojure repl] 
     [mycad utils])) 

(compile 'mycad.default-libs) 
(println mycad.default-libs/default-symbols) 

이 내가 default_libs.clj,로드 노력하고있어 파일은 다음과 같습니다

이 lib_manager.clj입니다. 여기에있는 데이터는 결국 일부 XML 파일이 될 것입니다. 그러나 저는 여전히 이것에 대해 매우 새롭기 때문에, 지금 막 많은 clojure 맵을 직접 작성했습니다.

(ns mycad.default-libs) 
(def default-symbols {.... }) 

그래서 질문은 정말 하나 load 또는 compile를 사용하여 데이터의 소스로 치료를 대신 (ns...)와 네임 스페이스에로드하지만하지 않고 .clj 파일에서 데이터의 무리를로드 할 수있는 방법인가? load에 귀하의 예제에서 어떤 도움

답변

2

변경 compile에 대한

덕분에 당신은 당신의 질문의 앞부분을 설명한다. 그런 다음 예제가 작동합니다.

compile은 네임 스페이스의 AOT 컴파일에 사용됩니다. 그래서 당신이 필요로하는 것이 아닙니다.

지도가 하나만 정의되어있는 경우 load-file을 사용할 수 있습니다. "파일"이 클래스 경로 또는 기타 로컬이 아닌 스트림에 의해 어딘가에 실제로 경우

(def default-symbols (load-file "/file/path.clj")) 

load-string있다.

(def default-symbols (load-string (slurp (io/reader stream)))) 
0

리스프는 매우 동적 인 언어입니다. Clojure는 Lisp이므로 다음을 수행 할 수 있습니다.

user=> (eval (read-string "(def a 10)")) 
#'user/a 
user=> a 
10 

그래서 파일을로드 할 수 있습니다. 함수 here에서 read-all 다음 (eval 모든 형태의 : 당신의 file.clj(def initions에만 포함되어있는 경우

(use 'clojure.java.io) ; for (reader ..) function 
(import 'java.io.PushbackReader) 
.... 
(doseq [f (read-all (PushbackReader. (reader "your/file.clj")))] (eval f)) 

그런 다음, 그들은 당신의 현재 이름 공간에있을 것이다 당신은 그들에게 간단하게 변수를 사용할 수 있습니다. 하지만 file.clj에 일부 네임 스페이스 변경 양식 ( (ns..), (in-ns ..))이 포함되어 있으면 현재 네임 스페이스가 변경되기 때문에 상황이 복잡 할 수 있습니다. 이러한 선언이 필수적이며 파일 자체에서 삭제할 수없는 경우에는 정의가있는 경우에만 양식을 보내고 시도 할 수 있습니다.

업데이트는 : 흠, 나는 (eval + (read-all(load-file에 어떤 의미에 해당하는 것을 발견 :

(load-file "your/file.clj") 

그러나 load-file의 경우 네임 스페이스가 있었다하더라도 변경되지 않는 공간 변화 명령 -이 네임 스페이스는 방금 메모리에로드되며, 평상시와 같이 심볼을 참조 할 수 있습니다. 이것이 당신에게 필요한 것 같습니다.

관련 문제