0

私はcore.cljを使用してLeiningen経由で作成したプロジェクトを作成しました。

(ns cotd.core
  (:gen-class)
  (:use [clojure.repl :only (doc)]))

(defmacro eval-doc
  [form]
  (let [resulting-symbol (eval form)]
    `(doc ~resulting-symbol)))

(defn- random-function-name []
  (rand-nth (keys (ns-publics 'clojure.core))))

(defn -main
  "Display random doc page"
  [& args]
  (eval-doc (random-function-name)))

そして、コンパイルして実行した後は、常に同じ結果が得られます。

$ java -jar cotd.jar
-------------------------
clojure.core/unchecked-negate
([x])
  Returns the negation of x, a long.
  Note - uses a primitive operator subject to overflow.
$ java -jar cotd.jar
-------------------------
clojure.core/unchecked-negate
([x])
  Returns the negation of x, a long.
  Note - uses a primitive operator subject to overflow.

しかし、2つの連続した呼び出しで:

(do
  (eval-doc (random-function-name))
  (eval-doc (random-function-name))))

1回の「呼び出し」で2つの異なる結果が得られます。

私が試したのはグーグルや読書などですが、何が起こっているのかわかりません...

このrand-nthを動的に呼び出す方法は?

4

1 に答える 1

2

問題は rand-nth ではなく、let ステートメントの結果のシンボルがコンパイル フェーズで生成されるためです。@beyamor はここで回答を提供しました:名前空間からランダム (ドキュメント) を取得できません

于 2012-11-25T22:35:27.413 に答える