(:gen-class)和完全合格的符号

时间:2018-01-13 22:59:14

标签: clojure namespaces symbols

我想知道为什么我需要包含(:gen-class)从其他ns访问导入的函数而不完全限定它们。

示例:

(ns project.core
  (:gen-class))
(defn foo [] "foo")

(ns project.core-test
  (:gen-class)
  (:require [project.core :refer :all]))  
(foo) ;=> "foo"
(ns project.core)
(defn foo [] "foo")

(ns project.core-test
  (:require [project.core :refer :all]))  
(foo) ;=> ComplilerException java.lang.RuntimeException: Unable to resolve symbol: foo in this context
(project.core/foo) ;=> "foo"

我无法理解这个概念。

编辑:

我在要求表格中输了一个错字。 Idk为什么(:gen-class)解决了这个问题,但现在该项目再次运作。

1 个答案:

答案 0 :(得分:1)

(:gen-class)表单中的ns子句用于Ahead-of-Time编译(AOT)。见https://clojure.org/reference/compilation

您的设置中必须出现其他问题。我的例子:

> d **/core*
-rw-rw-r-- 1 alan alan 98 Jan 13 16:15 src/fred/core.clj
-rw-rw-r-- 1 alan alan 47 Jan 13 16:15 src/tst/fred/core.clj

src/fred/core.clj
------------------------
(ns fred.core)

(defn foo [] (println "foo you"))

(defn -main []
  (println "main - enter")
  )


src/tst/fred/core.clj
----------------------
(ns tst.fred.core
  (:use fred.core ))

(foo)

> lein test
foo you 

我使用require版本得到了相同的结果:

(ns tst.fred.core
  (:require [fred.core :refer :all]))
(foo)

如果我将代码粘贴到repl:

,它也可以
~/tmp/fred > lein repl
Clojure 1.9.0

fred.core=> (ns project.core)
nil
project.core=> (defn foo [] "foo")
#'project.core/foo

project.core=> (ns project.core-test
          #_=>   (:require [project.core :refer :all]))  
nil
project.core-test=> (foo)
"foo"