2017-02-19 6 views
4

Clojure 코드에 공백을 무시하고 주석 등을 무시하는 표준 직렬화를 사용하려고합니다. EDN을 사용하려고 생각했습니다.Clojure 코드를 EDN으로 직렬화 및 비 직렬화

내가 읽은 바에 따르면 s- 표현식을 EDN에 직렬화하는 표준 방법은 pr-str을 통해 이루어지며 대부분 Clojure의 구조와 잘 어울리는 것으로 보입니다. 그러나 이것은 정규식을 포함하는 코드 (#"\d+"과 같은 해시 문자열 판독기 매크로 사용)에서는 잘 작동하지 않는 것으로 보입니다.

user=> (pr-str '#"\d") 
"#\"\\d\"" 

user=> (edn/read-string (pr-str '#"\d")) 

RuntimeException No dispatch macro for: " Clojure.lang.Util.runtimeException (Util.java:221) 

저는 Clojure 1.8.0을 사용하고 있습니다.

제안 사항?

감사합니다!

편집 : 답장 및 의견을 보내 주셔서 감사합니다. EDN을 사용하여 시작하려는 이유는 신뢰할 수없는 코드를 처리하기 위해서입니다.

아이디어는이 코드 (구문 적으로 유효한 Clojure 코드)를 읽은 다음 일부 특수 목적 정적 분석을 통해이 코드를 Clojure의 특정 하위 집합으로 간주하여 "안전하다고 생각합니다. "그리고이 코드를 준수하는 경우에만이 코드를 실행하는 것이 안전하다고 생각합니다. 이런 이유로 나는 파일을 바로로드하는 load-file을 피하고 때문에 read-string 일 가능성이 있습니다.

+2

여기 내 _guess_는 EDN의 핵심은 "코드"가 아니라 데이터를 저장하는 것입니다. 대신에 보통의'read-string'을 사용할 수 있습니다 (함정이 있습니다). 도움이된다면 적절한 답을 얻을 수 있습니다 : https://github.com/clojure/clojure/blame/master/src/jvm/clojure/lang/EdnReader.java#L53 – cfrick

+1

왜 Clojure를 저장하지 않습니까? .clj 파일에 코드를 작성하고 Clojure를 사용하여로드 하시겠습니까? –

+0

'read-string'과'load-file'에 대한 제 편집을보십시오. –

답변

0

Clojure는 EDN의 상위 집합이므로 모든 Clojure 기능이 지원되는 것은 아닙니다. pr-str의 출력은 String에 맞게 이스케이프 된 유효한 Clojure 프로그램입니다. RuntimeException은 첫 번째로 회신 된 "에 대해 불만을 제기하고 있으며 이는 EDN # 독자 매크로에서 지원하지 않습니다.

(clojure.core/read-string (pr-str #"\d")) ;=> #"\d" 
+0

'read-string'의 사용에 관한 제 편집을보십시오 –

+0

아마도 tools.reader를 사용할 것입니까? https://github.com/clojure/tools.reader – Jeremy