我有一个产生函数的宏。我知道最好的做法是使用 gensyms 来确保不会发生命名冲突。所以我想知道对于宏将定义的函数的参数名称是否需要遵循这个原则?
这是我的宏供参考:
(defmacro defroute
[routename uri meths handler]
`(defn ~routename
[~'req]
(let [req-meth# (:request-method ~'req)
bad-meth# (nil? (some #(= req-meth# %) ~meths))
any-meth# (= ~meths [:any])]
(if (:uri ~'req)
(if (and (route-matches ~uri ~'req) (and bad-meth# (not any-meth#)))
(method-not-allowed req-meth# (get-allowed ~meths))
(let [params# (route-matches ~uri ~'req)]
(if (nil? params#)
~'req
(~handler (assoc ~'req :route-params params#)))))
~'req))))
如您所见,我目前没有使用 gensym 作为req
参数。我最初然后想知道是否有必要。无论如何,感谢您的阅读。