Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure命名空间不可访问_Clojure_Leiningen_Read Eval Print Loop - Fatal编程技术网

Clojure命名空间不可访问

Clojure命名空间不可访问,clojure,leiningen,read-eval-print-loop,Clojure,Leiningen,Read Eval Print Loop,我试图从库“Spurous aws sdk helper”中加载两个名称空间(按照我在本地安装的方式,这是我在部署到Clojars之前对其进行的测试)。我从if语句中加载名称空间 加载名称空间后,我调用一个由加载的名称空间之一提供的函数 问题是,当通过leinringserver执行代码时,我收到一个Java异常,通知我尝试访问的名称空间不可用 但是如果我运行leinrepl,然后运行(使用'spushousicclojure example.routes.home)相关的顶级名称空间;然后(需

我试图从库“Spurous aws sdk helper”中加载两个名称空间(按照我在本地安装的方式,这是我在部署到Clojars之前对其进行的测试)。我从
if
语句中加载名称空间

加载名称空间后,我调用一个由加载的名称空间之一提供的函数

问题是,当通过
leinringserver
执行代码时,我收到一个Java异常,通知我尝试访问的名称空间不可用

但是如果我运行
leinrepl
,然后运行
(使用'spushousicclojure example.routes.home)
相关的顶级名称空间;然后
(需要'[spustouse-aws-sdk-helper.core:as core])
名称空间-就像我稍后链接到的代码中演示的那样-然后名称空间将可用,随后对函数的调用不会出错

我不确定这是否是一个误导性的错误,事实上,这不是我试图要求的名称空间,这是问题所在,而是其中的某个问题?但如果这是真的,那么当我在
lein repl
中手动调用时,它为什么会工作呢

我指的代码是:

(core/configure…
调用触发了一个Java异常,表示“core”命名空间不可用。但是从
leinrepl
运行以下代码很好

(use 'spurious-clojure-example.routes.home)
(require '[spurious-aws-sdk-helper.core :as core])
(core/configure ...rest of code...)
更新1

为了澄清,我更新了代码如下

(when (env :debug)
  (require '[spurious-aws-sdk-helper.core :as core])
  (require '[spurious-aws-sdk-helper.utils :refer [endpoint cred]])
  (core/configure
   {:s3 "test-bucket7"
    :sqs "test-queue9"
    :ddb (slurp "./resources/config/schema.yaml")}))
…在REPL中运行时,它工作正常

问题在于通过
lein-ring服务器运行它时

我已经开始在这里阅读有关
(ns resolve)
的内容:

但它建议的解决方案是:
(ns解析'core'配置)
不起作用;它只是抛出了一个
无法解析此上下文中的symbol:core
错误。

尝试了:

(when true ; also tried with false
  (require '[clojure.string :as str])
  (str/split "Clojure is awesome!" #" "))

=> No such namespace: str
我也有点惊讶,因为
if
when
应该只计算它们的表达式主体的相应分支,而不涉及其他表达式。我没想到false上会出现名称空间错误

更令人惊讶的是,我并没有料到true上也会出现名称空间错误。我猜,甚至在代码求值之前,java编译就试图解析名称空间。我不知道具体原因


至于你应该做什么,这段代码很时髦,我从来没有想过或见过有人做过类似的事情。除非有特定的原因,否则解决方案很简单:将需求推到
ns
的最顶端。无需更改任何其他内容。

我使用
lein new compojure app
创建了一个应用程序,当
:debug
值为truthy时,需要
clojure.string:as str
并将内容打印到shell中

下面的代码通过
lein-ring服务器
工作。我用
:debug
true
false
对它进行了测试。在您的示例中,您使用了
environ
,因此,我将
{:debug true}
{:debug false}
放在
.lein env

(ns integralist.handler (:require [compojure.core :refer [defroutes routes]] [ring.middleware.resource :refer [wrap-resource]] [ring.middleware.file-info :refer [wrap-file-info]] [hiccup.middleware :refer [wrap-base-url]] [compojure.handler :as handler] [compojure.route :as route] [integralist.routes.home :refer [home-routes]] [environ.core :refer [env]])) (when (env :debug) (require '[clojure.string :as str])) (when (env :debug) (defn it-works! [] (println "It works!:" (str/split "Clojure is Awesome" #" ")))) (defn init [] (println "integralist is starting") (when (env :debug) (it-works!))) (defn destroy [] (println "integralist is shutting down")) (defroutes app-routes (route/resources "/") (route/not-found "Not Found")) (def app (-> (routes home-routes app-routes) (handler/site) (wrap-base-url))) (ns integralist.handler) (:require[compojure.core:参考[defroutes]] [ring.middleware.resource:参考[wrap resource]] [ring.middleware.file-info:参考[wrap file info]] [hiccup.middleware:参考[wrap base url]] [compojure.handler:作为处理程序] [合成路线:作为路线] [integralist.routes.home:参考[home routes]] [环境核心:参考[环境]]) (何时(环境:调试) (需要“[clojure.string:as str])) (何时(环境:调试) (defn它起作用了![] (println“它有效!”:“(str/split“Clojure真棒”) (defn init[] (println“整合器正在启动”) (何时(环境:调试) (有效!)) (defn destroy[] (println“整合器正在关闭”)) (取消路线应用程序路线) (路线/资源“/) (路由/未找到“未找到”)) (def应用程序 (->(路线主页路线应用程序路线) (处理人/现场) (换行基本url)))
是否确实设置了
~/.lein/profiles.clj
以使
(env:debug)
返回
true
?请注意,您在
内容中使用了
cred
。除非<代码>调试< /COD> Profile打开,否则它将不可用。@死鬼非常好的点关于<代码> CRED<代码>,这将是一个单独的问题,我需要考虑之后进行修复(很可能是<代码> UTIL/COD>命名空间,我将显式加载;因为我需要这个功能,不管配置文件如何)。.如果我在expr时将str/split expr放在外部,它就会工作。(do(如果为true,也可以使用false)(要求“[clojure.string:as str]))(str/split“clojure太棒了!”。可能是因为ns解析发生在每个表达式上。@deadghost感谢您的反馈。只是想澄清一下:如果应用程序在生产环境中,我想避免
要求
使用助手库-即助手库仅用于开发。@deadghost我在问题的底部添加了一个更新,该更新澄清了我所做的一些更改,并试图使用
ns resolve
(这不起作用)@Integralist在开发过程中只需
要求
使用helper库,你会得到什么?@deadghost我认为它会稍微有点性能,或者这只是胡说八道?因为Clojure实际上是一种编译语言(例如编译到可部署的jar中),所以我需要以不同的方式来考虑类似的事情(与Ruby这样的脚本语言相比)。但我仍然认为最好是明确的,让代码强调一个特定的库只在开发中使用,而不是直接加载它而不做任何解释(但这是正确的)
(ns integralist.handler
      (:require [compojure.core :refer [defroutes routes]]
                [ring.middleware.resource :refer [wrap-resource]]
                [ring.middleware.file-info :refer [wrap-file-info]]
                [hiccup.middleware :refer [wrap-base-url]]
                [compojure.handler :as handler]
                [compojure.route :as route]
                [integralist.routes.home :refer [home-routes]]
                [environ.core :refer [env]]))

    (when (env :debug)
      (require '[clojure.string :as str]))

    (when (env :debug)
      (defn it-works! []
        (println "It works!:" (str/split "Clojure is Awesome" #" "))))

    (defn init []
      (println "integralist is starting")
      (when (env :debug)
        (it-works!)))

    (defn destroy []
      (println "integralist is shutting down"))

    (defroutes app-routes
      (route/resources "/")
      (route/not-found "Not Found"))

    (def app
      (-> (routes home-routes app-routes)
          (handler/site)
          (wrap-base-url)))