我想在评估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")))
提前致谢。
答案 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的函数?没有参数它返回一些东西,参数返回其他东西。真的是可能性是无穷无尽的,当你考虑制作一个宏而不是一个函数时更是如此(不是我提倡的那样)。