4

-main とその名前空間の設定を理解しようとしています。-main 関数のデフォルトの名前空間は「ユーザー」のようですが、同じファイル内でメイン関数の「上」に定義された関数を呼び出すことができます。彼らは言及されていますか?私は調べるためにこれを実行していました:

(ns ack.doodle)

(defn fo [] "bar")

(defn -main [& args]
  (println (fo))                               ;; bar
  (println *ns*)                               ;; #<Namespace user>
  (println (get (ns-refers *ns*) 'sorted-map)) ;; #'clojure.core/sorted-map
  (println (get (ns-refers *ns*) 'fo))         ;; nil
  (println (get (ns-map *ns*) 'fo))            ;; nil
  (println (get (ns-publics *ns*) 'fo))        ;; nil
  (println (get (ns-interns *ns*) 'fo))        ;; nil
  (println (get (ns-aliases *ns*) 'fo))        ;; nil
  (println (ns-resolve *ns* 'fo)))             ;; nil

呼び出し (fo) は成功しますが、シンボル 'fo は現在の名前空間 *ns* で認識されていないようです。どうしたの?

この問題は、一部の関数の名前をいくつかの引数とともにコマンドライン引数として -main に渡そうとしたときに発生しました。

再現する手順

  • 上記のコードをファイル ./src/ack/doodle.clj に貼り付けます
  • 次の内容で ./project.clj を作成します。

    (defproject ack "1" :main ack.doodle)

  • それを実行します:

    レインラン

4

2 に答える 2

0

昨夜 #clojure でこれに答えなかったのですか? 答えに不満がある場合は、質問を明確にする必要があります。

于 2012-04-22T22:50:20.737 に答える
0

leiningen は、(ack.doodle/-main) のようにユーザー名前空間から呼び出して (-main) を実行しているようです。したがって、*ns* はユーザー名前空間にバインドされます。

プロジェクトルートで lein repl を実行してみてください。次に (-main) を実行して、何が起こるか見てみましょう。:)

于 2012-04-22T11:46:17.783 に答える