2024 年 Clojure 现状调查问卷!中分享您的想法。

欢迎!请见关于页面,了解此功能的工作方式。

0
语法和读取器

我很好奇是否可以像以下这样定义一个函数

(defn my-cli-func
  (docstr 
    :description "Some CLI function with complex args to do something cool"
    [["-p" "--port" :port "Port to listen for connections on"]])
  [args]
  "...")

目的是让 docstr 在一致格式的文档字符串中生成,以便我进行验证等。但是,我没有按预期工作,因为出现了一个错误,提示参数声明应该在哪里。

我猜可以通过一个 defn 包装宏来实现,但现在可能不值得费这个劲。

我很好奇是否有设计决策不允许在那一部分进行元编程,或者是由于实现的一些机械限制导致的。

1 个答案

+1

已选定
 
最佳答案
 ~ % clj
Clojure 1.10.1
user=> (defn ^{:doc (str "foo" "bar")} f [x] x)
#'user/f
user=> (doc f)
-------------------------
user/f
([x])
  foobar
nil
user=>

将 str 的调用替换为您想要的。您还可以在事后更改文档字符串。

user=> (alter-meta! #'f assoc :doc "something")
{:doc "something", :arglists ([x]), :line 1, :column 1, :file "NO_SOURCE_PATH", :name f, :ns #object[clojure.lang.Namespace 0x72ba28ee "user"]}
user=> (doc f)
-------------------------
user/f
([x])
  something
nil
user=>
关于查询中“验证和其他”部分: altered-meta! 方法是可行的(这实际上更像是一种基础案例而非例外情况),因为在Clojure中,您可以自由地以任何合适的方式创建变量。事实上,Clojure提供了多种方法作为例子,包括defn、defrecord、defmulti等,绝对不会是一个封闭集合。因此,严格来说,找到并检查doc字符串的唯一方法是对形式进行求值,然后查询Clojure环境中的变量元数据。
by
哦,对了,我忘了那个API。这真的很神奇。谢谢!
by
题外话,我在几年前做过这个(当然,我从未使用过)https://github.com/slipset/checkdoc
...