構造化を使用して let 形式に展開するマクロを作成しようとしています。私の問題は、構造化解除によって取得されたものを含め、let 形式で定義されているシンボルのリストが必要なことです。
使用事例
たとえば、検証のために、この種の動作を除外しようとしています:
(let [a (foo bar)
{x :x,
y :y,
{u :u, v: v :as nested-map} :nested} some-map]
(and x y nested-map u v ; testing truthiness
(valid-a? a)
(valid-x? x)
(valid-y? y)
(valid-nested? nested-map)
(valid-u-and-v? u v)
))
提案された解決策
次のように呼び出すことができるある種のand-letマクロを使用してこれを実現できれば、非常に便利です。
(and-let [a (foo bar)
{x :x,
y :y,
{u :u, v: v :as nested-map} :nested} some-map]
(valid-a? a)
(valid-x? x)
(valid-nested? nested-map)
(valid-u-and-v? u v))
私が欠けているもの
しかし、let フォームにバインドされているシンボルのリストにアクセスする方法がありません。関数のようなものがあれば、次のようにするlist-bound-symbolsことができます。
(defmacro and-let
"Expands to an AND close that previouly checks that the values declared in bindings are truthy, followed by the tests."
[bindings & tests]
(let [bound-symbols (list-bound-symbols bindings) ;; what I'm missing
]
`(let ~bindings
(and
~@bound-symbols
~@tests)
)))
誰も私がこれを行う方法の手がかりを持っていますか?