gpt4 book ai didi

namespaces - 我如何使宏可用于 Clojure 中的加载文件?

转载 作者:行者123 更新时间:2023-12-01 05:42:39 24 4
gpt4 key购买 nike

假设您有以下代码:

(ns foo)

(defmacro defproject [project-name version & args]
...
)

(defn read-project ([file]
(load-file file)))

更新 :完整代码可以在 https://github.com/derkork/intellij-leiningen-plugin/blob/master/src/de/janthomae/leiningenplugin/leiningen/LeiningenProjectFile.clj 找到

现在我在具有以下内容的文件“project.clj”上调用 read-project :
(defproject de.janthomae/leiningenplugin "1.0.0-SNAPSHOT"
...
)

我收到以下错误消息
java.lang.Exception: Unable to resolve symbol: defproject in this context (project.clj:1)
at clojure.lang.Compiler.analyze(Compiler.java:4420)
at clojure.lang.Compiler.analyze(Compiler.java:4366)
at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:2828)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:4594)
at clojure.lang.Compiler.analyze(Compiler.java:4405)
at clojure.lang.Compiler.analyze(Compiler.java:4366)

这告诉我它没有找到我的 defproject 宏。我完全不知道为什么会这样,因为宏是在前面几行定义的。我是否需要以某种方式导出它以便可以从使用加载文件加载的文件中看到它?

最佳答案

project.clj 确实不知道在哪里寻找 foo/defproject。所以如果你在 repl,你可以做

user> (in-ns 'foo)
foo> (read-project "project.clj")

这将在定义 defproject 的 foo 命名空间内运行来自 project.clj 的代码。或者您可以将 (in-ns 'foo) 放在 project.clj 中。结果将是相同的。

但是你也可以在 project.clj 中写这样的东西:
(foo/defproject ...)

这将在您运行时调用当前命名空间内的 defproject (foo/read-project "project.clj")。

更新

来自 test_uberjar.clj:
(def project (binding [*ns* (the-ns 'leiningen.core)]
(read-project "test_projects/sample_no_aot/project.clj")))

来自 test_deps.clj:
(:use [leiningen.core :only [read-project defproject]] ...)

因此,在执行加载文件时,defproject 始终可用。

关于namespaces - 我如何使宏可用于 Clojure 中的加载文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4426999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com