2012-01-21 3 views
3

Using Lisp or Scheme for runtime configuration of Java programsの続きとして、私はプレーンJava文字列に加えてコードを含むことができるJavaプロパティファイル "replacement"を持つことを検討しています。 Javaプロパティファイルは次のようになります。楽しみのためにJavaプロパティファイルをエミュレートする構文は、SchemeとClojureの両方で読み取り可能ですか?

key1=value1 
key2=value2 
... 

私は(原因サイズ)高齢者JSchemeで遊んでいますが、Clojureのと互換性があるでしょう、ファイル形式を有することが有用であろうことを考えるようになったのです。これにより、Clojureを使用している大規模システムだけでなく、小さな「読み込み」設定でも同じ構文を使用できます。したがって、静的な文字列ではなく、値を評価できるという考え方です。

#(...)[...]に比べて)私は非常にスキームやClojureのを経験していないのですが、それはvectorは、両方で利用可能であることが表示されますが、ショートカット構文が異なります。

有効なSchemeとClojureの両方のプログラムである "Javaプロパティ"データ構造を表す構文はありますか?実際のコードを表示してください。


EDITは:(props ...)の提案を見て、いくつかのより多くのelispとJSchemeと私のLispのスキルをブラッシュアップした後、私は

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

はないの構文でこれを行うための最も簡単な方法かもしれないことがわかりましたプロパティファイルから離れすぎています。

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

今で:「小道具」機能の定義についてどのように、あなたはClojureのマップリテラルを読み取るために(とClojureのは、カスタムのリーダーマクロをサポートしていません)方式のリーダーマクロを作成したくないと仮定すると、

答えて

3

Clojureのは

(def props hash-map) 

として小道具を定義し、同様のスキームでは、あなたはどちらの言語での小道具式をevalするだけのことができます。

あなたはもう少しファンキーなものを手に入れて、キーを引用符で囲むマクロを作ることができます(キーがシンボルであると仮定して)か、それをそのままにして、キーを引用する代わりに柔軟性を増します。

+0

キーにはピリオドやその他の文字が含まれる可能性があります。信じられないことは、シンボルに許されています。 '(小道具" key1 "" value1 "" key2 "" value2 ")'は実現可能でしょうか? –

+0

はい、うまくいくでしょう。 –

0

Clojureと互換性があると仮定すると、Javaプロパティファイルをエミュレートするのに最適な構造とフォーマットは、おそらく標準のClojureマップ構文を使用することだと思います。

利点:

  • それは非常にJSONのようだ、汎用かつ柔軟なフォーマットが
  • あなただけ(read-stringまたは同様に)直接Clojureのリーダーを通してそれを読むことができます。任意のパーサーを書く必要はありません!
  • データ構造にClojureコードを含めることもできます。このコードはClojureリーダーで読み込み、コンパイルできます(ただし、これを行うとコードインジェクション攻撃に注意してください)。あなたは構文が

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

    ようなものになるだろうあなたがが)(キーとして例えば文字列をあなたが好きな任意のオブジェクトを使用することができ、それのすべての利点が

不変の永続的なデータ構造であること取得)

  • 個人的には、キーワード(つまりコロンで始まるシンボル)を使うのが最も簡単だと思います。キーワードには、信頼性の高いインターンがあり、地図からその価値を得る関数として使用できるという点で、優れた利点がいくつかあります。

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

    質問に記載されているとおり、私はJSchemeを使用します。 –

    3

    これを実行する最も簡単で最もポータブルな方法は、優れた旧式のリストS式です。書き込みにはwrite(Scheme)またはpr(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)) 
    
    関連する問題