clojure - ( :gen-class) and fully qualified symbol

标签 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"
我无法理解这个概念。
编辑:
我在 require 表单中有一个错字。不知道为什么 (:gen-class) 解决了这个问题,但现在该项目又可以正常工作了。

最佳答案

(:gen-class) ns中的条款表单用于提前编译 (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"

关于clojure - ( :gen-class) and fully qualified symbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48245080/

相关文章:

objective-c - 库和项目中类的重复符号

Clojure db-do-prepared 调用多个参数

macos - Clojure 跷跷板应用程序 : How to change menubar title from "main"

python - python中子命名空间的节俭使用

c# - 如何访问此 XML 字段?

java - 发现符号的路径

clojure - 如何在 clojurescript 中使用 clojure.string/join

clojure - 如何将HugSQL参数扩展为多个like语句

使用命名空间找不到 PHP 类

python - 如何添加一个可以被 Python 编译器绑定(bind)的全局符号?