繁体   English   中英

动态let形式作为宏中reify的一部分

[英]Dynamic let form as part of reify within a macro

好的,让我们尝试直截了当:我的最终目的是向用户提供一个宏作为API,如下所示:

(defscript [a b]
  (println a))

结果必须是Script协议的实例,看起来像:

(defprotocol Script
  (run [this model]))

想法是defscript的第一个参数是需要绑定到model相应键的符号列表:

(.run (defscript [a b] (println a)) {:a 1}) ;; yields 1

我无法提出任何可以有效产生这种效果的代码,因为在尝试使用model参数时,我经常碰壁,因为在宏扩展时,它只是一个符号:

(defmacro invoke-
  [params model body]
  (let [p (flatten (map (fn [x] [x (model (keyword x))]) params))]
    `(let [~@p]
       ~body)))

(defmacro defscript
  [params & body]
  `(reify Script
    (run [~'this ~'model]
      (invoke- ~params ~'model ~@body))))

如果直接调用, invoke-效果很好:

(invoke- [a] {:a 1} (println a)) ;; prints 1

但是在defscript使用时defscript因为无法正确扩展model

(.run (defscript [a] (println a)) {:a 1}) ;; prints nil

我如何才能超越这一点并将各个部分粘合在一起?

看起来,基本上,您的参数向量是解构绑定的捷径:

(defscript [a b] body)  -> (reify Script (run [this {:keys [a b]}] body))

这样,就可以在运行时对模型进行解构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM