8

Noir宏给我带来了defpage一些麻烦。我正在尝试构建与此类似的调用:

(defpage [:post "some/url"] [data]
  ;; some stuff...
  )

但是,:post我不想使用关键字,而是使用变量,如下所示:

(def my-method :post)
(defpage [my-method "some/url"] [data]
  ;; some stuff...
  )

问题是,当宏展开时,它想解析命名空间my-method中的变量compojure.core而不是我自己的变量,这给了我错误:

No such var: compojure.core/MY-METHOD

在当前情况下如何强制my-method解决?

4

4 回答 4

1

如果我们查看 noir/core.clj 文件(source),找到 parse-route 函数并推断它使用它的方法参数做了什么(在那里称为 action),我们可以发现方法关键字被转换为字符串,大写并解析在 compojure.core 命名空间中。所有这些都是在宏扩展期间完成的。因此,在不更改黑色代码的情况下,不可能使用变量代替关键字。

于 2011-12-04T09:02:53.527 回答
1

看来,noir 不应该以这种方式使用,因为它采用方法参数并将其转换为符号compojure.core(参见https://github.com/ibdknox/noir/blob/master/src/noir/core .clj#L36)。这意味着,它不希望在这个地方有一个变量,只有文字。所以我认为你对此无能为力,除了将问题发布到黑色......

于 2011-12-04T08:52:37.637 回答
1

我想这是一个类似的问题:如何将 clojure 的 doc 函数应用于一系列函数 宏可以使用它的 args 为所欲为,因此传入一个裸符号可能会导致不可预测的结果。

一种解决它的方法,但它并不漂亮:

(eval (list 'defpage (vector my-method "some/url") '[data]
  ; some stuff
))

请注意,这里的 my-method 不是文字,因此在进入 eval 之前,它首先在我们自己的命名空间中解析和评估。

于 2011-12-04T08:54:29.093 回答
0

将 my-method 与它所在的命名空间一起传递怎么样:

(defpage [myns/my-method "some/url"] [data]
;;
)
于 2011-12-04T08:51:15.737 回答