Я пытаюсь понять настройки -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
- #P4# <блочная цитата> #P5# блочная цитата>
- #P6# <блочная цитата> #P7# блочная цитата>