2012-01-21 1 views
3

Using Lisp or Scheme for runtime configuration of Java programs의 연속으로서, 나는 일반 Java 문자열 외에 코드를 포함 할 수있는 "대체"Java 속성 파일을 찾고 있습니다. 나는 (때문에 크기) 노인 JScheme와 함께 연주하지만 Clojure의와 호환 될 파일 형식을 가지고하는 것이 유용 할 것이라고 생각했다하고 재미를 들어Scheme 및 Clojure에서 읽을 수있는 Java 등록 정보 파일을 에뮬레이트하기위한 구문은 무엇입니까?

key1=value1 
key2=value2 
... 

: 자바 프로퍼티 파일처럼 보인다. 이렇게하면 Clojure를 사용하는 더 큰 시스템뿐만 아니라 작은 "읽기 내 구성"- 사용법에도 동일한 구문을 사용할 수 있습니다. 이제는 정적 문자열이 아닌 값을 평가할 수있는 아이디어입니다.

저는 Scheme 또는 Clojure에 익숙하지 않지만 vector이 둘 다 사용할 수 있지만 바로 가기 구문이 다릅니다 (#(...)[...]).

유효한 Scheme 및 Clojure 프로그램 인 "Java 속성"데이터 구조를 나타내는 구문이 있습니까? 실제 코드를 보여주십시오.


편집은 다음 (props ...) 제안을보고 좀 더 ELisp 및 JScheme 내 리스프 기술을 닦고 후에, 나는

(list 
"key1" "value1" 
"key2" "value" 
) 

이 아닌 구문을 사용하여이 작업을 수행하는 가장 간단한 방법이 될 수 있음을 발견 속성 파일에서 너무 멀리 떨어져 있습니다.

답변

3

을 가정하면 Clojure의지도 리터럴을 읽을 체계 리더 매크로를 만들 싶지 않아 (그리고 Clojure의 사용자 정의 리더 매크로를 지원하지 않는) 방법 "소품"기능 정의에 대한 : 지금

(props 'key1 value1 'key2 value2 ...) 

을 Clojure의는

(def props hash-map) 

로 소품을 정의하고 유사한 방식으로, 당신은 하나의 언어에서 소품 식을 평가 후면 바로 할 수 있습니다.

당신은 좀 더 펑키하고 키를 따옴표로 묶은 매크로를 만들거나 (키가 기호라고 가정) 매크로를 그대로두고 키를 인용해야하는 대신 더 많은 유연성을 얻을 수 있습니다.

+0

키 기간 및/또는 다른 문자 I를 포함 할 수 있습니다 믿을 수 없다는 것은 상징에 허용됩니다. '(소품 "key1" "value1" "key2" "value2")'가능합니까? –

+0

네, 그게 효과가 있습니다. –

0

Clojure와 호환되기를 원한다고 가정하면 Java 속성 파일을 에뮬레이트하기위한 최상의 구조와 형식이 표준 Clojure 맵 구문을 사용하는 것일뿐입니다.

장점 :

  • 그것은 매우 JSON과 같은있어, 범용적이고 유연한 형식
  • 당신은 단지 (read-string 또는 유사한로) 직접 Clojure의 리더를 통해 읽을 수 있습니다. 파서를 작성할 필요가 없습니다!
  • 데이터 구조에 Clojure 코드를 포함 할 수도 있습니다. Clojure 코드는 Clojure 독자가 읽을 수 있고 컴파일 할 수 있습니다 (코드 주입 공격에주의하십시오.)
  • 당신 얻을 불변의 영구 데이터 구조
되고 그것의 모든 혜택

구문 뭔가 같은

{:key1 "Value1" 
:key2 "Value2" 
:function (fn [x] (* x x))} 

당신은 당신이 키로 원하는 객체 (예 : 문자열)하지만 사용할 수 있습니다 것 개인적으로 키워드 (예 : 콜론으로 시작하는 기호)를 사용하는 것이 가장 쉽다고 생각합니다. 키워드는 안정적으로 구금되어 있고지도에서 가치를 얻는 함수로 사용할 수 있다는 점에서 좋은 이점이 있습니다.

(:key2 property-map) 
=> "Value2" 
+0

질문에서 언급했듯이 저는 JScheme을 사용합니다. –

3

가장 쉽고 포터블 한 방법은 좋은 구식 목록 S- 표현입니다. 쓰기에는 write (Scheme) 또는 (Clojure)을 사용하고 읽기에는 read (모두 SchemeClojure)을 사용하십시오. (eval를 사용할 필요가 없습니다.)

귀하의 예는 S-표현으로 같을 것이다 :

("key1" "value1" 
"key2" "value2") 

S-표현은 매우 유연합니다. 이들은 임의로 중첩 될 수 있으며 단지 문자열 이외의 객체를 포함 할 수 있습니다. 예를 들어, 키 (유사 XML 요소 이름에) 의미 구조체 필드 인 경우, 기호는 더 잘 맞는 문자열보다 더 사람들을 위해, 같이 할 수있는 다음 :

(game 
    (players (name "Alice"  score 5) 
      (name "Bob"  score 10) 
      (name "Catherine" score 20)) 
    (state 4321)) 
관련 문제