Macros 宏:函数参数名?

Macros 宏:函数参数名?,macros,clojure,Macros,Clojure,我有一个生成函数的宏。我知道最好的做法是使用gensym来确保命名冲突不会发生。所以我想知道,对于宏将定义的函数的参数名,是否需要遵循这个原则 以下是我的宏供参考: (defmacro defroute [routename uri meths handler] `(defn ~routename [~'req] (let [req-meth# (:request-method ~'req) bad-meth# (nil? (some #(= req-

我有一个生成函数的宏。我知道最好的做法是使用gensym来确保命名冲突不会发生。所以我想知道,对于宏将定义的函数的参数名,是否需要遵循这个原则

以下是我的宏供参考:

(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
参数。我原本想知道这是否必要。无论如何,感谢阅读。

在本文中,使用
req
是相对安全的,因为它建立了一个局部范围。作为一个函数参数,它将隐藏调用名称空间中对符号req的任何现有绑定,而不会损坏它们。这样做的代价是,如果有人试图对任何其他参数(如handler)使用name req,他们可能会有点意外。在我看来,这段代码并没有错,尽管在某些情况下,它确实涉及到最少支持的原则。我看不出有任何理由不为
req
使用auto-gensym,因为这只是添加一对
s的工作。

太好了,谢谢你的解释!你说得对:附加
#
当然不需要额外的努力。