4

with-out-strから文字列値を取得するために使用できます(doc func)

=> (with-out-str (doc first))
"-------------------------\nclojure.core/first\n([coll])\n  Returns the first item in the collection. Calls seq on its\n    argument. If coll is nil, returns nil.\n"    

ただし、関数のコレクションで同じことをしようとすると、それぞれに対して空の文字列しか返されません。

=> (map #(with-out-str (doc %)) [first rest])
("" "")

ここでどこが間違っていますか?

4

1 に答える 1

6

残念ながらdocはマクロであり、高階関数として使用できないため、clojure のファースト クラス シチズンではありません。

user> (doc doc)
-------------------------
clojure.repl/doc
([name])
Macro
  Prints documentation for a var or special form given its name 

表示されているのは、ドキュメントを%2 回検索した結果です。

user> (doc %)
nil

user> (with-out-str (doc %))
""

doc への呼び出しは、(実行時に) map への呼び出しが実行される前に、マクロ展開時間中に実行を終了したためです。varただし、関数を含む のメタデータからドキュメント文字列を直接取得できます。

user> (map #(:doc (meta (resolve %))) '[first rest])
("Returns the first item in the collection. Calls seq on its\n    argument. If coll is nil, returns nil." 
 "Returns a possibly empty seq of the items after the first. Calls seq on its\n  argument.")
于 2013-09-03T18:42:50.040 に答える