0

明らかに、Clojure の Github ページにアクセスしたり、Maven リポジトリを参照したりできます。これは、文字通りソース コードを取得することに関する問題ではありません。

名前空間で定義されているトップ レベルのフォームをすべてプログラムで取得したいと考えています。何かのようなもの

(get-top-level-forms-of 'clojure.zip)

=>

['(ns ^{:doc "Functional hierarchical zipper, with navigation, editing,
  and enumeration.  See Huet"
       :author "Rich Hickey"}
  clojure.zip
  (:refer-clojure :exclude (replace remove next)))

 '(defn zipper
  "Creates a new zipper structure. 

  branch? is a fn that, given a node, returns true if can have
  children, even if it currently doesn't.

  children is a fn that, given a branch node, returns a seq of its
  children.

  make-node is a fn that, given an existing node and a seq of
  children, returns a new branch node with the supplied children.
  root is the root node."
  {:added "1.0"}
  [branch? children make-node root]
    ^{:zip/branch? branch? :zip/children children :zip/make-node make-node}
    [root nil])

 '(defn seq-zip
  "Returns a zipper for nested sequences, given a root sequence"
  {:added "1.0"}
  [root]
    (zipper seq?
            identity 
 .....__ALL_THE_REST_OF_THE_FORMS_IN_clojure.zip_....]

基本的に、定義された順序で、名前空間内のすべてのフォームの順序付けられたシーケンスを取得するだけです。これは可能ですか?

4

2 に答える 2

2

clojure.zipこれにより、Clojure jar 内にバンドルされているソースのコピーからトップレベルのフォームが抽出されます。

(require '[clojure.java.io :as io])

(let [rdr (clojure.lang.LineNumberingPushbackReader.
           (io/reader (io/resource "clojure/zip.clj")))
      sentinel (Object.)]
  (take-while #(not (identical? sentinel %))
              (repeatedly #(read rdr false sentinel))))
;= ((ns clojure.zip (:refer-clojure :exclude (replace remove next))) ...)
于 2013-10-07T07:21:31.523 に答える
0

それは仕事をするはずです:

(keys (ns-publics 'clojure.zip))

どちらが返されますか:

(lefts down insert-left up next path children vector-zip append-child zipper branch? end? leftmost edit replace insert-right root insert-child prev seq-zip xml-zip make-node rights node right left remove rightmost)

その他の ns-* 関数は名前空間ページにあります。

于 2013-10-07T05:57:16.460 に答える