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
일 가능성이 있습니다.
여기 내 _guess_는 EDN의 핵심은 "코드"가 아니라 데이터를 저장하는 것입니다. 대신에 보통의'read-string'을 사용할 수 있습니다 (함정이 있습니다). 도움이된다면 적절한 답을 얻을 수 있습니다 : https://github.com/clojure/clojure/blame/master/src/jvm/clojure/lang/EdnReader.java#L53 – cfrick
왜 Clojure를 저장하지 않습니까? .clj 파일에 코드를 작성하고 Clojure를 사용하여로드 하시겠습니까? –
'read-string'과'load-file'에 대한 제 편집을보십시오. –