Wie kann ich eine Hybridkarte angeben?

8

Nachdem ich diese Antwort geschrieben habe, wurde ich inspiriert, Clojures Destrukturierungssprache mit spec :

%Vor%

Der sequentielle Destrukturierungsteil ist mit einem Regex einfach zu spezifizieren (daher ignoriere ich ihn hier), aber ich bin bei der assoziativen Destrukturierung steckengeblieben. Der einfachste Fall ist eine Zuordnung von Bindungsformularen zu Schlüsselausdrücken:

%Vor%

Aber Clojure bietet auch mehrere spezielle Schlüssel:

%Vor%

Wie kann ich eine ::assoc -Spezifikation für Maps erstellen, die erstellt werden können, indem eine Map, die mit ::mappings übereinstimmt, und eine Map, die ::opts entspricht, zusammengeführt werden? Ich weiß, dass merge :

%Vor%

Aber das funktioniert nicht, weil merge im Grunde ein Analogon von and . Ich suche nach etwas, das zu or , aber für Karten.

    
Sam Estep 01.07.2016, 18:00
quelle

2 Antworten

4

Sie können Hybridkarten mit einem s/merge von s/keys und s/every der Karte als Tupel angeben. Hier ist ein einfacheres Beispiel:

%Vor%

Diese einfachere Formulierung hat mehrere Vorteile gegenüber einem Konformeransatz. Am wichtigsten ist, dass es die Wahrheit sagt. Darüber hinaus sollte es ohne weitere Anstrengungen generieren, anpassen und entformen.

    
Alex Miller 11.08.2016, 20:12
quelle
1

Sie können s/conformer als Zwischenschritt in s/and verwenden, um Ihre Map in das einfach zu validierende Formular umzuwandeln:

%Vor%

Das bringt Sie von z.B.

%Vor%

bis

%Vor%     
Nikita Prokopov 05.07.2016 14:45
quelle