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
Map 从clojure映射中的动态键获取值_Map_Clojure - Fatal编程技术网

Map 从clojure映射中的动态键获取值

Map 从clojure映射中的动态键获取值,map,clojure,Map,Clojure,我有一张clojure地图 + 69 (def names {:production "prayag" + 70 :staging "upd"}) 我需要从一个关键变量环境中获取一个动态值 类似下面的东西抛出异常 + 72 (defn get-name [environment]

我有一张clojure地图

+  69 (def names {:production "prayag"                                                                     
+  70             :staging    "upd"})  
我需要从一个关键变量
环境
中获取一个动态值

类似下面的东西抛出异常

+  72 (defn get-name [environment]                                                                                   
+  73   (let [ 
+  74        name (:(environment) names)]                                                                 
+  75        println name                                                                           
+  76     ))    
堆栈跟踪

Caused by: java.lang.RuntimeException: Invalid token: :
    at clojure.lang.Util.runtimeException(Util.java:219)
    at clojure.lang.LispReader.interpretToken(LispReader.java:326)
    at clojure.lang.LispReader.read(LispReader.java:211)
    at clojure.lang.LispReader.readDelimitedList(LispReader.java:1157)
    at clojure.lang.LispReader$ListReader.invoke(LispReader.java:982)
    at clojure.lang.LispReader.readDelimitedList(LispReader.java:1148)
    at clojure.lang.LispReader$VectorReader.invoke(LispReader.java:1083)
    at clojure.lang.LispReader.readDelimitedList(LispReader.java:1148)
    at clojure.lang.LispReader$ListReader.invoke(LispReader.java:982)
    at clojure.lang.LispReader.readDelimitedList(LispReader.java:1148)
    at clojure.lang.LispReader$ListReader.invoke(LispReader.java:982)
    at clojure.lang.LispReader.read(LispReader.java:185)
    at clojure.lang.Compiler.load(Compiler.java:7060)
    ... 55 more
在遵循代码的同时

+  72 (defn get-name [env]                                                                                    
+  73   (let [                                                                               
+  74        name (keyword(":" env) names)]                                                                                                   
+  75        println name                                                                           
+  76     ))  
给予

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn
    at nepleaks_engine.util.utility$fn__3885.invoke(utility.clj:74)
    at clojure.lang.AFn.applyToHelper(AFn.java:159)
    at clojure.lang.AFn.applyTo(AFn.java:151)
    at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3458)
    ... 58 more
+  72 (defn get-name [env]                                                                                    
+  73   (let [                                                                              
+  74        name (.get names env)]                                                               
+  75        println name                                                                           
+  76     ))  

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn
    at nepleaks_engine.util.utility$fn__3885.invoke(utility.clj:74)
    at clojure.lang.AFn.applyToHelper(AFn.java:159)
    at clojure.lang.AFn.applyTo(AFn.java:151)
    at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3458)
    ... 58 more
+  72 (defn get-name [env]                                                                                    
+  73   (let [                                                                              
+  74        name (.get names env)]                                                               
+  75        println name                                                                           
+  76     ))  
给予

java.lang.NullPointerException
    at nepleaks_engine.util.utility$util.invoke(utility.clj:81)
    at nepleaks_engine.core$_main.invoke(core.clj:14)
    at clojure.lang.Var.invoke(Var.java:411)
    at user$eval5$fn__7.invoke(form-init336568295343421746.clj:1)
    at user$eval5.invoke(form-init336568295343421746.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6619)
    at clojure.lang.Compiler.eval(Compiler.java:6609)
    at clojure.lang.Compiler.load(Compiler.java:7064)
    at clojure.lang.Compiler.loadFile(Compiler.java:7020)
    at clojure.main$load_script.invoke(main.clj:294)
    at clojure.main$init_opt.invoke(main.clj:299)
    at clojure.main$initialize.invoke(main.clj:327)
    at clojure.main$null_opt.invoke(main.clj:362)
    at clojure.main$main.doInvoke(main.clj:440)
    at clojure.lang.RestFn.invoke(RestFn.java:421)
    at clojure.lang.Var.invoke(Var.java:419)
    at clojure.lang.AFn.applyToHelper(AFn.java:163)
    at clojure.lang.Var.applyTo(Var.java:532)
    at clojure.main.main(main.java:37)
(:(环境)名称)
不是有效的表单。除非
environment
是一个没有参数的函数,否则将其包装到参数中会出现错误。使用
创建关键字是在读取时完成的,在计算
(环境)
之前,因此您看不到前面的错误,并且读取器尝试自行解决
,这不是读取器的有效输入

(关键字(“:”env)name)
尝试调用字符串“:”就好像它是一个函数一样。它不是一个。此外,间距使我相信,您希望
关键字(arg)
能够像在Algol家族语言中一样工作。不会的。正确的用法是
(关键字arg)

以下是有效的方法,为方便起见,提供了一些等价的语法(它们都做相同的事情):


环境在何处以及如何定义?假设它类似于
(def environroment:production)
,那么您可以执行
(让[name(environment names)])
。请记住,如果名称不是函数或符号,它将引发异常。您还可以执行
(names-environment)
,这可能会返回nil而不是引发异常。