2017-10-11 2 views
0

階層的なデータセットを検証するために使用される一連の仕様 - たとえばyamlファイルがある場合。子の仕様の1つでは、ツリーの早い段階で発生するデータを参照することは可能ですか?階層仕様のデータにアクセスするClojure仕様

+0

具体的な例がありますか?一般的に言えば、内部/ネストされた仕様は先祖のデータを受け取ることはありませんが、外部仕様で問題を解決できる可能性があります。 –

+0

私は複雑なデータ構造を表すyamlを検証したいと思っています。私が証明したい検証ポイントは、構造体の一部が同じ構造体の別の部分を参照しているところですが、参照される部分が実際に存在することを証明したいと思います。これは、参照ポイントで述語を適用しようとしていることを意味し、yamlツリーを追跡して戻って参照アイテムのポイントまで戻ってきます。これを行うには、参照を検証する仕様の親を取得する必要があります。 – mmer

+0

あなたのためにいくつかのコードを書きたいと思うようです。多くのユーザーは、苦労しているコーダーのコードを作成したいと考えていますが、通常、ポスターが既に問題を解決しようとしているときにのみ役立ちます。この努力を実証する良い方法は、これまでに書いたコード、サンプル入力(もしあれば)、予想される出力、実際に得られる出力(コンソール出力、トレースバックなど)を含めることです。あなたが提供する詳細があれば、受け取る可能性のある回答が増えます。 [FAQ]と[ask]を確認してください。 –

答えて

0

これは、あなたが取ることができる一つのアプローチの例である:

(s/def ::tag string?) 

(s/def ::inner (s/keys :req-un [::tag])) 

(s/def ::outer 
    (s/and 
    (s/keys :req-un [::inner ::tag]) 
    #(= (:tag %) ;; this tag must equal inner tag 
     (:tag (:inner %))))) 

(s/conform ::outer {:tag "y" ;; inner doesn't match outer 
        :inner {:tag "x"}}) 
;=> :clojure.spec.alpha/invalid 

(s/conform ::outer {:tag "x" 
        :inner {:tag "x"}}) 
;=> {:tag "x", :inner {:tag "x"}} 

要件に応じて、あなたは外ではなく、インサイドアウトから、このようなあなたの主張を作ることができるかもしれません。

+0

本当に便利な答えをありがとう – mmer