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=>
关于查询的“验证此类”部分:alter-meta!的方法是可行的(它更像是一种基本案例而不是特殊情况),因为Clojure中你可以自由地以任何方式建立变量。确实,Clojure提供了多种方法作为示例,包括defn、defrecord、defmulti等,绝对不是封闭的集合。因此,严格来说,寻找和检查文档字符串的唯一方法是对形式进行评估,然后查询Clojure环境中的变量元数据。
哦,对了,我忘了提及那个API。真的很惊艳。谢谢!
稍微偏题一点,但我多年前做了这个玩意儿(当然我从未使用过)https://github.com/slipset/checkdoc
...