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包装宏来实现,但可能目前不值得麻烦。

我很想知道这是否 tasarımı nedeniyle meta programlama izin verilmediği veyaImplementation nedeniyle mekanik bir kısıtlama olup olmadığını.

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=>

替换你想用的调用。之后您也可以更改文档字符串。

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=>
by
关于查询中的“验证等”部分:ALTER-META!方法有效(并且更像是基本情形而非例外情形),因为在Clojure中,你可以自由地以任何适合你的方式创建变量。事实上,Clojure提供了多个示例方法,包括defn, defrecord, defmulti等,而且远非一个封闭的集合。因此,严格来说,查找和检查文档字符串的唯一方法是对形式进行评估,然后查询Clojure环境的变量元数据。
by
哦,对了,我忘了提到那个API。真的很神奇。谢谢!
by
与主题有些脱节,但我几年前做了这个(当然,我从未使用过)https://github.com/slipset/checkdoc
...