この回答を書いた後、私はClojure の分解言語をspec
次のように指定しようと思いつきました。
(require '[clojure.spec :as s])
(s/def ::binding (s/or :sym ::sym :assoc ::assoc :seq ::seq))
(s/def ::sym (s/and simple-symbol? (complement #{'&})))
順次分割部分は正規表現で簡単に指定できます (ここでは無視します) が、連想分割で行き詰まりました。最も基本的なケースは、バインド フォームからキー式へのマップです。
(s/def ::mappings (s/map-of ::binding ::s/any :conform-keys true))
しかし、Clojure にはいくつかの特別なキーも用意されています。
(s/def ::as ::sym)
(s/def ::or ::mappings)
(s/def ::ident-vec (s/coll-of ident? :kind vector?))
(s/def ::keys ::ident-vec)
(s/def ::strs ::ident-vec)
(s/def ::syms ::ident-vec)
(s/def ::opts (s/keys :opt-un [::as ::or ::keys ::strs ::syms]))
に準拠するマップ::assoc
と に準拠するマップをマージして作成できるマップの仕様を作成するにはどうすればよいですか? 私はあることを知っています:::mappings
::opts
merge
(s/def ::assoc (s/merge ::opts ::mappings))
しかし、これmerge
は基本的に の類似物であるため、機能しませんand
。に似たものを探していor
ますが、マップ用です。