-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)
それを実行します:
レインラン