我该如何评估"符号"和"(符号1)"同名?

时间:2014-04-17 11:58:58

标签: clojure

我想在评估edit-url(edit-url 1)时获得以下结果。

edit-url     --> "/articles/:id/edit"
(edit-url 1) --> "/articles/1/edit"

是否可以定义这样的Var或什么?
现在,我使用以下函数,但我不想写(edit-url)来获取const字符串。

(defn edit-url ([] "/articles/:id/edit") ([id] (str "/articles/" id "/edit")))

提前致谢。

3 个答案:

答案 0 :(得分:2)

如果这些行为完全符合您的要求,可以使用print-method和tagged literals来模仿它们。

(defrecord Path [path]
  clojure.lang.IFn
  (invoke [this n]
    (clojure.string/replace path ":id" (str n))))

(defmethod print-method Path [o ^java.io.Writer w]
  (.write w (str "#path\"" (:path o) "\"")))

(set! *data-readers* (assoc *data-readers* 'path ->Path))

(comment

  user=> (def p #path"/articles/:id/edit")
  #'user/p
  user=> p
  #path"/articles/:id/edit"
  user=> (p 1)
  "/articles/1/edit"
  user=>

)

答案 1 :(得分:1)

edit-url将具有不可变字符串或函数的值。不是都。

当您编写具有更好抽象的函数时,问题将会消失,该函数将字符串和关键字映射替换为单词。它应该像这样工作

(generate-url "/articles/:id/edit" {:id 1})

答案 2 :(得分:1)

Clojure是一个" Lisp 1"这意味着所有符号都有一个名称空间,包括数据标量和函数。您所写的内容显示了字符串和函数的功能,但是对于单个名称,您可以在Common Lisp中执行但不能执行Clojure(不是" Lisp 2"也有其自身的不便)

一般来说,这类"问题"如果你更好地组织你的变量,这是一个非问题。为什么不让edit-url成为具有变量arity的函数?没有参数它返回一些东西,参数返回其他东西。真的是可能性是无穷无尽的,当你考虑制作一个宏而不是一个函数时更是如此(不是我提倡的那样)。